站??航 : 主頁.文章列表.由淺至深,談談.NET混淆原理 -- 五(MaxtoCode原理),六(其它保護方法)
  由淺至深,談談.NET混淆原理 -- 五(MaxtoCode原理),六(其它保護方法) ( 2005-07-11 12:08 )

新一代 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 混淆原理已經講完了,由于時間很忙,無法給出更多的例子和實戰經驗,所以希望大家能夠舉一反三,自己多演練,多研究。