记一次游戏分析
0x1 分析目标
名称: SGYXL
包名: com.hongguan.sgyxlgw.w6kw
分析目的: 找到人物和物品等数据配置(如每个等级的数值)
0x2 抓包
因为是联网的游戏, 所以猜想可能会通过数据包来传输这些数据
所以, 设置好代理, 打开Fildder就开始操作游戏了
第一个问题出现, 使用Fiddler抓包时, 部分包会出现bad request 400错误, 导致无法正常游戏
中间怀疑是ssl pinning, 使用justTrustMe, 结果也是一样…. 折腾的部分不说了
后来抱着试试的心态, 换burpsutie试试, 结果….. 就可以了…. 我TM
玩了一会, 发现http的包寥寥无几, 多数都是通关的时候, 发送的包, 信息也没什么用
1 | { |
0x3 从文件着手
既然http包没有, 那肯定是socket通信了, 这个分析麻烦, 准备从文件着手, 因为这一类配置信息, 肯定会下发到本地储存的;
把整个包的data给导出来了, 最后文件排查, 确定一个可以文件, patch.assets, 这个应该就是刚刚下载的更新包了, 打开一看, 呦豁, 应该是加密打包的资源
分析了java层代码, 大概确定了位置, 想用Frida Hook确定下
上传了fridaserver之后, 打开游戏, 结果闪退了…. 闪退了….. 关了fridaserver就好了, 感情还检测frida? 尝试修改了一下文件名, 结果还是一样….
抱着试试心态, 换xposed, 结果可以…….. 我再次TM, 这检测有毛用?
最后分析确定是从cocos类调进 libcocos2dlua.so 里了, 呦豁, 要hook得用frida啊, 于是又尝试修改了监听默认端口, 居然可以了, 是我太懒……
反正折腾不少, 把坑总结一下:
最好实体机, 不要用模拟器使用frida, 很多版本不行, 如果非要用可以使用雷电模拟器, genymotion, frida版本就12.6.10 x86吧, 不过还是不稳定, 最后我是换实体机了
findBaseAddr为空的问题, 这个就是因为使用了模拟器, fridaserver是x86版本, 然而要hook的so是arm版本的, 所以是永远hook不到的, 这个坑踩了一会
要hook Jni_OnLoad之类加载时机比较早的函数, 可以用spawn方式启动, 然后通过hook dlsym中在来hook函数, 注意hook代码不要写在Java.perform里 否则会错误hook时机
0x4 so分析过程
既然是cocos的so, 那肯定是得找loadlua的地方了… 这部分其实不怎么用分析了, 直奔luaL_loadbuffer, 直接hook这个函数就可以了, 如果hook不到, 那就是hook时机晚了, 参照上面的坑总结
把lua dump下来之后发现, 并不是lua文件, 而是luaJIT文件, 编译后的字节码
大概看了下, opcode并没有打乱, 而且编译的时候还把调试信息编译进去了, 找了份反编译工具, 愉快的还原啦
最后批量跑一波, 果然就找到了想要的”配置文件”, 都写在lua里了
0x5 继续深入
由于通过hook loadlua的方式, 是边玩边加载的, 所以dump下来的lua不全, 只能从加密资源上着手了
忽然想起来cocos是开源的, 于是去下载源码看一波文件解密有没有线索, 还真被我找到了
通过分析, 确定了通过utils->getDataFromFilec传入文件名就可以获取文件内容啦, 编写hook代码的时候又是掉坑很多, hook时机啊, 调用时机啊, 构造stl的一些参数啊, 很多stl函数编译的时候内联了, libc++都没有导出, 坑的灰头土脸, 不过还是写完了
关键代码
1 | if(isHook == 0) |
至此就分析完毕了, 写的很粗糙, 像流水账一样, 就是做个记录, 其中遇到的坑还是不少的, 浪费了不少时间…