安卓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的顺序。

还原opcode之后,修改unluac的源码的src/unluac/decompile/OpcodeMap.java文件:

再使用unluac反编译。

二:[原创]用 Lua 简单还原 OpCode 顺序-Android安全-看雪-安全社区|安全招聘|kanxue.com

大佬的办法,从应用内部运行lua脚本,获取字节码。再将同一个lua脚本运行在未被修改的环境。

使用python将两个字节码文件对比,将红色的部分使用python替换,然后使用unluac反编译.

反编译成功!

  • 19
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值