DOTNET防止反编译
DOTNET防止反編譯
目錄
第一部分 相關理論
一 防止反編譯概述
二 DOTNET編譯原理簡介
三 被反編譯的后果
四 保護方案分類
第二部分 實踐
一 Net強名稱工具SN.EXE
二 使用Dotfuscator
三 Net加殼與脫殼
第三部分 推薦方案
第一部分 相關理論
一.DOTNET防止反編譯概述
?? ?作為商用程序,C#如同 java一樣,很容易被反編譯。甚至VS還自帶了一個反編譯的工具。打開 Visual Studio, “工具”->“ILDASM”,就可以直接看到所有的變量,結構體,函數名稱,都和你的源碼里一模一樣。如果使用更強大的 Reflector,就直接看到C#源碼了。這對于商用程序的知識產權的保護是很不利的。除了代碼會泄露,寫在程序里的連接數據庫的用戶名和密碼,都成了明文。
?
有一個辦法就是進行混淆。使用它對生成的EXE進行轉換。可以將變量名,過程名,都變成無意義字母,這樣反編譯得到的可讀性就會降低好多了。
也可以進行加殼,加殼后的EXE和DLL是不能被反編譯出源代碼的,但要防止脫殼;如被脫殼則可反編譯出源代碼。
二.DOTNET編譯原理簡介
?? ?Dotnet是一種建立在虛擬機上執行的語言,它直接生成 MSIL 的中間語言,再由DotNet編譯器 JIT 解釋映象為本機代碼并交付CPU執行。這種語言的優點就是您不需要去考慮您的程序在那里運行,您只需要把功能做出來,虛擬機會在任何地方實現您的功能。但虛擬機的中間語言由于帶了大量的“元數據”信息,所以也極容易被反編譯。
三.被反編譯的后果。
1.知識產權方面,辛苦研究出來的算法,被公開了。
2.源代碼泄漏,被競爭對手拿去和你競爭。
從客戶那里想辦法copy回一份別的公司的產品,然后反編譯后,改改圖片,圖片以及版權信息和注冊信息,就拿出去賣了。正規的公司一套賣二萬,它們一套才8千。
3.自己產品的注冊機滿天飛
4.被別人植入惡意程序,后果得由作者或開發商承擔。
?? ?Dotnet的程序集,不保護是不行的。
四.保護方案分類
<一>.由MS提供的非第三方保護方案
a.強名稱
強名稱使用 sn 命令。
強名稱的作用就是防止程序集被非法修改,當對程序集修改后,必須重新用您的私鑰再對程序集加一次強名稱,這也是如果含有強名稱的程序集在混淆或加密后必須要重新加強名稱的原因。
網上破解強名稱的方法很多,Ildasm反編譯加過強名稱的程序集后,在IL文件中將強名稱的相關信息去掉,再利用Ilasm編譯,就可以解除強名稱的限制了。有人已經過測試,您的強名稱的PublcKey不管是加在程序集中,還是加在Class中,都可以被去掉,所以強名稱不是一個完善的保護方式。
?? ?強名稱的一個特殊用途,它可以使您的dll不被第三方調用。
b.編譯MSIL為本機代碼
可以使用 Ngen.exe 將 MSIL 代碼編譯為本機代碼。
Ngen是MS提供的 本機映象生成器,它可以將中間語言程序集編譯為本機代碼存放在緩存中。Dotnet在內存中建立了一個緩存,這個緩存中存放了許多常用的程序集編譯后的本機代碼,它們是常駐的,由此來加快Dotnet的執行速度。
<二>.編程技巧保護方案
a.人為混淆
混淆,就是混亂,不明確的意思。MetaData中都有一個Rid,程序集運行時就已經和名稱沒什么關系了,都使用Rid來調用的,所以可以將名稱省去。現在的Dotnet程序集的分析工具都很強大,正引用,反調用都可以用程序來實現,所以即實這么做了,沒多大用處。Reflector就有這些功能。
?? ?最簡單的混淆是名稱混淆,即將 命名空間名、類名、方法名、字段名等統統換成特殊符號或其它符號,目的就是讓你不能與以前的名稱建立關聯。
?? ?流程混淆就是把原來程序的執行流程打亂。比如把一個函數拆成三個小函數,三個小函數通過跳轉等方式連接起來,功能和混淆之前的一樣。以迷惑反編譯者。
b.隱藏程序集
Reflector就是使用這種方式來隱藏自己的核心程序集的。Reflector并不是您看到的那一個可執行程序,它的可執行程序只是一個殼,里面是一個定義和接口,沒有實例的方法。它是怎樣做的呢?它的核心程序集事實上就是它的一個資源。而這個資源是一個加密的資源。Reflector是在雙擊第一個需要反編譯的Method的時候開始釋放這個資源,并對資源解密然后動態的加載。這樣做的優點核心程序集是不會在硬盤上留下任何痕跡的,它只解在內存中解密并被加載,你基本上無法得到這個程序集。Dotnet是不允許內存 Dump的。
你可以把你的核心代碼加密后做成資源包在程序里,在使用的時候再解密出來,這只需要你自己去實現就可以了。
c.將程序集中的相關Method(方法)編譯成Unmanaged(非托管代碼)
它可稱之為終極的保護手段。簡單的說,托管代碼就是需要Jit去解釋的中間語言代碼,而非托管代碼就是本機代碼。
非托管代碼是無法被現在的反編譯工具反編譯的。在Dotnet程序集中,允許托管代碼和非托管代碼共存。它的條件就是必須使用VC++.NET非托管方式來寫dll,再用VC++托管方式建立工程引入這個本機代碼的dll。最終生成一個Dotnet程序集的dll。那么這個程序集里面即有托管代碼,又有非托管代碼。托管代碼是可以反編譯的,而非托管代碼不可能被反編譯。
<三>.第三方保護工具
第三方保護工具較好的廠商有:
Aiasted.SOFT,產品 :MaxtoCode ,種類 :加密、混淆
PerEmptive Solutions,產品 :Dotfuscator Community ,種類 :混淆
Remotesoft,產品 :Remotesoft Protect ,種類 :加密
? ? ? ? ? ? 產品 :Remotesoft Dotfuscator ,種類 :混淆
XenoCode,產品 :XenoCode ,種類:混淆
第三方工具的保護方式分類
a.混淆
混淆軟件一般都有三個功能:字符串加密;名稱混淆;流程混淆。
b.打包
ThInstall 是一個打包工具,他可以打包幾乎所有的應用程序,也包括Dotnet。將多個Dotnet程序集包在一個大程序里,達到無法反編譯的目地。不過既然是打包,在需要運行時肯定會釋放,如果找到了釋放出來的文件,就跟沒保護一樣了。
c.加密?
加密保護的軟件都有一個共同點,即把Dotnet的反編譯引深到Win32的反匯編中了,可惜的是,也限制了Dotnet跨平臺的優勢。
MaxtoCode的實現原理。MaxtoCode是中國第一款高強度的Dotnet保護軟件,在世界的Dotnet保護水平線上也處于優勢性的領先。MaxtoCode的原理,它是將程序集中所有的IL進行加密,所以使用反編譯器無法看到IL,從而不能進行反編譯。基于Framework提取Method的IL作為基礎原理,當JIT需要IL時,我就將加過密的IL解密給JIT去編譯,這就是MaxtoCode的基本原理。
MaxtoCode 加密的過程及結果:
1.選擇程序集?
2.選擇高級加密的選項
3.選擇混淆的選項
4.加密
5.結果
<四>.加殼
? ?加殼的全稱是可執行程序資源壓縮,是保護文件的常用手段。 加殼過的程序可以直接運行,但是不能查看源代碼.要經過脫殼才可以查看源代碼。
?? ?加殼是利用特殊的算法,對EXE、DLL文件里的資源進行壓縮、加密。這個壓縮之后的文件,可以獨立運行,解壓過程完全隱蔽,都在內存中完成。附加指令在原程序上通過Windows加載器載入內存后,先于原始程序執行,得到控制權,執行過程中對原始程序進行解密、還原,還原完成后再把控制權交還給原始程序,執行原來的代碼部分。加上外殼后,原始程序代碼在磁盤文件中一般是以加密后的形式存在的,只在執行時在內存中還原,這樣就可以比較有效地防止破解者對程序文件的非法修改,同時也可以防止程序被靜態反編譯。
第二部分 實踐
一. Net強名稱工具SN.EXE
1 編寫一個程序,按常規方式編譯,提取編譯后的程序集和公鑰信息,結果如下圖所示;
公鑰相關信息為空;
2 用VS自帶的命令行工具SN.EXE 生成一個公鑰對;并存入test.snk 密鑰文件;
3 采用2的密鑰文件,在命令行用強名稱簽名的方式對上述程序再次進行編譯;
4 再次運行程序提取程序的程序集和公鑰信息,結果如下,程序中增加了公鑰相關信息;
當執行經過強名稱簽名的程序集時,如果在強名稱簽名后該程序集被修改過,則會報異常,不能運行。
二. 使用Dotfuscator
1 使用VS自帶的未注冊的Dotfuccator進行混淆
Dotfuscator是VS里面一個自帶的.NET混淆器和壓縮器,它可以幫助您防止您的應用程序被反編譯。用Dotfuscator混淆之前反編譯的結果如下,可看到全部源代碼:
使用Dotfuscator混淆后,再反編譯,結果如下;可看出已經有了一定的混淆效果;一些變量名稱被替換成了無意義的a、b、c、d等;
2 注冊過的Dotfuscator功能有限,可配置選項較少
3 Dotfuscator的配置
安裝好Dotfuscator ,打開界面,有幾個需要配置的地方: Options、Input、Rename、String Encryption、Build。
三 .Net加殼與脫殼
? ? 以自編Winform程序StrongNamef.exe和xxxxxxxx.dll為需要保護的目標程序為例,來進行加殼與脫殼。
1 未加殼之前用Reflector進行反編譯,均可直接反編譯出源代碼,如下圖所示;
2 選擇用Sixxpack_2.4進行加殼,加殼后不能反編譯出源碼,或直接不能反編譯,如下二圖所示;
以下用各種.Net脫殼軟件進行脫殼;
3 使用NETUnpack對上述兩個加殼后的程序脫殼,不能脫掉;
4 使用de4dot對上述兩個加殼后的程序脫殼,不能脫掉;
5 使用DotnetDumper進行脫殼,該工具不能脫dll的殼,也不能脫StrongNamef.exe所加的殼;
6 用查殼工具PEID V0.95進行查殼,查不到xxxxxxxx.dll所加的殼,對StrongNamef.exe則可查出程序是.Net開發的并帶有GUI界面;如下圖;如果查不出是什么殼也是安全的;
如果PEID查到殼,則會顯示出所查到殼的類型,以下是PEID查到一個叫Nullsoft PiMP Stub殼所顯示的示例;
7 用UnPack4Sixxpack進行脫殼,不能脫掉。
8 加殼的注意事項:
1) 關于圖標文件,開發項目的圖標文件要單獨存一份,否則用Sixxpack加殼后程序圖標會消失。
2 ) 加殼后原文件有可能變大或變小。
3) 加殼的保護時間一般為1年左右,1年之后有可能有人開發出所用加殼軟件對應的脫殼軟件放到網上,需要使用更高版本或更新的加殼軟件進行加殼
4) 文檔需要保密,如果被反編譯者知道所用的加殼軟件,則可能比較容易被脫殼,從而被反編譯。
5) 加殼的程序發布之前需要測試,偶爾的情況下,360殺毒軟件會把加過殼的程序誤報為病毒。對于別的保護方式進行保護的程序,360也有可能誤報為病毒。如果發生此情況,需要在360中選擇信任此軟件,以后就不會再誤報。
第三部分 推薦方案
MactoCode工具的價格為一臺電腦帶狗1700元, 5臺電腦帶狗5000多元。
Dotfuscator為VS附帶的由第三方國外廠家提供的保護夠工具,需要注冊才能提供全部功能。登錄該第三方廠家網站一直不能注冊成功。網上下載的Dotfuscator僅支持到.Net Framework 3.5。
鑒于以上,目前較好的一種方案是;
如果系統可編譯為.Net 3.5及以下版本,則先把系統編譯為Net 3.5版本,然后用網上下載到的Dotfuscator破解版進行混淆;混淆之后再用Sixxpack_2.4進行加殼。
如果系統須編譯為.Net 4.0及以上版本,編譯系統后,用Dotfuscator非注冊版進行一定程度的混淆;然后再用Sixxpack_2.4進行加殼。
以上方案在1年之后應該要更新所用工具的版本,或尋找更強的混淆和加殼工具。
附件:
程序1:
?? ?提取.Net程序集中的公鑰信息。
程序2:
?? ?一種.Net加殼機制的實現,把要保護的程序A作為程序B的嵌入資源,通過運行B來運行A,A作為嵌入資源不能被反編譯。
程序3:
? ? 一個DLL,實現替換掉.Net項目中的所有注釋為空,替換全部靜態變量名為無意義名稱。
附件程序暫不提供,可作為了解;找不見了;
?
總結
以上是生活随笔為你收集整理的DOTNET防止反编译的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 网页视频播放开发总结
- 下一篇: 关于联通短信发送程序(SGIP协议)没有