A. 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_mp 導出。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
B. lua加密演算法
functionEcrypt(Text)
returnText:gsub('.',function(c)returnstring.format("%02X",(string.byte(c)+13)%256)end):gsub("","+")
end
functiondecrypt(code)
returncode:gsub('..',function(h)
returnstring.char((tonumber(h,16)+256-13)%256)
end)
end
c=Ecrypt("hello")
print(decrypt(c))
hello5
C. cocos2dx 用luajit 加密腳本 會被反編譯嗎
1、新建一個名為1.lua的文件,裡面只有一句話print("hello
lua"),新建一個空的out.lua腳本文件
2、開始--運行--cmd
3、luac
-o
out.lua
1.lua
註:
luac
-o
[編譯後腳本名]
[腳本名],必要時帶上腳本路徑,如:
回車之後,再打開out.lua就可以看到編譯好的位元組碼了
然後實驗一下,執行這個位元組碼腳本,可以看到lua原生的解釋器可以直接解析luac編譯出來的bytecode腳本,很方便!
D. 演算法-LUA實現一種報文簽名加密
接入系統與XX特色前置的通訊報文採用報文體MAC簽名,簽名用來識別來源的合法性和報文體是否遭篡改或破壞。MAC簽名值生成的步驟如下:
經過咨詢同事,公司crypt庫中有現成的MD5加密方法;
果斷復用!!!
驗證:將字元串「123456」 按標准md5演算法 後應該是
crypt庫中與MD5相關的有3個:
驗證1:-- 不一致
驗證2: -- 一致可用
調用加密機SM4演算法加解密數據
關鍵code
--對數據每兩位進行位元組壓縮
--對壓縮後的數據轉為位元組
--解碼:獲取的前16位元組
--解碼:獲取的前17-32位元組轉為byte