Unity3D和UE4的保护方式与.net的区别

Unity3D
Unity3D是由Unity Technologies开发的一个让玩家轻松创建诸如三维视频游戏、建筑可视化、实时三维动画等类型互动内容的多平台的综合型游戏开发工具,是一个全面整合的专业游戏引擎。 
Unity类似于Director,Blender game engine, Virtools 或 Torque Game Builder等利用交互的图型化开发环境为首要方式的软件。其编辑器运行在Windows 和Mac OS X下,可发布游戏至WindowsMacWiiiPhoneWebGL(需要HTML5)、Windows phone 8和Android平台。也可以利用Unity web player插件发布网页游戏,支持Mac和Windows的网页浏览。它的网页播放器也被Mac 所支持。 
UE4
UE4 : unreal engine 4 是第4代虚幻引擎 对应次世代主机ps4,可以表现出更加惊人的画面, 当人们欣赏到虚幻引擎4后,会被其深邃的特效所震撼到 

.NET
NET是 Microsoft XML Web services 平台。XML Web services 允许应用程序通过 Internet 进行通讯和共享数据,而不管所采用的是哪种操作系统、设备或编程语言。Microsoft .NET 平台提供创建 XML Web services 并将这些服务集成在一起之所需。 

Unity3D保护方式
数据加密Data crypto, Mono加密DLL, Unity3D所有客户端的代码都会以dll文件形式存下来,当游戏应用被开启时c#vm(也就是mono的虚拟机)会去加载所有dll,从而开始运行真正的程序画面了。 

加密过程
Unity通过Mono来达到跨平台的效果。在Build编译时会将你编写的code转为符合CLI的CIL(Common Intermediate Language,中文:中间语言),并且主要的Code会编译在Assembly-CSharp.dll里面,然后再有mono来加载,解析,执行。Mono加载Assembly-CSharp.dll的时候就是读取文件到内存中,和读取一个游戏资源文件没多大区别。所以我们要做的就是把这个Assembly-CSharp.dll文件加密,简单点的可以修改文件的一个字节或者位移一下,破坏其原有的结构。就无法使之通过例如Reflector9VSPro去反编译,因为此时的Assembly-CSharp.dll已经不是一个正确的dll文件了。可尴尬的是,别人没法反编译出文件内容了,Mono自己也不认识了。这将导致,游戏无法运行。所以,我们在对其加密的同时也要加入相应的解密算法。 image.c脚本在游戏运行时会去主动加载Assembly-CSharp.dll文件。那么我们在image.c相应的方法里面加入解密算法,然后从新编译Mono,生成相应的程序集,来替换待解密项目中的相应文件。就可以达到游戏运行正常又安全的效果。 
UE4保护方式
加密过程
1>、获取壳自己所需要使用的API地址
2>、解密原程序的各个区块的数据
3>、重定位
4>、HOOK-API
5>、跳转到程序的原入口点
外壳中可以实现很多软件保护技术,同时对于软件开发商来说是透明的,不需要软件开发商了解低层的保护技术,只需要使用外壳工具进行简单设置,即可生成被保护软件。在外壳中,目前常见的比较成熟的技术有:垃圾代码插入、压缩、调用变换、花指令、指令集转换、系统函数隐藏技术、防篡改保护、反调试技术等。
关于象反调试技术和反篡改等技术,已经有很多相关的资料和文档有很详细的介绍,下面我们将重点介绍关于如何让加密代码和被保护软件的代码融合在一起,让破解者很难通过内存dump的方法得到原始的数据段和代码段等进行重构新的未加密的程序。如何让加密代码和被保护代码融合为一体?我们可以采用以下技术来保护PE文件格式。 

