众所周知,我们伟大的Unity3D引擎为了跨平台的方便,使用了c#作为其基础编程语言,并且以Mono虚拟机为载体,在各个平台流畅运行
随之而来的,是一些让开发者头疼的问题:由于 cs 的语言特性,其在未混淆,未加密的情况下,基本可以视作"开源语言"(类似于Javascript?),这使得游戏的逻辑变得极其不安全,简单举个例子,如果一个未使用IL2CPP和其他手段加密或编译的unity游戏,你可以在他的 根目录/xxx_Data/Managed/Assembly-CSharp.dll
找到几乎全部的游戏逻辑代码,简单使用dnSpy等工具反编译即可篡改游戏逻辑,甚至可以直接引用该库,进行一些调用游戏SDK的行为
为此,开发者也想尽办法阻止这样的行为,目前最有效的Unity游戏保护方法是通过IL2CPP,在开发时便将cs代码通过IL2CPP层翻译成底层代码,从而防止cs代码逻辑泄露。
也有一些厂商,以mono虚拟机为插手点,魔改mono.dll文件(mono是开源项目),在文件存储时对文件进行加密,在游戏启动时再解密加载
本文将阐述关于后者的一些简单研究
国产3A大作之光,s~j~2 开启三测了,其画质相比第一代,确实令人震惊,也看得出开发公司对此下了很大的功夫
游戏采用前言中第二种保护方式(难道是公司没钱用IL2CPP?)
出于兴趣,我想审查一下国产游戏公司代码的严密程度,并提出必要的修改意见
于是兴高采烈的熟练找到 SSJJ2-WD/battle/21/hallclient_Data/Managed/Assembly-CSharp.dll
,拖进dnSpy
结果大失所望
看了看二进制文件,连基本的MZ标识都没有,看来是加密了
由于之前从来没有过解密这类文件的经验,又无奈本人是逆向白痴,对OD,x64dbg一窍不通
在看雪上搜索碰碰运气找到了狂神说大神的这篇文章
[原创]记录U3D逆向Assembly-CSharp-firstpass.dll解密
其中最重要的便是,mono.dll!mono_image_open_from_data_with_name
的函数被魔改
我按照大神的思路,用IDA打开mono.dll看了一眼,却没看到任何有关解密的相关代码,看来此游戏的解密点不在mono_image_open_from_data_with_name
,而在更前面
按理来说,应该开始动态调试往上跟进,奈何本人没文化,一句卧槽走天下,游戏的禁止调试,成为了压倒我的最后一根稻草
看来分析解密算法对我来说已经不太可能了,忽然想起以前在github fork过mono的源代码:mono_github,怀着试一试的心情,我翻阅了/mono/metadata/image.c
里的mono_image_open_from_data_with_name
函数
恍惚间,突然想起一个好点子:
抱着试一试的想法,写了一个简单的链接库,然后用注册表注入
结果如意料之中的那样,成功的dump出了原始dll文件,看到MZ标志的那一刻,通往罗马的道路,又多了一条
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!
最后于 2020-8-21 23:12
被renbohan编辑
,原因: