如何绕过某讯手游保护系统并从内存中获取Unity3D引擎的Dll文件
某讯的手游保护系统用的都是一套,在其官宣的手游加固功能中有一项宣传是对比较热门的Unity3d引擎的手游保护方案,其中对Dll文件的保护介绍如下, “Dll加固混淆针对Unity游戏,对Dll模块的变量名、函数名、类名进行加密混淆处理,有效提高静态分析门槛”。
通过动态分析了它的保护方法,通过改源码刷机的方法绕过了它的保护方案(也可通过hook libc.so中的execve函数绕过保护),接下来就可以直接使用GameGuardain这个神奇附加上去进行各种骚操作了。这里主要讲一下如何去从内存中获取Assembly-CSharp.dll 和 Assembly-CSharp-fristpass.dll文件。
绕过保护后,先启动GameGuardian,再启动相关游戏,在某讯的Logo刚好出现时附加到游戏上,待游戏进入到登录页面时,通过内存搜索值的方式搜索9460301(0x4D 5A 90 00)的十进制表示方式。这也是PE文件Dos头的特征码。搜索步骤和结果如下:
![](https://static001.geekbang.org/infoq/a4/a4a1b6bd8777911de3e4b98a90fd2853.png)
![](https://static001.geekbang.org/infoq/52/52cac814a7880b291372a2199dc7dccf.png)
记录下第一个值和最后一个的值,接下来的dump步骤需要(dump时,开始地址尽量比第一个值小,结束地址尽量比最后一个地址大,上下浮动的大小尽量大于游戏中最大的Dll文件所占内存大小)。
![](https://static001.geekbang.org/infoq/5e/5e28bcc2974524722f17fcbb0288d3d8.png)
等待保存完毕以后就可以从手机上拉取到本地了。获取到文件的结果如下:
![](https://static001.geekbang.org/infoq/c5/c5a6b81c62b1544a4ad5901450e00248.png)
接下来可直接使用get_dll_from_bin.exe这个工具直接从所有的bin文件中dump出所有的dll文件。操作后可用dnSpy直接打开所有的dll文件查看是否存在Assembly-CSharp.dll和Assembly-CSharp-fristpass.dll这两个文件。结果下图(本次获取到12个dll 文件):
![](https://static001.geekbang.org/infoq/3b/3bd20d9c3c62538874987d7d9a258b44.png)
工具获取到dll后直接使用数字命名,直接通过dnspy打开看看是否有最终的目标dll。
获取到dll如下:
![](https://static001.geekbang.org/infoq/e5/e5c60717aa3b12961163e7ffc73392e3.png)
并不存在所需要获取的dll文件。后面经过分析可知这套保护方案把Dos头的前128字节清空了。接下来就需要单个文件进行操作和修复了,使用010editor打开文件,搜索PE头的文件特征(50 45 00 00 4c 01 03 00)。然后通过搜索到的位置往前查看128字节是否被清零,如果是先把正常的pe文件的前128个字节复制,再往搜索到的位置的往前128字节进行粘贴修复即可。如图:
![](https://static001.geekbang.org/infoq/4a/4a4127972d494fbc560d4a1a2ad02c0c.png)
![](https://static001.geekbang.org/infoq/ca/cae591e239c4984d07770464f101b519.png)
经过反复操作和修复后,再通过get_dll_from_bin.exe操作修复的bin文件即可。
经过操作后获取到如下的Dll:
![](https://static001.geekbang.org/infoq/e8/e88fa11d2b3f066dc5ee0d7bab9a9a08.png)
通过与解包后的资源文件大小相比较,3.dll大小和Assembly-CSharp.dll相同。
12.dll大小和Assembly-CSharp-firstpass.dll相同。
分别将3.dll 和12.dll文件拖入dnspy中,如图所示3.dll是目标文件Assembly-CSharp.dll:
![](https://static001.geekbang.org/infoq/cd/cd8cd0a544e37638abefd83095acfe94.png)
12.dll是Assembly-CSharp-fristpass.dll:
![](https://static001.geekbang.org/infoq/95/95b763d0c8f9c77b2fb88952b290f718.png)
到此,所有目标文件已经获取完毕。
排版有点渣,将就看吧。主要是思路。望大牛轻喷。
最后 我们分享个好用的工具。
使用ipaguard来对程序进行加固
代码加固是进一步保护应用的一种方式,通常通过特定平台来对应用进行加固处理。
这边以ipaguard为例,目前还在免费阶段,想薅羊毛的快快试试。
Ipa Guard是一款功能强大的ipa混淆工具,不需要ios app源码,直接对ipa文件进行混淆加密。可对IOS ipa 文件的代码,代码库,资源文件等进行混淆保护。 可以根据设置对函数名、变量名、类名等关键代码进行重命名和混淆处理,降低代码的可读性,增加ipa破解反编译难度。可以对图片,资源,配置等进行修改名称,修改md5。只要是ipa都可以,不限制OC,Swift,Flutter,React Native,H5类app。
![](https://static001.geekbang.org/infoq/c7/c79b60ca84e9f2e794ae31b3e1ca853b.png)
所以就要使用到混淆器,混淆器是把里面的代码变量等信息进行重命名,这样可读性会变得非常差,接着,
到这里,我们完成了对代码的混淆,但是还没有进行加固,防止反编译,所以,请往下看
然后导入自己的包就可以了,这里是流水式的走下来,所以只需要导入和导出就可以了,
![](https://static001.geekbang.org/infoq/3d/3d3a02d08ed67fe8e3110e05e725d749.png)
添加单个文件,选择好刚刚混淆后的包,然后你做的事情就是等,等待上传完--加固完--下载完--已完成,当到已完成的时候,说明这里已经可以导出了,导出需要前面提到的自己创建的签名,这里可是会用到的,如果不用,则包安装包可能会出现问题
选择导出签名包,选择签名文件,输入密码,然后点击开始导出
![](https://static001.geekbang.org/infoq/5b/5b9836a1d48fb35cc89e0e236af98008.png)
导出的包是经过混淆,经过加固比较安全的包了