Cocos2dx相关
Jan 17, 2019
本文将介绍Cocos2d-x项目的反编译,破解和导出功能。
需要使用到:
- 完整root过的Android手机一部
- Frida https://www.frida.re/
- IDA https://www.hex-rays.com/products/ida/
- adb
brew install android-platform-tools
使用Frida可以下断点,改参数,改返回值,dump内存内容等各种操作。Python Binding使用起来比较上手。
Python头
1 | # -*- coding: utf-8 -*- |
连接设备上的Frida
1 | device = frida.get_usb_device(1) |
准备JS脚本
下面的脚本打印了目标应用的所有模块和模块内的所有导出函数
1 | source = """ |
如果运行失败可以在Java.perform外层包一个settimeout(func,0),但这样会失去第一帧捕获系统调用和Activity创建的时机。
愉快的跑起来
1 | script = session.create_script(source) |
到这一步Frida的基础流程就跑通了,但像上面提到的一样,时机很重要。对Cocos2dx游戏而言,抓住libcocos2dlua.so的加载时机可以确保大多数函数都可以被截住。可以使用捕获libc.so的dlopen来找到libcocos2dlua.so的加载时机,让主代码附在applicationDidFinishLaunching:
1 | Interceptor.attach(Module.findExportByName("libc.so", "dlopen"), { |
snippetstd::string的支持有限,可以加载自己的库来实现相应的操作。
1 | var mb_string_new = new NativeFunction(Module.findExportByName("libmb-lib.so", "_Z13mb_string_newPKc"), 'pointer', ['pointer']) |
解析PNG
1 | var ptrInitWithImageFile = Module.findExportByName("libcocos2dlua.so","_ZN7cocos2d5Image17initWithImageFileERKSs") |
在Update函数里执行主动解析相关操作,注意到一些使用的Interceptor.replace,一些使用的Interceptor.attach。
使用replace的函数处理中调用其他可被捕获的方法时,依然可以触发目标方法的捕获。
但使用attach的函数调用其他可被捕获的方法时,不会触发目标方法的捕获。
1 | var ptrImageNew = Module.findExportByName("libcocos2dlua.so","_ZN7cocos2d5ImageC2Ev") |
解析lua
1 | Interceptor.attach( |
解析plist
1 | Interceptor.attach( |
解析Cocos2d::Data
1 | function readDataBytesArray(ptrToData) { |
Python中处理Message
1 | # script.on("message", on_message) |