找回密码
 立即注册
查看: 239|回复: 3

用 Lua 对 OpCode 顺序的简单还原

[复制链接]
发表于 2023-2-1 13:58 | 显示全部楼层 |阅读模式
首先准备材料

  • 被修改 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 的函数,尽量覆盖所有的指令操作,否则只能提取出已有的指令
以上就是简单分享,有不明白的或者感兴趣的朋友,可以找我私下探讨,共同学习。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
发表于 2023-2-1 14:05 | 显示全部楼层
1
发表于 2023-2-1 14:07 | 显示全部楼层
你好,想加你请教一些问题
发表于 2023-2-1 14:12 | 显示全部楼层
你好,想加你有酬请教一些问题,麻烦私我个联系方式哈
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-11-24 09:53 , Processed in 0.116864 second(s), 23 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表