Mono dll 脚本是 Unity 前期包含现在还有很多游戏在使用的脚本方式,这种脚本可以使用工具(如 dnspy)完全逆向。破解者改包和竞品分析的难度非常低。
很多有安全意识的游戏都会自己修改 mono 源码的 mono_image_open_from_data_with_name 函数,对 DLL 脚本进行加密。不过这种的加密方式缺点比较明显, 会在加载前进行一次性解密,游戏运行过程中,内存中存在解密后完整的 DLL。只要使用现成的工具就可以把 DLL 从内存里面 dump 出来。
如上图,使用 GG 修改器,使用 9460301 数值即可把所有的 DLL 脚本内存基址搜索出来。
目前很多手游加固厂商都还是使用这种加固方式。
第二代 DLL 加固,对 DLL 里面的函数进行加密,这种加密方式的优点是,使用的方法才会进行解密,不像整体加密那样,会一下子把完整的 DLL 解密到内存中。
一般游戏运行过程中不会用到所有方法,这样内存中就不会存在一个完整的 DLL。
方法解密的效果对比如下:
原始未加密 dnspy 函数解析结果:
函数加密后 dnspy 函数解析报错:
第二代 DLL 加固存在的缺点是解析工具还是可以看到函数名及部分函数。于是出现了第三代 DLL 加固。
第三代加固我们称为 DLL 结构虚拟化。对 DLL 的文件结构进行自定义重构,并对文件结构数据进行高强度加密。处理完后,所有的工具都无法再解析出任何数据,对于专业的破解分析人员,要解密出里面的结构数据难度也是非常大。
虚拟化后 dnspy 无法识别 DLL:
DLL 脚本使用的数据结构跟 windows 下面的可执行文件一样,都是 PE 结构,未 DLL 结构虚拟化时,使用 010Editor 可以解析出正常的 PE 结构。
虚拟化后的 DLL 结构 010 Editor 无法正常解析:
第三代 DLL 加密为 FairGuard 独家首创,为手机游戏安全防护提供业界顶级加密方案。
FairGuard 是一家专注于游戏加固及反外挂的安全服务商,为手游安全保护提供一站式的解决方案。公司创始人专注于安全领域 10 多年,前网易易盾手游保护负责人,从 0 到 1 主导了易盾手游保护项目。欢迎访问 www.fair-guard.com 了解更多内容。