Unity3D游戏框架之dll反编译和混淆

版权声明:By XM肖牧 https://blog.csdn.net/yye4520/article/details/89345557

随着Visual Studio 2019正式版的发布,加上Unity2018.3.x版本的更新迭代,我又有了尝新的欲望了,哈哈哈!

借着这个契机,我有了重新整理框架的想法了,就是把框架编译成动态链接库dll,并且我把电脑系统还原了,所有的环境都将是最新的。

安装所有最新的环境

  • Visual Studio 2019正式版
  • Unity2018.3.10(现在不是最新的了)
  • JDK1.8.0
  • android-sdk-windows

创建我的框架类库

首先到官网下载最新版本的Visual Studio 2019,专业版和企业版的密钥网上自己搜。

安装完成后,我选择类库模板创建我们的框架类库。

然后引入UnityEngine.dll,UnityEngine.UI.dll,最后我把框架的代码都移植过来了。

然后在类库的属性里选择目标框架为 .NET Framework 4.6,之前大家都是用3.5是因为Unity只支持3.5,现在Unity 2018.3的脚本运行时版本默认是4.x了。

值得注意的是,在Unity2018.3.x打开C#脚本时,Visual Studio会弹出下面提示框,提示我们去下载.NET Framework 4.7.1版本的框架,我们选择第二个下载.NET Framework 4.7.1。

选择.NET Framework 4.7.1的开发包下载。

然后我遇到一个问题就是安装完之后再打开脚本还是提示我没有安装.NET Framework 4.7.1的框架,我搞了半天才知道怎么回事。原来这里下载的框架是电脑系统的.NET框架,然后Visual Studio也要有.NET Framework 4.7.1这个框架才可以,这是两个不同的环境,不要搞混了!

接着我们在开始菜单中找到Visual Studio Installer,打开后点击修改按钮,进入到安装目录,切换到单个组件,勾上.NET Framework 4.7.1 SDK和.NET Framework 4.7.1 目标包,最后安装即可。所以我怀疑,Unity 2018.3.x是不是支持.NET Framework 4.7.1框架的动态链接库?我没试,你们可以试试看告诉我。

这个步骤完成之后我们就可以编译了,然后把生成的dll复制Unity工程的Plugins文件夹里面。

接着我尝试发布Unity安卓包,Scripting Runtime Version默认是.NET 4.x Equivalent,Api Compatibility Level设置为.NET 4.x。

打包的时候出现了这个错误,原因是我在框架里面使用了UnityEditor.AssetDatabase.LoadAssetAtPath()函数,引入了UnityEditor.dll,注意!框架的dll不能引入UnityEditor.dll!后来我通过外部注入管理器的方式重写虚方法解决了这个问题,千万不要用宏来做,在Visual Studio里面定义的宏并不能像Unity那样动态识别,在编译成dll之前就已经是固定死了。

最后成功发布到安卓包了,至于怎么写动态链接库和调用其实很简单,这里就不扯了。

动态链接库反编译

打开Visual Studio的管理拓展,在联机搜索ILSpy反编译工具并且安装,ILSpy是开源免费,至于.Net Reflector是收费,自己选择。

安装完后,选择工具栏的ILSpy。

然后打开框架的dll,可以直接反编译看到代码。

动态链接库的混淆

本来想用加密的方式来处理,但是需要在mono上做解密,有点麻烦,并且现在大多数都是用IL2CPP的方式打包了,所以我就直接用混淆的方式来处理dll好了。

打开Visual Studio Installer,在工作负载上点击.NET桌面开发,勾上PreEmptive Protection - Dotfuscator之后安装。

安装完成后打开工具栏的PreEmptive Protection - Dotfuscator。

点击输入的加号按钮,添加我们的dll。

然后点击重命名的排除,再点击添加类型,在名称上填写“+public”,表示所有public的变量和函数都不进行混淆,这样我们才可以通过外部去调用,注意,如果dll里的代码有用到Awake,Start,Update,OnDestory等Unity自带的函数,都必须改成public,否则这些函数将被混淆,导致不能自动调用。

最后点击生成按钮,就会自动进行代码混淆。我们再打开ILSpy反编译工具查看刚才混淆过的dll,发现那些私有变量和函数的名字都重命名了,变得难以阅读。如果你想让你的dll变得更加难以反编译,可以购买pro版本,可以对dll的字符串加密,使其无法看到函数内部正确的逻辑,还可以进行控制流模糊处理,阻止反编译和增加反编译的复杂度。

我们把自己的框架编译成混淆的dll,这样就不用担心自己的代码裸奔了,至少可以防止小白反编译,平时开发的时候用mono,编译速度快,发布正式版本的时候再用IL2CPP,代码执行效率高,还不容易反编译。最后,我们还可以再用360的加固软件加壳一下,但是对于逆向工程的大神来说,这都是小意思,各种反编译和脱壳防不胜防。

猜你喜欢

转载自blog.csdn.net/yye4520/article/details/89345557