用 Lua 对 OpCode 顺序的简单还原
首先准备材料[*]被修改 OpCode 顺序的 Lua 虚拟机程序一个,不限 SO/DLL/EXE;
[*]同版本的正常 Lua 虚拟机程序一个,不知道版本的同学可以从字符串里找,这里是 Lua 5.1.5;
[*]随便写一个能正常编译的 Lua 函数。
思路
[*]dump 出 Lua 虚拟机中的脚本字节码文件;
[*]用正常的字节码去校对 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 文件:
拿得到的两份 luac 文件比较下,提取出差异内容,差异的部分应该是 Instruction 中的 OpCode。
从 Lua 源码中的 lvm.c 文件的luaV_execute函数中得知,是通过GET_OPCODE宏获取到 OpCode,再执行对应的操作
GET_OPCODE宏的定义在lopcodes.h文件中,相关代码如下:
简单来说,指令 & 0x3F 就可以得到 OpCode 的数值
依旧在目标 Lua 中执行,让它自己输出 OpCode 顺序,完整代码资源在附件
输出结果
对于手游中使用的 xlua/ulua/tolua,操作方法类似
下面是技术总结
[*]Lua 版本一定要相同
[*]用于 dump 的函数,尽量覆盖所有的指令操作,否则只能提取出已有的指令
以上就是简单分享,有不明白的或者感兴趣的朋友,可以找我私下探讨,共同学习。 1 你好,想加你请教一些问题 你好,想加你有酬请教一些问题,麻烦私我个联系方式哈
页:
[1]