手游反向浅析

简单逆向分析

Posted by Bob on October 19, 2018

逆向分析:对一个事物的可能,对其进行反向分析,分解和重构,推理分析某个事物可能。 和演绎法类似

T系所有手游都是用的一套加固方式,先看看官网的介绍, 四大保护功能。 image

第三项资源apollo组件

游戏资源基于IFS文件构建,不仅可以更新资源还可以增量更新Apk。

image

游戏启动时可以基于文件列表(ResourcePackerInfoSet.bytes)从资源包中(sgame_resource.txt)解压出资源到序列化目录。

image

第四项反调试

先使用看看Assembly-CSharp.dll,很明显加密了。 image

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。  image

转化为C代码后mono_image_open_from_data_with_name方法

image

再看看加固后的libmono.so,貌似抹掉了mono_image_open_from_data_with_name,理论上在mono_image_open_from_data断点调试能dump出dll文件

image

jumpout到0x1409894u

image

分析一堆汇编指令,如嚼树根,没兴趣看下去。转而通过IDA调试来分析。

先把手机root了,再把IDA安装目录下的android_server文件通过adb push 命令push到手机/data/local/tmp/目录下,并通过root权限身份运行./android_server

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

通过adb forward命令把端口转cp端IDA的监听应用端口号 ,包名在AndroidMainfest文件里找

  1. adb forward tcp:23946 tcp:23946
  2. adb shell am start -D -n com.xx.xx.game/com.xxx.UnityPlayerNativeActivity

启动IDA之后并attach了调试进程,要在反调试函数运行前处理调试。

  1. adb forward tcp:8700 jdwp:进程号
  2. 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 frameworkYAHFAVirtualHook

尝试hook住so文件,试了一个上午没有成功,不知道姿势哪里不对? image

Android虚拟机

不甘心,换个思路。如果能把游戏保护进程(GameProtector3)干掉,是不是就可以愉快玩耍了。手头的测试手机又不能Root,找了iTools Android模拟器,装上[gameguardian]修改器(https://gameguardian.net/)。通过内存搜索值的方式搜索9460301(0x4D 5A 90 00)的十进制表示方式,这PE文件Dos头的特征码。 image

dump内容发现没什么意义,也不知道哪里有问题?

image image image

扩大范围再尝试dump游戏所有内存找dll

image image

内存bin文件如下图

image

使用get_dll_from_dumped_bin.exe导出所有dll文件

image

9个dll没一个是Assembly-CSharp

image

和包内文件对比大小也不对,到底藏在什么地方呢?

image

那就是可能修改Dll文件头,先通过二进制工具分析一下正常的dll文件

image

Hex搜索50 45 00 00 4c 01 03 00,搜到17个标识段

image

把DosHeader含有完整MZ签名的PE头修改为60,这样剩下的就是未能导出被篡改过的Dll段

image

最后就是尝试修复这些dll文件的头…..

Assembly-CSharp.dll:8,846,336 字节 Assembly-CSharp-firstpass.dll :4,978,176字节

image

此致收费几千几万的加固服务就窥探清楚了。

收工,明天爬香山看红叶~~~