由浅至深,谈谈.NET混淆原理 -- 五(MaxtoCode原理),六(其它保护方法)

 

新一代NET代码保护工具 MaxtoCode 的原理简介

 

MaxtoCode作为新一代保护工具,他有绝对优于目前所有NET代码保护工具的强度,是目前最保护强度最高的解决方案。但它也有缺点,最大的缺点即是:被加密后的程序集只能在WINDOWS平台下运行,而不能跨平台。但,MS的战略影响,几乎不可能出现官方非WINDOWS平台的NET运行环境,所以,此缺点先忽略不计,也许随着版本的升级,MaxtoCode可能会考虑跨平台的应用。

 

MaxtoCode为什么说是目前最强壮的NET代码保护方案呢?

 

如果大家是老程序员,应该知道Win32中的壳保护方案。这是一个非常好的方案,不过可惜,壳的最终较量变成了Anti debug的较量。因为壳有一个致命的弱点,即在会在内存中完全解开被加壳的程序代码,并将执行指针指向被加壳的程序代码第一行。所以,只要找到被加壳的程序代码第一行,即可以得到原来的程序。这种方式被业界叫做脱壳。

 

MaxtoCode 的原身不是NET语言编写,它借用了Win32的壳概念,并更优于Win32的壳概念(这也是因为NET的特点才能达到这样的程度)。MaxtoCode借助门槛更高的ASM语言,对NET代码进行加密,从而得到了更强壮的NET代码保护方案。

 

MaxtoCode可以理解成NET的壳,但是它是一个不容易被脱掉的壳,如果说Win32的壳是件外套,那么MaxtoCode就是皮肤。壳的特点是在内存中释放所有的代码,而MaxtoCode不会这样做。它比Win32的壳更加安全,它的安全性处决于MaxtoCode的加密算法。这正是MaxtoCode要达到的目地。因为理论上不可能有无法破解的程序,我们要的是无限提高破解成本的保护方案,来迫使破解者放弃对程序的破解。如果MaxtoCode能把破解强度建立在加密算法上,那么,MaxtoCode将能大幅度的提高保护强度。要知道,一,二种算法可能很好破解,可当有一,二十种算法、而且其中还有大量的高强度算法的变种算法,那么,想要完全解出这些算法是一件头痛的事情。最重要的是MaxtoCode还在不停的增加算法,来增加MaxtoCode的安全性。

 

讲了那么多废话,下面,我们来讲述一下MaxtoCode的原理:

首先先说一下CLI的解释原理:

CLI接到程序集需要解释的请求后,动态的从内存中取出一段代码(IL)然后交由CLI解释,CLI解释成机器语言,然后提交给CPU执行,在此中间,还产生大量的静态缓存。特别需要注意的是,CLI是按Method进行解释的。

正因为这样的原理,MaxtoCode则有空间将ASM引入到Method中去。

MaxtoCode的大致工作原理如下:

 

CLI提取MethodIL代码时,MaxtoCode提供的解释环境将MethodIL代码解密回去。

CLI提取完毕后,MaxtoCodeMethodIL代码再进行破坏,达到加密的目地

原理表:

 

CLI > MaxtoCode > IL > CLI > MaxtoCode > 加密

 

从而保证不会象原始的Win32壳一样留下代码在内存中。也保证了将NET的保护安全建立在众多的加密算法之上。

 

同时,由于在未被MaxtoCode解密的情况下是乱码,根本无法被静态反编译,所以不管是高级的反编译,还是低级的反编译,都无法得到一个可读或可看的程序集。

 

动态加、解密成本相对来说提高,所以MaxtoCode在处理结构上做了更多的优化,已经把结构处理得相当的优化,所以,在某些特写的程序上几乎感觉不到MaxtoCode的存在,而且MaxtoCode强制了NET的缓存机制,“一般加密方法”还可以提高运行速度1%~5%。重要的方法使用“高级加密方法”可以得到非常稳定的保护(这里要负责任的说一句,高级加密方法会降低运行效率,根据不同的程序产生不同的影响,最好的效果是完全感觉不到。但我们希望不要全部使用高级加密方法进行加密,而是酌情考虑使用和先测试再使用)。

 

―――――――――――――――我是无敌分隔线―――――――――――――――――

其它保护方法

 

还有一些方法,是无法使用工具去实现的,只有手工去做。

如:类折分,方法折分

一个类,写完后,手工折成上百个类

一个大方法,折成上百个子方法

别觉得这不可能哦,我可亲眼见过这样的程序,不过,从安全性来说……没多大意义,因为Reflector的功能真的太强大,只要你是能够看得见的结构,都逃不了被Reflector分析得一个透彻。

         还有一著名的保护方法:Reflector的保护方法,把自己的核心程序做成一个资源包,然后加密,当需要的时候动态加载,只要你在载入的时候够复杂,还是有一定的保护作用的。其实,这种方法的破解有更好的方法,可以只需要几分钟就可以解破。但今天它不是我们需要讲解的范围,故不详细解说了。免得某些用此方法的同志围抠我。呵呵。

 

好,至此,从浅到深,谈谈NET混淆原理已经讲完了,由于时间很忙,无法给出更多的例子和实战经验,所以希望大家能够举一反三,自己多演练,多研究。如果那天有那位大侠要发布反流程混淆的工具,记得给小弟我留一份,非常感谢。
posted on 2005-07-11 12:08  Jason.NET  阅读(5180)  评论(20编辑  收藏  举报