當前位置:編程學習大全網 - 源碼下載 - lua 怎麽反編譯

lua 怎麽反編譯

lua源文件--obfuscate-->lua源文件(混淆後)--compile-->luac文件(帶調試用的變量名和行號)--strip-->luac文件(不帶調試信息)

lua/luac--加密/打包-->數據文件

數據文件--解包/解密-->lua/luac-->lua虛擬機

1. 跟蹤,脫殼,解包,解密,獲得 luac

追 luaL_loadbuffer luaL_loadfile lua_load 應該可以找到 解密函數。

hook 這3個函數,導出解密後的數據,直接就是 luac 文件。如果沒編譯甚至是 lua源文件。

hook luaV_execute 可以拿到 Proto* ,想辦法用 luaU_dump 導出。luaD_precall 應該沒必要搞。

2. 非標準 luac 處理

我們有兩種方案來處理得到的 luac

1. 得到壹個能夠執行上述非標 luac 的 lua 版本

搞清楚編譯方式,改 lua 源文件,編譯出壹個,這樣做什麽都可以,還能編譯出對應的 luadec 。

如果能找到 lua51.dll 之類的就直接調用吧。但是,只能用於導出 luac 對比文件格式,或者執行找到的幾個關鍵函數。

2. 將非標 luac 轉換成標準格式 luac,正所謂:山不來就我,我便去就山

非標準 luac 是怎麽做的:

1. bad header 改文件頭

#define LUA_SIGNATURE "\033Lua" // lua.h

2. bad header 改數據類型

// luaconf.h

#define LUA_NUMBER_DOUBLE

#define LUA_NUMBER double

LUA_NUMBER to float

LUA_NUMBER_SCAN to "%f"

LUA_NUMBER_FMT to "%.7g"

l_mathop(x) to (x##f)

lua_str2number to use strtof

3. bad code OpCode 重定義

// 改有 "ORDER OP" 的地方

/* grep "ORDER OP" if you change these enums */

enum OpCode; // lopcodes.h

const lu_byte luaP_opmodes[]; // lopcodes.c

const char *const luaP_opnames[]; // lopcodes.c

http://lua-users.org/wiki/CnumberPatch

生成壹個被破解程序可以執行的 luac 文件用於對比,分析格式

想辦法執行下面的代碼,編譯 allopcodes.lua 並導出, 與標準 lua 編譯相同源文件生成的進行對比。

1. 在 C 內導出

lua_State* L = luaL_newstate();

luaL_loadbuffer or luaL_loadstring or luaL_loadfile

Closure* c=(Closure*)lua_topointer(L, -1);

Proto* f = c->l.p;//Closure如果改了偏移會不同

luaU_dump(L, f, writer, D, 0);//非導出函數

lua_close(L);

2. 用 lua 導出到文件或者string

lua_State* L = luaL_newstate();

luaopen_string(L);

luaopen_io(L);

luaL_dostring or luaL_dofile

char* str = lua_tostring(L, -1);

lua_close(L);

-- luaopen_string 此庫必須打開

allopcodes() allopcodes.lua文件內容 end

chunk = string.dump(allopcodes)

if luaopen_io then --如果 io 可用,則可以直接寫文件

file:write(chunk)

else

output(chunk,to_any_where) --想辦法把 chunk 搞出來

return chunk

end

3. 字節碼反匯編,閱讀

4. 反編譯

5. 二進制編輯,修改指令,替換函數

  • 上一篇:除了《王者榮耀》外,現階段還有哪些比較好玩的手遊 ?
  • 下一篇:義馬到周口多遠多少公裏:349公裏。
  • copyright 2024編程學習大全網