多态和变形
多态既是指完成同一功能采用了不同的方法。多态的特点是随机性和变化性。例如一个检查过程,调用了3个子过程完成全部安全检查机制。应用多态技术,这个检查过程在每次程序运行时,会随机调用不同的子程序并以不同的调用次序来完成全部的安全检查计划。如此,破解者很难跟踪,并做出通用破解补丁。这个随机的初始化过程一般由一个初始化程序完成,这个程序通常称为"多态引擎"。
变形:基于多态技术,它发展和提升了多态技术。它可以动态生成更复杂的检查过程,包括对重要程序片断的动态加密、解密,动态变换全部检查过程的代码和数据,基于内置的各种不同加密算法、解密算法。对目标代码段进行动态控制和编/解码。这其中可能还包括代码混淆过程。使得跟踪者迷惑于复杂的变换和还原过程,无法找到真正的检查过程和解码程序。如果其中包含复杂的加密算法会使得整个安全检查机制十分难于分析和最终的破解。
其实多态和变形技术最开始是使用在病毒上,但是技术本身没有对错之分,如今我们也可以用于对PE文件加密上,它可以保证每次产生的加密文件所使用的保护代码是不一样的,并且每次执行的代码也具有随即性,这样可以增大破解者脱壳的难度

截获系统函数调用
处理引入表函数的目的就是让程序正常运行起来后,仍然需要定期执行加壳程序,否则破解者可以很轻松的对运行程序的内存进行dump,进行脱壳处理。其基本原理就是一般的win32应用程序都会调用向Kernel32.dll等系统核心动态库,通过截获对系统函数的调用达到保护的目的。 

.Net保护方式

为应对.Net框架中软件的版权保护问题,微软公司以及第三方公司都研究并给出了一些解决方案,并形成了一系列的产品。通过对程序进行混淆以及加密等措 施,达到干扰反编译软件或使反编译出来的代码难于理解的目的。本文的研究内容就是市场上这类软件的混淆以及加密的过程。当然我们的研究目的不是要非法破解 他人软件,而是要推动版权保护技术得到更快的发展。另外,通过我们的研究,可以总结出一些软件开发过程中版权保护的规范和几个主流工具的性能与安全指数, 给相关的软件开发人员做参考资料。 
微软提供的解决方案
1) 微软Visual Studio 中提供了一个官方的反汇编程序 ildasm,可以将可执行.Net程序(EXE)或动态链接库(DLL)反编译为IL。同时,提供给用户一个防止程序被ildasm反汇编的方案:在用 户工程的AssemblyInfo.cs中加入一行代码:[assembly: System.Runtime.CompilerServices.SuppressIldasm]作用是让ILDasm.exe不要工作。加入该行后, 运行ILDasm.exe进行反编译。显示 "受保护的模块 – 无法进行反汇编"。不过,目前黑客已经破解了ILDasm.exe,使其可以反编译做了上述标识的文件。所以,该种方案失去了实际的作用。 

