首页
社区
课程
招聘
[原创]用 Lua 简单还原 OpCode 顺序
发表于: 2019-4-4 14:44 32001

[原创]用 Lua 简单还原 OpCode 顺序

2019-4-4 14:44
32001

前段时间外出游荡,遇上个大兄弟说能不能跑个 Lua 脚本把 Lua 里被修改的 OpCode 顺序弄出来,最近有空自己尝试一下

首先准备材料

思路

一般情况下 *.luac 文件由 luac 程序生成,其中的数据是由 luaU_dump 函数产生,在 luac.c 文件中被调用,而 luaU_dump 的另一个入口在 lapi.clua_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,操作方法类似

下面是技术总结

附件为用到的相关资源

 
 
 

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

最后于 2019-4-4 17:29 被Amun编辑 ,原因: 话题修正
上传的附件:
收藏
免费 18
支持
分享
打赏 + 50.00雪花
打赏次数 1 雪花 + 50.00
 
赞赏  wx小白   +50.00 2020/07/20
最新回复 (39)
雪    币: 783
活跃值: (1121)
能力值: ( LV5,RANK:78 )
在线值:
发帖
回帖
粉丝
2
这帖子不错..很强.
2019-4-4 15:49
0
雪    币: 25
活跃值: (506)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
mark
2019-4-4 16:39
0
雪    币: 1787
活跃值: (913)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
哇这个思路……
坚固的堡垒从内部被攻破
这样子获取对照很棒哦
2019-4-4 17:38
0
雪    币: 26245
活跃值: (63287)
能力值: (RANK:135 )
在线值:
发帖
回帖
粉丝
5
感谢分享~
2019-4-4 18:12
0
雪    币: 36
活跃值: (1061)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
6
mark 感谢分享
2019-4-4 18:56
0
雪    币: 120
活跃值: (1597)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
哇,厉害啊,大佬
2019-4-11 11:38
0
雪    币: 53
活跃值: (106)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
学习了
2019-4-11 20:04
0
雪    币: 2685
活跃值: (3705)
能力值: ( LV9,RANK:140 )
在线值:
发帖
回帖
粉丝
9
前来支持师兄
2019-4-15 09:55
0
雪    币: 198
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
10
厉害 但是不管用
2019-4-16 03:54
0
雪    币: 198
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
11
读取不了。。
2019-4-16 05:01
0
雪    币: 138
活跃值: (26)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
落叶似秋 前来支持师兄
朋友,读了你的文章 ,有些小疑问,加个QQ,可以吗?3133916
2019-4-17 10:43
0
雪    币: 29
活跃值: (97)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
感谢分享啊
2019-4-21 15:02
0
雪    币: 55
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
很棒
2019-4-23 10:17
0
雪    币: 35
活跃值: (612)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
感觉没意义啊.. 前提哪里来的明文lua ?
看起来这是 拿 明文lua和解密lua 对比计算的  前提哪里来的明文lua?
最后于 2019-5-14 15:21 被guotouck编辑 ,原因:
2019-5-14 14:59
1
雪    币:
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
16
看了您的文章,有一个点,没有想通,如何获得目标lua虚拟机执行程序?比如我现在只有打包完成的so文件。期待您的回复
2019-11-8 00:03
0
雪    币: 6124
活跃值: (4656)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
17
guotouck 感觉没意义啊.. 前提哪里来的明文lua ?看起来这是 拿 明文lua和解密lua 对比计算的   ...
一看就没认真读文章,人家说是对比opcode顺序,你自己写一个文件包含所有操作就行了。
2019-11-8 00:43
0
雪    币: 1110
活跃值: (3269)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
18
动态库需要导出函数,才能被外部调用。在 Lua 的动态库中一般存在 `luaL_dofile` `luaL_loadbuffer`  等等,可以直接拿来用。如果是以静态库形式集成的 Lua,要自己找函数偏移。
2019-11-8 11:11
0
雪    币: 35
活跃值: (612)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
Amun 动态库需要导出函数,才能被外部调用。在 Lua 的动态库中一般存在 `luaL_dofile` `luaL_loadbuffer` 等等,可以直接拿来用。如果是以静态库形式集成的 Lua,要自己找函 ...

需要满足以下条件吧.
1.找到对方的 `luaL_loadbuffer` pcall接口  
2.对方支持明文lua运行,国产很多厂商都把明文lua接口删除了的 只支持二进制编码格式运行

然后你这demo我运行了下 根本不行啊 是不是上传有错误. 
 

 dofile("C:\\Users\\hello\\Desktop\\Check_OpCode\\check_opcode.lua")
C:\Users\hello\Desktop\Check_OpCode\check_opcode.lua:64: table index is nil
stack traceback:
        C:\Users\hello\Desktop\Check_OpCode\check_opcode.lua:64: in main chunk
        [C]: in function 'dofile'
        stdin:1: in main chunk
        [C]: ?
最后于 2019-11-8 12:16 被guotouck编辑 ,原因:
2019-11-8 12:15
0
雪    币: 1110
活跃值: (3269)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
20
  1. 删除加载明文脚本相关的代码可能会导致大量使用 require,dofile,loadfile,dostring,loadstring,loadlib,load相关功能的 Lua 库发生故障,一般只会隐藏导出接口。
  2. 无故障
2019-11-8 15:01
0
雪    币: 35
活跃值: (612)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
Amun 1. 删除加载明文脚本相关的代码可能会导致大量使用 `require`,`dofile`,`loadfile`,`dostring`,`loadstring`,`loadlib`,`load`相关功能 ...
终于代码可以跑了 win10出错..... win7可以 . ,不支持是不是系统不同 编码不同 反正WIN10不可以  难怪我下了N份这种一键找op的..都是这坑

网易的游戏 都不支持明文lua加载 只可以二进制编译加载 
最后于 2019-11-9 23:49 被guotouck编辑 ,原因:
2019-11-9 23:48
0
雪    币: 243
活跃值: (451)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
22
我想问一下,如何拿到目标lua虚拟机  如果指的是so文件  我如何用so文件加载我的lua文件为字节码文件  请大佬指点
2020-7-20 09:43
0
雪    币: 1110
活跃值: (3269)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
23
wx小白 我想问一下,如何拿到目标lua虚拟机 如果指的是so文件 我如何用so文件加载我的lua文件为字节码文件 请大佬指点
最简单的方法是自己写一个 APP,调用 liblua.so 的 API 函数进行加载执行。
2020-7-20 12:15
0
雪    币: 243
活跃值: (451)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
24
能具体点吗   我对lua虚拟机不熟悉  调用那些函数   可以把lua源码编译成字节码文件
2020-7-20 15:10
0
雪    币: 3712
活跃值: (1401)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
25
通过目标虚拟机加载lua文件跟正常虚拟机编译的luac进行对比“吐出”映射表
2020-9-9 15:26
0
游客
登录 | 注册 方可回帖
返回
//