动态调试Android SO 获取 xxtea 密码

一步一步获取Cocos2dx xxtea 密码

1.准备工具

  1. Android 手机一部,最好是 32位处理器,必须能root

  2. IDA Pro

  3. cocos apk 确认使用xxtea (cocos new HelloLua -l lua 然后生成apk)

2.电脑环境 win or Mac

​ 电脑需要能够使用 adb 命令 ,建议安装 apktool (防止apk 没有配置 android:debuggable=”true”,如果apk包不能直接调试请自行查找如何重新打包apk ) ,Android Studio 需要安装 (主要为了分析 manifest 文件 Application 中是否配置android:debuggable=”true” 另外需要使用 sdk 文件夹 tool 下面 monitor ,win 下面可以使用 ADT Bundle 中 ddms ) 因为个人使用习惯问题,这里讲述如何在mac 系统下面操作。

3.具体操作步骤

  1. Android 手机具有root 权限 而且已经安装被调试的apk包,在pc端 打开终端输入

    1
    2
    3
    4
    adb shell 
    su
    cd /data/app #查看包名文件夹是 为debug 启动 应用做准备
    ls -l

    在真正启动调试以前需要把 ida pro 提供的 android_server 文件放在 Android手机的 /data/local/tmp 文件夹下,操作方式可以使用 adb push 或者拷贝文件到手机SD 卡中,然后通过命令形式挪动到 /data/local/tmp重要的是android_server 文件需要给与可执行权限, 所以Android 手机需要有Root 权限

    1
    2
    3
    4
    5
    adb shell 
    su
    cd /data/local/tmp
    chmod 777 android_server
    ./android_server

    "执行终端截图"
    "执行android_server"

    从截图可以看到已经启动了android_server 端口是 23946 , 需要使用 adb命令将端口映射至电脑 23946 为啥是这个端口? Ida Pro 在Attach Android时候默认监听端口是这个
    "adb 转发"

    准备工作应该差不多了,剩下的就是如何调戏Apk

    1
    2
    adb shell
    am start -D -n org.cocos2dx.HelloLua/org.cocos2dx.lua.AppActivity #debug 形式启动apk

    "命令启动apk"

    am start 启动Android Activity -D: 允许调试功能 , -n : 指定组件名,格式为{包名}/.{主Activity名}

    "App启动后截图"

  2. 启动 DDMS (win) or Monitor (mac)

    也许会在想,为啥是DDMS ? 自己粗略的理解,为了查看App debug 信息(不一定正确,如果有确定的答案麻烦通知我)。 在Devices 里面能够看到等待调试的app信息,包名,端口等 但是发现debug 的标识还是红色,意思是暂时还不能调试,所以监视器已经被启动,剩下操作如何使用IDA 连接手机然后调试
    "DDMS能看到的内容"

  3. IDA 部分操作
    准备工作和启动APP 已经结束了,剩下的是需要借助 IDA 这货来获取我们想要的内容。好戏才刚刚开始~
    我在使用 Mac 版本 IDA Pro 7.0 ,具体下载地址暂时不提供,毕竟业余水平的我也买不起。

    IDA Pro 一直存在 两个可执行文件, 32 位和 64 位之分。区别在于 32 位可以使用 F5 把二进制中函数部分难以理解的汇编转化为稍微容易可读的 C 语言。 推荐暂时使用 32 位,所以 也推荐使用 32 位处理器的 Android 手机(2019 年的今天已经很难找到,我的测试机器是A0001, 骁龙 801 处理器 64位 ,尴尬的笑脸),细心的同学们会发现在 IDA 提供的 android_server 文件在 dbgsrv 文件夹下面包含两个, 另外一个文件是 android_server64 (使用这个文件的时候请打开 IDA Pro 64)。啰嗦到此为止,我们已经打开了 IDA Pro ,需要操作的是 Attach Android 设备。

    "IDA Attach"

    点击 Remote ARMLinux / Android Debugger

    "Set Debugger"

    然后点击 Debug options

    "Debug options"

    请根据我的设置进行配置,如果你想要别的功能,那么请自行设置,然后点击确定。

    回到Debugg application setup 界面, Hostname 请写localhost 或者 127.0.0.1 端口号默认 23946 然后点击OK

    在新弹出的页面请点击seach 然后输入你需要调戏的包名(可以输入部分关键字进行查找)
    "Debug options"

    然后就是点击OK
    "Debug"

    到现在这个地方才是真正开始准备获取cocos xxtea 密码的位置。 正如前面讲到的,Monitor 中显示 APP Debug 的标识是红色的,meaning 不能调试。 解决这个问题需要一行命令,终端输入如下

    1
    jdb -connect com.sun.jdi.SocketAttach:hostname=127.0.0.1,port=8700 #如果 8700 不好使 那就试一下 8600  为什么请问Google

    "Debug"

    当执行完命令时候 ,Monitor 中 debug的图标变成了绿色,所以,下一步就是开始反编译

    在准备下一步的时候我们需要考虑,目的到底是什么? 需要看哪里 ? 已知:IDA Pro 可以在二进制部分函数中进行打断点单步调试。在 Cocos 中,C++ 中的代码会最终编译到 libcocos2dlua.so, 所以需要先定位到 so包,然后再次定位到相应函数,最基本的执行逻辑。IDA Pro 可以进行断点,所以需要再函数执行以前进行打上断点,等执行到断点时候查看内容。问题来了,如何做 ? 在什么地方打断点?如何判断so包是否被载入?如何判定打断点的函数就是你需要的函数 ? 如何查看自己想要的值 ?一些列的问号等着解决

  4. 知识补充 如何查找需要debug 的函数

    目的:拿到 xxtea 解密密码。 目的很明确,所以先找到Cocos 源码部分,找到xxtea.h

    1
    2
    unsigned char *xxtea_encrypt(unsigned char *data, xxtea_long data_len, unsigned char *key, xxtea_long key_len, xxtea_long *ret_length);
    unsigned char *xxtea_decrypt(unsigned char *data, xxtea_long data_len, unsigned char *key, xxtea_long key_len, xxtea_long *ret_length);

    xxtea_decrypt 多么刺眼,如果,我指的是如果,Cocos 的包开发者没有这块的安全意识,基本上这块的代码应该不会改动。所以,IDA 静态反编译libcocos2dlua.so ,在能够列出的函数列表中我们查找 xxtea 字段,万一能够查到我们想要的内容呢 ?

    我另外开启了一个 IDA 用来静态反编译 ** libcocos2dlua.so** , 在function 列表中查找 xxtea 如下截图
    "Debug"

    有的时候结果就是这么的让人欣喜。能找到这个函数,那么剩下的问题是如何在合适的时间打上断点,然后让APP断在我们想要的位置 ?在这个之前,得先找到什么时候SO 包被载入。所以往下面看。

  5. 继续跟踪调试

    回到我们使用IDA Pro 连接好的准备调试界面,我们在IDA 的debug 选项中选择了加载so包的时候断住,但是在我的测试中发现貌似我这个在载入libcocos2dlua.so
    并没有断住。同时也发现暂时并没有载入 libcocos2dlua.so 。所以开始想办法,如何去断点调试。IDA Pro 提供了 F8 单步调试F9 继续执行。在右侧的 Modules 中 ctrl + f 查找 cocos 发现没有内容。使用比较粗糙的方法,F8 一下一下的嗯,遇到弹框就点击继续一直到libcocos2dlua.so载入成功 在SO 载入成功以后,Modules 里面也出现了我们想要的 SO 包。赞!

    "Debug"

    双击 Modules 中 libcocos2dx.so ,然后查找 xxtea
    "Debug"

    在这里打完断点以后可以使用 F9 让App 执行到断点位置
    我们在断点位置摁一下F5 会怎样 ?(如果使用了 64 位的IDA ,那么貌似暂时不支持)
    "Debug"

    我们看到汇编语言版本的代码被ida 转化为了 略微熟悉的 C 语言, 根据我们xxtea_decrypt 源码我们发现,第三个只才是我们需要的 key 。 胜利在望,我们移动鼠标放在 a3 上面,发现 r2 寄存器才是我们要查找的内容
    "Debug"

    双击一下 a3 会如何 ?
    "Debug"

    或者在下面的 Hex View-1 中点击右键 Synchorize with 中选择 R2
    "Debug"

4.密码部分已经给你了,其余的就自己看着办吧

​ ps. 转载前请先联系我 waiting0313@gmail.com
提供测试 apk 下载 点击下载