原标题:用 Lua 简单还原 OpCode 顺序
前段时间外出游荡,遇上个大兄弟说能不能跑个 Lua 脚本把 Lua 里被修改的 OpCode 顺序弄出来,最近有空自己尝试一下。
准备材料
① 被修改 OpCode 顺序的 Lua 虚拟机程序一个,不限 SO/DLL/EXE;
② 同版本的正常 Lua 虚拟机程序一个,不知道版本的同学可以从字符串里找,这里是 Lua 5.1.5;
③ 随便写一个能正常编译的 Lua 函数。
思路
1、dump 出 Lua虚拟机中的脚本字节码文件;
2、用正常的字节码去校对OpCode乱序的字节码。
一般情况下 *.luac 文件由 luac 程序生成,其中的数据是由luaU_dump函数产生,在luac.c文件中被调用,而luaU_dump的另一个入口在lapi.c的lua_dump,被绑定到Lua 的string.dump函数。
通过在 Lua 脚本中对需要 dump 的函数用 string.dump,可以得到对应的字节码。
分别在目标 Lua 和正常 Lua 虚拟机中运行以下这段代码,获得 OpCode 乱序后的 luac 文件和正常的 luac 文件:
-- lua
function test()
-- ...略
end
localdata= string.dump( test)
localfp = io.open( "test.luac", "wb")
fp:write( data)
fp: close()
拿得到的两份 luac 文件