Unity3D项目程序加密2——对dll进行混淆
2015-07-14 10:46
423 查看
之前一篇文章阿赵已经简单的介绍了怎样把自己写的代码打包成dll动态链接库,然后在Unity3D里面用。那么接下来的事情似乎就很简单了,我们在Unity3D里面写脚本,到最后完成时,把核心的代码剪切出去打包成dll文件再放回项目里面。这样似乎别人就不能直接修改你的代码了。事实真的是这样吗?
这里假设我们在Unity3D里面写的代码抽象成这样一个Test类,里面包含了公开和私有的变量,有自带的Start方法、Update方法和OnGUI方法,还有public、private和protected方法。虽然说用抽象类代表了项目里面实际的类,但为了可以看得到代码效果,所以在方法里面大概写了一些简单的打印的命令。
把这个Test类放到上次的类库项目里面,然后生成dll,放到Unity3D项目里面:
其实要看到dll里面的内容,很多软件都可以,我们这里就拿Unity3D自带的MonoDevelop来看。找到引用里面的dll文件,这里是AzhaoDll.dll。
可以直接浏览到dll里面的内容,看看刚才那个Test类,是不是每一个变量、每一个方法都一字不缺的显示出来了?
还有上次写的Math3D方法,也能直接看得到。
dll就是这么不保险的一个东西,所以我们要引入这一篇文章的内容:对Dll进行混淆。
.Net的代码混淆器有好几种,比如VS自带的DotFuscator、小巧的Reactor,或者相对比较专业的xeoncode。
这里我使用了xeoncode 2010版本。
界面如下:
来到Application,可以添加dll文件:
选择需要混淆的dll:
然后在Project可以看到dll里面的类、变量和方法。看到某些变量和方法前面打了勾,这是需要混淆的意思,这个可以自己调整,后面再说:
在Output里面选择一个输出的路径:
然后点击右下角的Build Application,就可以发布混淆好的dll。
把混淆好的dll放回Unity3D项目,就可以看到,这次的dll里面出现了很多随机数字和字母组成的变量名称和方法名称:
仔细的看,可以看出,刚才打钩了的方法和变量都变成乱码名称,然后在方法调用里面也会发生一些变化,除了名称改变以后,代码本身也会发生一些变化,没有之前那么直接的显示出调用的情况,如果是复杂的调用,将会出现goto来代替了。
这样一来,就算是写代码的人自己也很难看得明白这些代码了。当然如果真的非常有心的逐个变量方法名称去对应,逐个goto调用去查找,也还是可以还原的,但估计很少人会话这个功夫去做这种事情。到这里,混淆的目的就达到了。
不过现在拿这个dll去实际运行,会发现出现很多问题的,比如Unity3D自带的方法Start、Update之类的是不会执行的。这是因为混淆的时候把一些不应该混的东西给混淆了。
那么接下来就说一下注意的事项:
1、public和protected的变量和方法,默认是不会混淆的,你也可以手动的把勾打上,让它混淆,不过由于这些是被外部调用的变量和方法,你混淆了它的名称,那么外部调用的时候是必然出错的。
2、像Unity3D的Start、Update、OnGUI等MonoBehaviour自带的方法,都是具有特定含义的,虽然是私有方法,但也不应该混淆,不然到了该执行的时候就不会执行了。
3、某些有特定含义的名称,或者有用到使用字符串来识别变量或者方法名称时,这些方法和字符串都不应该混淆,不然也会出现调用不到的情况。
以上是简单的使用方法,具体的情况可能要到真正用的时候才会出现,所以就随机应变了。
这里假设我们在Unity3D里面写的代码抽象成这样一个Test类,里面包含了公开和私有的变量,有自带的Start方法、Update方法和OnGUI方法,还有public、private和protected方法。虽然说用抽象类代表了项目里面实际的类,但为了可以看得到代码效果,所以在方法里面大概写了一些简单的打印的命令。
把这个Test类放到上次的类库项目里面,然后生成dll,放到Unity3D项目里面:
其实要看到dll里面的内容,很多软件都可以,我们这里就拿Unity3D自带的MonoDevelop来看。找到引用里面的dll文件,这里是AzhaoDll.dll。
可以直接浏览到dll里面的内容,看看刚才那个Test类,是不是每一个变量、每一个方法都一字不缺的显示出来了?
还有上次写的Math3D方法,也能直接看得到。
dll就是这么不保险的一个东西,所以我们要引入这一篇文章的内容:对Dll进行混淆。
.Net的代码混淆器有好几种,比如VS自带的DotFuscator、小巧的Reactor,或者相对比较专业的xeoncode。
这里我使用了xeoncode 2010版本。
界面如下:
来到Application,可以添加dll文件:
选择需要混淆的dll:
然后在Project可以看到dll里面的类、变量和方法。看到某些变量和方法前面打了勾,这是需要混淆的意思,这个可以自己调整,后面再说:
在Output里面选择一个输出的路径:
然后点击右下角的Build Application,就可以发布混淆好的dll。
把混淆好的dll放回Unity3D项目,就可以看到,这次的dll里面出现了很多随机数字和字母组成的变量名称和方法名称:
仔细的看,可以看出,刚才打钩了的方法和变量都变成乱码名称,然后在方法调用里面也会发生一些变化,除了名称改变以后,代码本身也会发生一些变化,没有之前那么直接的显示出调用的情况,如果是复杂的调用,将会出现goto来代替了。
这样一来,就算是写代码的人自己也很难看得明白这些代码了。当然如果真的非常有心的逐个变量方法名称去对应,逐个goto调用去查找,也还是可以还原的,但估计很少人会话这个功夫去做这种事情。到这里,混淆的目的就达到了。
不过现在拿这个dll去实际运行,会发现出现很多问题的,比如Unity3D自带的方法Start、Update之类的是不会执行的。这是因为混淆的时候把一些不应该混的东西给混淆了。
那么接下来就说一下注意的事项:
1、public和protected的变量和方法,默认是不会混淆的,你也可以手动的把勾打上,让它混淆,不过由于这些是被外部调用的变量和方法,你混淆了它的名称,那么外部调用的时候是必然出错的。
2、像Unity3D的Start、Update、OnGUI等MonoBehaviour自带的方法,都是具有特定含义的,虽然是私有方法,但也不应该混淆,不然到了该执行的时候就不会执行了。
3、某些有特定含义的名称,或者有用到使用字符串来识别变量或者方法名称时,这些方法和字符串都不应该混淆,不然也会出现调用不到的情况。
以上是简单的使用方法,具体的情况可能要到真正用的时候才会出现,所以就随机应变了。
相关文章推荐
- Unity3D项目程序加密1——在Unity3D里使用自己的dll
- 用Unity3D和VuforiaSDK简单做AR应用(实战)
- UnityShader实例08:溶解消融(Dissolve)材质
- 基于unity的飞行模拟设计
- unity 3d实例化位置出现布置?
- Unity3D音频播放器 动态装载组件
- Unity3D 渲染顺序统一解决方案(主要是2D游戏)
- UNITY 5.0.2 发行说明 中文版
- Unity3D之空间转换学习笔记(二):基础数学
- 用Unity3D和VuforiaSDK简单做AR应用(入门)
- (转)【风宇冲】Unity3D教程宝典之Blur
- Unity3D - 动作动画忽略timeScale
- Unity自动录音自动播放功能
- Unity3d 刚体碰撞器
- unity3d 实现夜视仪效果
- 关于unity3D中的坐标问题
- Unity旧版动画系统
- Unity常用快捷键
- Unity3D它Button包
- unity IOS xml序列化真机运行JIT问题