日期:2009-01-05 浏览次数:20488 次
新一代 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 提取 Method 的 IL 代码时, MaxtoCode 提供的解释环境将 Method 的 IL 代码解密回去。
当 CLI 提取完毕后, MaxtoCode 将 Method 的 IL 代码再进行破坏,达到加密的目地
原理表:
CLI > MaxtoCode > IL > CLI > MaxtoCode > 加密
从而保证不会象原始的 Win32 壳一样留下代码在内存中。也保证了将 NET 的保护安全建立在众多的加密算法之上。
同时 , 由于在未被 MaxtoCode 解密的情况下是乱码,根本无法被静态反编译,所以不管是高级的反编译,还是低级的反编译,都无法得到一个可读或可看的程序集。
动态加、解密成本相对来说提高,所以 MaxtoCode 在处理结构上做了更多的优化,已经把结构处理得相当的优化,所以,在某些特写的程序上几乎感觉不到 MaxtoCode 的存在,而且 MaxtoCode 强制了 NET 的缓存机制,“一般加密方法”还可以提高运行速度 1%~5% 。重要的方法使用“高级加密方法”可以得到非常稳定的保护(这里要负责任的说一句,高级加密方法会降低运行效率,根据不同的程序产生不同的影响,最好的效果是完全感觉不到。但我们希望不要全部使用高级加密方法进行加密,而是酌情考虑使用和先测试再使用)。
―――――――――――――――我是无敌分隔线―――――――――――――――――
其它保护方法
还有一些方法,是无法使用工具去实现的,只有手工去做。
如:类折分,方法折分
一个类,写完后,手工折成上百个类
一个大方法,折成上百个子方法
别觉得这不可能哦,我可亲眼见过这样的程序,不过,从安全性来说……没多大意义,因为 Reflector 的功能真的太强大,只要你是能够看得见的结构,都逃不了被 Reflector 分析得一个透彻。
还有一著名的保护方法: Reflector 的保护方法,把自己的核心程序做成一个资源包,然后加密,当需要的时候动态加载,只要你在载入的时候够复杂,还是有一定的保护作用的。其实,这种方法的破解有更好的方法,可以只需要几分钟就可以解破。但今天它不是我们需要讲解的范围,故不详细解说了。免得某些用此方法的同志围抠我。呵呵。
好,至此,从浅到深,谈谈 NET 混淆原理已经讲完了,由于时间很忙,无法给出更多的例子和实战经验,所以希望大家能够举一反三,自己多演练,多研究。