-
-
[讨论][原创]安卓lua解密——opcode修改后dump反编译
-
发表于:
2024-6-23 21:25
22490
-
[讨论][原创]安卓lua解密——opcode修改后dump反编译
随着近些年lua语言在安卓游戏大火,lua逆向已经越来越重要。早期游戏的lua源码放在安装包的assets目录,但随着对抗的升级,越来越多的游戏使用动态更新和扩展应用功能的方式,特别是在需要频繁更新脚本或配置的情况下。这种方法在游戏开发、插件系统、远程配置等场景中有较多应用。而且这种方法是网络上加载Lua代码,你在安装包,APK是得不到lua的代码的。遇到这种我们首先要确认是否是lua语言的应用:
打开apk\lib\arm64-v8a\目录,如果发现libxlua.so,libslua.so等等类似目录,那么有很大可能是lua。(lua又分luajit与普通lua,判断是不是luajit,将so文件放进IDA,字符串搜索luajit即可)
再使用IDA或者frida hook lual_loadbuffer获取字节码,使用unluac网址(unluac download | SourceForge.net)进行反编译。
java -jar unluac.jar 你的字节码文件>存放文件
反编译成功一般不会有输出信息,但看到类似上面的情况大概有3种可能:
1.文件头被改
2.opcode修改
3.文件头和opcode都被改
关于文件头:
0到3字节:1B 4C 75 61表示这是一个Lua字节码文件。
第4字节:51:版本号,表示Lua 5.1。
第5字节:00:格式号,表示标准格式。01为非官方,魔改lua。
第6字节:01:endianness标识,表示大端格式。字节码文件需要指示其数据的字节顺序,以确保在不同平台和硬件架构上的正确解析。不同平台可能采用不同的字节序,比如大多数x86和x86-64架构采用小端序,而一些嵌入式系统和网络协议采用大端序。
第8字节到11字节:Lua整数大小,指令大小等。
关于opcode修改:liblua.so文件是lua源码文件编译的,lua源码的"lua-5.1.5\src\lopcodes.h"文件定义了opcode:
如果在编译的时候将opcode的顺序修改,比如OP_MOVE在OP_GETUPVAL前面,改为OP_GETUPVAL在OP_MOVE前面,再编译为so,这时再使用unluac反编译会报错。
解决办法有两个:
一:将正常的so文件与修改后的so文件,放进IDA反编译,搜索函数:luaV_execute找到case,进行对比,还原opcode的顺序。
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)