中文站

DLL脚本加密如何加密?

近几年,手游行业迎来全面爆发,随之而来的各种手游安全问题也越来越多,手游安全保护对开发者来说非常重要。DLL脚本被破解是开发者经常遇到的游戏安全风险,本文主要分享了如何进行Unity mono DLL脚本加密。

1.Unity mono脚本解密

以下为mono脚本文件的二进制形式及源码转换



2.Unity mono DLL脚本加密

通过修改或者HOOK mono_image_open_from_data_with_name能够对DLL脚本加解密。mono_image_open_from_data_with_name是CSharp 脚本的加载函数,如果CSharpDLL脚本做了加密,需要在这个函数执行之前解密。因此只要在这个函数这里下断点或者HOOK,就可以解密出原始DLL,而不需要逆向加密算法。需要注意的是,这里有个memcpy拷贝操作,mono会把解密后的DLL在内存中留存一份拷贝。


Unity mono DLL脚本加密先后经过了三代的技术演进。

第一代加密直接对DLL文件进行加密,在mono_image_open_from_data_with_name函数开始处解密。对于这个的破解方法很简单,PE结构的文件,以4d 5a90 00这四个字节为magic head,这可以做为CSharp DLL脚本的特征,只要搜索0x905a4d这个数值就可以了,由于烧饼修改器是使用10进制数值,将其转换成10进制值:9460301。因此解密门槛很低,只要使用修改器就可以解密。


第二代DLL加密针对第一代加密的弱点,进行了加强防护,提升破解的难度。解密后,把下图所示的PE头抹掉,使得修改器无法定位到脚本位置。因此解密门槛比较高,需要非常强的逆向能力才能破解。


第三代加密针对Csharp 函数做了加密,也就是方法级加密,需动态解密。


原始未加密dnspy函数解析结果


函数加密后dnspy函数解析报错