动态调试Android SO 获取 xxtea 密码
一步一步获取Cocos2dx xxtea 密码
1.准备工具
Android 手机一部,最好是 32位处理器,必须能root
IDA Pro
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.具体操作步骤
Android 手机具有root 权限 而且已经安装被调试的apk包,在pc端 打开终端输入
1
2
3
4adb 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
5adb shell
su
cd /data/local/tmp
chmod 777 android_server
./android_server从截图可以看到已经启动了android_server 端口是 23946 , 需要使用 adb命令将端口映射至电脑 23946 为啥是这个端口? Ida Pro 在Attach Android时候默认监听端口是这个
准备工作应该差不多了,剩下的就是如何调戏Apk
1
2adb shell
am start -D -n org.cocos2dx.HelloLua/org.cocos2dx.lua.AppActivity #debug 形式启动apkam start 启动Android Activity -D: 允许调试功能 , -n
: 指定组件名,格式为{包名}/.{主Activity名} 启动 DDMS (win) or Monitor (mac)
也许会在想,为啥是DDMS ? 自己粗略的理解,为了查看App debug 信息(不一定正确,如果有确定的答案麻烦通知我)。 在Devices 里面能够看到等待调试的app信息,包名,端口等 但是发现debug 的标识还是红色,意思是暂时还不能调试,所以监视器已经被启动,剩下操作如何使用IDA 连接手机然后调试
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 设备。
点击 Remote ARMLinux / Android Debugger
然后点击 Debug options
请根据我的设置进行配置,如果你想要别的功能,那么请自行设置,然后点击确定。
回到Debugg application setup 界面, Hostname 请写localhost 或者 127.0.0.1 端口号默认 23946 然后点击OK
在新弹出的页面请点击seach 然后输入你需要调戏的包名(可以输入部分关键字进行查找)
然后就是点击OK
到现在这个地方才是真正开始准备获取cocos xxtea 密码的位置。 正如前面讲到的,Monitor 中显示 APP Debug 的标识是红色的,meaning 不能调试。 解决这个问题需要一行命令,终端输入如下
1
jdb -connect com.sun.jdi.SocketAttach:hostname=127.0.0.1,port=8700 #如果 8700 不好使 那就试一下 8600 为什么请问Google
当执行完命令时候 ,Monitor 中 debug的图标变成了绿色,所以,下一步就是开始反编译
在准备下一步的时候我们需要考虑,目的到底是什么? 需要看哪里 ? 已知:IDA Pro 可以在二进制部分函数中进行打断点单步调试。在 Cocos 中,C++ 中的代码会最终编译到 libcocos2dlua.so, 所以需要先定位到 so包,然后再次定位到相应函数,最基本的执行逻辑。IDA Pro 可以进行断点,所以需要再函数执行以前进行打上断点,等执行到断点时候查看内容。问题来了,如何做 ? 在什么地方打断点?如何判断so包是否被载入?如何判定打断点的函数就是你需要的函数 ? 如何查看自己想要的值 ?一些列的问号等着解决
知识补充 如何查找需要debug 的函数
目的:拿到 xxtea 解密密码。 目的很明确,所以先找到Cocos 源码部分,找到xxtea.h
1
2unsigned 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 如下截图
有的时候结果就是这么的让人欣喜。能找到这个函数,那么剩下的问题是如何在合适的时间打上断点,然后让APP断在我们想要的位置 ?在这个之前,得先找到什么时候SO 包被载入。所以往下面看。
继续跟踪调试
回到我们使用IDA Pro 连接好的准备调试界面,我们在IDA 的debug 选项中选择了加载so包的时候断住,但是在我的测试中发现貌似我这个在载入libcocos2dlua.so
并没有断住。同时也发现暂时并没有载入 libcocos2dlua.so 。所以开始想办法,如何去断点调试。IDA Pro 提供了 F8 单步调试 , F9 继续执行。在右侧的 Modules 中 ctrl + f 查找 cocos 发现没有内容。使用比较粗糙的方法,F8 一下一下的嗯,遇到弹框就点击继续一直到libcocos2dlua.so载入成功 在SO 载入成功以后,Modules 里面也出现了我们想要的 SO 包。赞!双击 Modules 中 libcocos2dx.so ,然后查找 xxtea
在这里打完断点以后可以使用 F9 让App 执行到断点位置
我们在断点位置摁一下F5 会怎样 ?(如果使用了 64 位的IDA ,那么貌似暂时不支持)
我们看到汇编语言版本的代码被ida 转化为了 略微熟悉的 C 语言, 根据我们xxtea_decrypt 源码我们发现,第三个只才是我们需要的 key 。 胜利在望,我们移动鼠标放在 a3 上面,发现 r2 寄存器才是我们要查找的内容
双击一下 a3 会如何 ?
或者在下面的 Hex View-1 中点击右键 Synchorize with 中选择 R2
4.密码部分已经给你了,其余的就自己看着办吧
ps. 转载前请先联系我 waiting0313@gmail.com
提供测试 apk 下载 点击下载