-
-
[原创]内存dump 获得基于Unity3d的游戏相关代码
-
发表于:
2017-12-30 22:50
24345
-
[原创]内存dump 获得基于Unity3d的游戏相关代码
解压apk,在lib文件夹看到有libmono.so,libunity.so 便是Unity3d的程序。又看到有libDexHelper.so,便是梆梆的加固,把
libmono.so拖到IDA是解析不出来的。然后去看 assets\bin\Data\Managed 下,便是
Unity3d的.NET程序,把对应dll拖到ILSpy 也是不识别的。
这种的加密手段一般都是通过修改 mono代码
(现在都是这个函数mono_image_open_from_data_with_name)
在加载dll的时候进行解密,所以需要先还原
libmono.so。
用什么dump呢,自然是需要找一个好点的工具,我是用了GameGuardian来导出内存。需要注意的是,需要配置在激活
GameGuardian 的时候,暂停程序,因为程序一般都会监听 /proc/pid/mem或/proc/pid/pagemap,遇到读内存的时候杀掉自身进程。用这个工具有时候也是不能导出内存,也不知道为什么,有时候就可以。
选择对应的libmono.so地址,主要怕导出的少了,就导出的范围广一些,
14c00000-15000000。导出到文件后就开始分析了。
选用010 Editor来编辑二进制文件,这个工具上有模板插件帮助分析elf文件格式。
修正内存dump出来的so文件还是比较简单的,主要是修正program_header_table。重要的是Loadable Segment和Dynamic Segment,前一个是代码段,后一个是符号表。其他段完全可以设置为0。基本原理就是系统加载so的过程,主要就是段的地址,大小及对齐方式在文件和内存中可能不一样。对于IDA来讲是解析的文件形式的。那么只要把对应文件里面的段地址及大小和对齐改成和内存中的一致就可以了。如下图修改前和修改后的对比
修改前的段的地址
修改后的段的地址
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!