cocos2dx游戏逆向实战 IDA 7.6 安卓9 动态调试so库
# cocos2dx游戏逆向实战 IDA 7.6 安卓9 动态调试so库# 一、调试准备
## 1. 工具列表
IDA Pro 7.6
安卓 9
com.legend.test 传奇手游
## 2. IDA调试环境
将adb所在目录添加环境变量到PATH, E:\Android\platform-tools
```cpp
PS K:\ReverseTools\Debuggers\IDA 7.6\dbgsrv> adb devices
List of devices attached
c770c5760305 device
PS K:\ReverseTools\Debuggers\IDA 7.6\dbgsrv> adb push .\android_server64 /data/local/tmp
.\android_server64: 1 file pushed, 0 skipped. 76.1 MB/s (1236288 bytes in 0.016s)
```
运行android_server64服务
```cpp
PS K:\ReverseTools\Debuggers\IDA 7.6\dbgsrv> adb shell
sakura:/ $ su
sakura:/ # cd /data/local/t
tmp/ traces/
sakura:/ # cd /data/local/tmp
sakura:/data/local/tmp # ll
/system/bin/sh: ll: not found
127|sakura:/data/local/tmp # ls -lh
total 14M
-rw-rw-rw- 1 shell shell 1.1M 2021-04-27 17:41 android_server64
-rwxrwxrwx 1 shell shell28M 2022-03-19 08:22 lldb-server
drwxrwxrwx 5 shell shell 4.0K 2022-05-14 13:47 perfd
-rwxrwxrwx 1 shell shell 1.3K 2022-03-19 08:22 start_lldb_server.sh
sakura:/data/local/tmp # chmod 777 android_server64
sakura:/data/local/tmp # /data/local/tmp/android_server64
IDA Android 64-bit remote debug server(ST) v7.6.27. Hex-Rays (c) 2004-2021
Listening on 0.0.0.0:23946...
```
端口转发相关操作
```cpp
PS K:\ReverseTools\Debuggers\IDA 7.6\dbgsrv> adb forward tcp:23964 tcp:23964
23964
PS K:\ReverseTools\Debuggers\IDA 7.6\dbgsrv> adb forward tcp:23946 tcp:23946
23946
PS K:\ReverseTools\Debuggers\IDA 7.6\dbgsrv> adb forward --list
c770c5760305 tcp:53883 localabstract:AndroidStudioTransport
c770c5760305 tcp:23964 tcp:23964
c770c5760305 tcp:23946 tcp:23946
PS K:\ReverseTools\Debuggers\IDA 7.6\dbgsrv> adb forward --remove tcp:23964
PS K:\ReverseTools\Debuggers\IDA 7.6\dbgsrv> adb forward --list
c770c5760305 tcp:53883 localabstract:AndroidStudioTransport
c770c5760305 tcp:23946 tcp:23946
```
# 二、游戏分析
将lua的游戏so库拖入IDA,cocos2dx游戏加载lua都会走**`cocos2dx_lua_loader`,记录下这个函数地址的偏移:**
```cpp
D5D63C
```
手机上启动游戏进程。
# 三、打开IDA
选择附加到远程Android 调试器
然后接下来填入localhost
搜索对应进程的名字,点击附加操作
调试成功进入这个界面后
ctrl+s 查找so库代码段。
可以看到这里有三个代码段, 选择第一个。
```cpp
libcocos2dcpp.so 0000007065893000 000000706685A000 R . X D . byte 00 public CODE 64 00 00
```
start加上我们刚才的偏移量后70665F063C,跳转过去,可以看见函数名就是cocos2dx_lua_loader
此时我们再开一个IDA 7.6 Pro 查看静态分析完成的so。找到`luaLoadBuffer`。
再切换到反汇编模式
记录下这个偏移
```cpp
D62588
```
切到动态调试的IDA,计算地址后跳转过去。
```cpp
70665F5588
```
在这里我们下一个断点,往上看,我们会看到一个跳转。
x引用后,在跳转处也下一个断点。
此时我们可以F9运行进程了。
点击进入游戏,就能断下来。刚断下来时屏幕闪了。不知道为什么
```cpp
libcocos2dcpp.so 00000070657CA000 0000007066791000 R . X D . byte 00 public CODE 64 00 00
```
重连后,再计算一次。706652C588
经过单步调试对比
他走的是后面两个函数的流程,不是xxtea_decrypt。
经过调试,发现lua走的不是xxtea的流程,走的是ZipUtil的流程。
X3是脚本的名称。
X1是解密后的代码
luaL_loadbuffer确实被调用了,但是LSPosed hook时会出问题。
检查hook代码
```cpp
libcocos2dcpp.so 0000007065787000 0000007066D56000 R . X D . byte 00 public CODE 64 00 00
D578D8
```
hook后游戏界面进不去了。
在多层调用的情况下,导致hook出了问题。重新调整思路,hook更底层的函数`luaL_loadbufferx`,hook不再出现问题。
至此,工作结束,喜获另外源码一套。
楼主有分析过保卫萝卜3嘛 厉害了,赞~ 感谢分享{:301_997:} 它没有壳嘛 可以直接调试so
加油,欧力给{:1_919:} 两天分析一个游戏,下一个分析那个 大佬,怎么提取加密的key值呢 牛逼啊啊啊啊