BeneficialWeb 发表于 2022-5-15 12:25

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不再出现问题。



至此,工作结束,喜获另外源码一套。

白云点缀的蓝 发表于 2022-5-15 12:42

楼主有分析过保卫萝卜3嘛

sqxiaoer 发表于 2022-5-15 13:06

metoo2 发表于 2022-5-15 14:14

厉害了,赞~

幽幽洛 发表于 2022-5-15 16:52

感谢分享{:301_997:}

裴冰夏 发表于 2022-5-15 17:33

它没有壳嘛 可以直接调试so

tudouzmd 发表于 2022-5-15 19:34

加油,欧力给{:1_919:}

积积 发表于 2022-5-15 21:56

两天分析一个游戏,下一个分析那个

zhaoduck 发表于 2022-5-15 22:18

大佬,怎么提取加密的key值呢

zhouzheng1201 发表于 2022-5-16 00:15

牛逼啊啊啊啊
页: [1] 2 3 4
查看完整版本: cocos2dx游戏逆向实战 IDA 7.6 安卓9 动态调试so库