逆向分析:对一个事物的可能,对其进行反向分析,分解和重构,推理分析某个事物可能。 和演绎法类似
T系所有手游都是用的一套加固方式,先看看官网的介绍, 四大保护功能。
第三项资源apollo组件
游戏资源基于IFS文件构建,不仅可以更新资源还可以增量更新Apk。
游戏启动时可以基于文件列表(ResourcePackerInfoSet.bytes)从资源包中(sgame_resource.txt)解压出资源到序列化目录。
第四项反调试
先使用看看Assembly-CSharp.dll,很明显加密了。
libmono.so是用如下三个函数加载Assembly-CSharp.dll,找到加载的函数就可逆向出dll文件
- mono_image_open_from_data_full
- mono_image_open_from_data
- mono_image_open_from_data_with_name
Unity公布的Mono源码,先使用IDA看看原版的libmono.so。
转化为C代码后mono_image_open_from_data_with_name方法
再看看加固后的libmono.so,貌似抹掉了mono_image_open_from_data_with_name,理论上在mono_image_open_from_data断点调试能dump出dll文件
jumpout到0x1409894u
分析一堆汇编指令,如嚼树根,没兴趣看下去。转而通过IDA调试来分析。
先把手机root了,再把IDA安装目录下的android_server文件通过adb push 命令push到手机/data/local/tmp/目录下,并通过root权限身份运行./android_server
- adb push android_server /data/local/tmp/
- adb shell
- cd /data/data/tmp/
- chmod 777 android_server
- ./android_server
通过adb forward命令把端口转cp端IDA的监听应用端口号 ,包名在AndroidMainfest文件里找
- adb forward tcp:23946 tcp:23946
- adb shell am start -D -n com.xx.xx.game/com.xxx.UnityPlayerNativeActivity
启动IDA之后并attach了调试进程,要在反调试函数运行前处理调试。
- adb forward tcp:8700 jdwp:进程号
- jdb -connect com.sun.jdi.SocketAttach:hostname=127.0.0.1,port=8700
jdb反附加了,需要android:debuggable=”true”,太麻烦了,放弃这个操作。
换个思路继续折腾。
VirtualApp
VirtualApp是一个开源的Android App虚拟化引擎,在你的App内创建一个虚拟空间,你可以在虚拟空间内任意的安装、启动和卸载APK,这一切都与外部隔离,如同一个沙盒。最重要是可以动态调试!!!另外还有几个免Root Hook framework 、YAHFA、VirtualHook
尝试hook住so文件,试了一个上午没有成功,不知道姿势哪里不对?
Android虚拟机
不甘心,换个思路。如果能把游戏保护进程(GameProtector3)干掉,是不是就可以愉快玩耍了。手头的测试手机又不能Root,找了iTools Android模拟器,装上[gameguardian]修改器(https://gameguardian.net/)。通过内存搜索值的方式搜索9460301(0x4D 5A 90 00)的十进制表示方式,这PE文件Dos头的特征码。
dump内容发现没什么意义,也不知道哪里有问题?
扩大范围再尝试dump游戏所有内存找dll
内存bin文件如下图
使用get_dll_from_dumped_bin.exe导出所有dll文件
9个dll没一个是Assembly-CSharp
和包内文件对比大小也不对,到底藏在什么地方呢?
那就是可能修改Dll文件头,先通过二进制工具分析一下正常的dll文件
Hex搜索50 45 00 00 4c 01 03 00,搜到17个标识段
把DosHeader含有完整MZ签名的PE头修改为60,这样剩下的就是未能导出被篡改过的Dll段
最后就是尝试修复这些dll文件的头…..
Assembly-CSharp.dll:8,846,336 字节 Assembly-CSharp-firstpass.dll :4,978,176字节
此致收费几千几万的加固服务就窥探清楚了。
收工,明天爬香山看红叶~~~