易语言下载别人的源码编译出来用不了_cocos2dx lua 反编译

本文介绍了如何解密Cocos2d-x游戏中lua bytecode,通过IDA分析找到解密关键,利用xxtea源码解密ZIP文件,然后借助LuaJIT ASM查看并反编译LUA代码,过程中遇到的挑战与解决方法。
摘要由CSDN通过智能技术生成

网上各种教程、各种工具用不了,才会有这个文章。

0x00 lua bytecode解密

知己知彼很重要,搜索“cocos2dx lua 加密”大概可以找到类似下面的代码。

8887c2b4cb7d0733e4cd91fbd1858f33.png

我的目标是一个ANDROID游戏,APK文件直接解压。一般情况是libcocos2dlua.so,IDA 打开,函数窗口直接搜索applicationDidFinishLaunching,就能带你飞,可惜只有loadChunksFromZip,没有setXXTEAKeyAndSign,这保存解密KEY的被编译优化了。怎么办?IDA字符串窗口帮你忙,编译器编译代码的时候都是就近原则,只要是差不多地方出现的字符串,都会被放在一起。加密的ZIP文件,文件头几个字符就是setXXTEAKeyAndSign的SIGN参数,加上ZIP文件本身的路径,搜索目标ZIP文件就可以了。如图,IDA显示附近也就几个字符串,剩下的KEY参数是哪个,一个一个试就可以了。

加密的ZIP文件:

19abe0ee3526e32aadba9d5e169cb5a7.png

IDA中的字符串,第一个黑块是SIGN参数,非常幸运,尝试第二个黑块就是KEY:

4fe5e51d4ffee2ea99595eba3025b4f6.png

https://github.com/cocos2d/cocos2d-x/search?p=1&q=loadChunksFromZip&type=&utf8=%E2%9C%93 找到cocos2dx的loadChunksFromZip的源码

f604f940a126ff5a7fac02ab3ac8539e.png

这里我遇到一点困难,cocos2dx的源码项目,没有xxtea的源码!不过还是让我在github搜索出来了,源码在此:

https://github.com/xxtea/xxtea-c

直接写个C++代码,就把加密的ZIP解出来了。顺带一提,Sign就是用来跳过,跟什么PE,MZ是一样的。

8f76e10adb7067b7ed8c99e71d4879de.png

de_xxx.zip的头两个字节变成喜闻乐见的PK,解压,搞定。

Luajit ASM

解压出来的文件,都是LuaJIT— a Just-In-Time Compiler for Lua,文件头长这样:

e61bc58bfc4b552a3847828c076a363c.png

http://luajit.org/download.html 可以下载到LuaJIT的源码,不过兼容性有点糟糕,需要找到正确的版本才有效。回到IDA字符串窗口搜索luajit,可以确认目标APK使用的是2.1.0-beta2。下载源码,编译之后,使用类似下面的命令行:

luajit.exe -bl xxx.lua.bytecode xxx.lua.asm

可以看到LUA的ASM代码了,LUA ASM长这样:

0013 TGETV 4 4 1

0014 CALL 3 4 2

0015 ISNEXT 6 => 0019

0016 => MOV 8 7

0017 MOV 9 2

0018 CALL 8 1 2

0019 => ITERN 6 3 3

0020 ITERL 6 => 0016

0021 RET0 0 1

BYTECODE的定义在http://wiki.luajit.org/Bytecode-2.0 。不过我智商不够,看不懂,

0x01 Luajit decompiler

搜索了无数反编译文章,基本就是https://github.com/NightNord/ljd ,然而这货2014年之后就再没更新了,并不能用,没有选择,只能自己动手改。

1). 由于新Opcode导致的失败

luajit 2.1.0-beta2源码的lj_bc.h里的#define BCDEF,下方就是长长一串Opcode定义。

Ljd源码的bytecodeinstructions.py 和 rawdumpcode.py的两张Opcode表必须跟luajit 2.1.0-beta2 一一对比,少了的就要补上。

这里不得不吐槽一下luajit,新增Opcode其实并没有人用,Opcode是通过数组维护的,随便加个新的Opcode都会导致原有的Opcode编码改变。。。

2). 由于assert导致的失败,注释掉就好了。虽说有点不负责,但是反编译各种语法处理我也不懂。

LJD改好之后,main.py xxx.lua.bytecode > xxx.lua,终于可以看到正常的代码:

d9387d15d782b3780061eb93dd16d0ce.png

完毕

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值