强名称
强名称是使用相应的私钥,通过程序集文件(包含程序集清单的文件,并因而也包含构成该程序集的所有文件的名称和散列)生成的。强名称的作用就是防止程序集被非法修改。当对程序集修改后,必须重新用私钥再对程序集加一次强名称。另外强名称还有一个用途,就是它可以防止dll被第三方随意调用。给程序集加强名称的工具为Sn.exe,可以通过Sn / ? 命令看到它的具体使用方法。那么强名称有用吗?网上关于破解强名称的文章很多,ildasm反编译程序集后,在IL文件中将强名称去掉,再利用ilasm编译,就可以解除强名称的限制了。所以说强名称不是一个完善的保护方式。
1>、名称混淆技术名称混淆是最简单的混淆,具体操作是将命名空间、类名、函数名、变量名等替换成没有具体含义的字符串,使原来代码中有含义的名称都失去了原来的含义,这对计算机运行这个程序没有任何影响,但是黑客将程序反编译后,得到的都是无法理解的名称,加大了黑客读懂程序的难度。举例来说,比如右图1是一个注册类。如果想破解这个程序,反编译后一目了然就知道程序要做什么。但如果名称被混淆后,理解起来就没那么容易了。所有的混淆工具都可以提供类似这样的名称混淆功能。某些混淆工具,如Babel Obfuscator,还可以将名称混淆成不可见的Unicode字符,这样在反编译工具中,这些混淆后的名称就都成为了不可见的了,或者显示为乱码。进一步增强了程序的难读性。另外,还需注意的一点是,使用名称混淆时,类库或可执行程序中对外界提供的Public方法不要做名称混淆,否则该方法将无法被外界调用。实际上这种名称混淆的方式,在应用上是有一定不足的。对于大型程序,经过混淆的几百万行没有注释,变量名随机的代码是没人能看懂的,对知识产权起到了保 护。但是,虽说全部解读出原程序来比较困难,但破解者通过动态调试跟踪程序,是可以理解一些关键内容的,比如破解注册信息等还是能够办到的。
2>、字符串加密 字符串里经常包含一些输入输出的信息,破解者通过分析这些信息很容易可以理解程序的意图,所以需要将字符串加密,防止这些信息被解读。字符串加密的实现方法主要分为两种。第一种方法是通过修改IL代码,把原来的字符串替换为一个加密函数。然后在程序的执行过程中,即时的还原原来的字符串。大部分混淆工具提供的字符串加密方法都是这一种。我们举一个具体的例子。在加密前,代码为:MessageBox.Show("Hello World!"); 而在加密后,代码变成:MessageBox.Show(Helper.Decode("A34579dfbbeyu346563345/==")); 这里原来的字符串"Hello World!"被字符串解函数Helper.Decode("A34579dfbbeyu346563345/==")取代。从中无法再看出原来字符串里 包含的信息。字符串加密通常会和名称混淆一起使用,所以真正使用中不会出现象Helper.Decode这么明显的函数名。  但是,这种方法的弊端是很明显的,破解者直接利用这个字符串解函数的代码写一个小工具,就可以还原出原来的字符串,继而再将字符串自动还原到源代码中。第二种方法是在加密壳中提供字符串加密技术。这种方法不修改IL代码,而是直接加密元数据中的字符串。工具Remotesoft、MaxtoCode等采用了这种方法。这类保护也存在着一定弊端,当程序运行后元数据中的字符串会解密到在内存中。通过跟踪内存,可以读取出这些字符串。但比起第一种方法,还是要增加很大破解难度的。
3>、流程混淆技术流程混淆目的是使反编译的时候出错,让反编译工具失效。反编译工具通常使用的是静态分析的方法,为了防止静态分析,常见的方式是使用跳转指令,跳转的目 标位置是另一条指令的中间,这样在静态分析时便会出现混乱。具体操作起来即是把方法中的代码分成若干段,并调整每一段在代码中的先后次序,然后利用跳转语 句按照正确的次序连接出本来的流程。原理图如图2所示。目前主流的混淆器都提供流程混淆,如Dotfuscator Professional版,XenoCode,Babel Obfuscator等。不过,流程混淆也有它的不足,不能防止ILDasm反编译出IL,因为根据微软的设计,ILDasm无法理解的IL,.Net Framework也是无法理解的。IL中"br.s 行号"和"br 行号"都是强行跳转的指令,而流程混淆主要是用这2个语句进行逻辑连接的。这就给破解者提供了一个特征。通过人为的分析,总结出规律,然后再编写代码,将 语句的顺序调整回来,代码最终又会被恢复成可以被静态分析工具反编译。
4>、编译成机器码微软的Ngen.exe工具,可以将 IL编译为机器码。那么是否可以用此来对源代码进行保护呐?就目前Ngen.exe工具现状来看,答案是否定的。微软开发Ngen.exe工具的目的是加 速.Net程序的启动速度,而不是保护源代码。使用Ngen.exe生成机器码的过程依赖于目标机器的具体软硬件环境,所以必须在目标机器上运行编译,此 时必须提供原始的.Net程序。此外,目前有一些产品号称可以使.Net程序脱离.Net Framework运行,是否就是将.Net程序编译为机器码了呐?根据笔者的研究,此类的产品的原理不过是将.Net Framework重新包装,从而使程序运行的目标机器不用安装.Net Framework而已,这跟把.Net程序编译为机器码是两回事。
最后如果你们还有什么疑问,欢迎加入我们的讨论中来,我们共同成长学习,QQ群号:730803578

转载于:https://www.cnblogs.com/yihonghao/p/8919151.html

你可能感兴趣的:(Unity3D和UE4的保护方式与.net的区别)