.NET程序的代碼混淆、加殼與脫殼


通常我們通過代碼混淆、加密的形式達到軟件保護的目的。在Web開發里我們接觸過的可能就是JS代碼加密了,可以通過對JS代碼進行混淆、加密從而實現對核心JS代碼的保護。如果沒有接觸過的可以在這里簡單了解一下,這次我們就不去細說了。

在以前Win32的軟件中,加殼脫殼的技術已經發展的非常成熟,國內有大名鼎鼎的看雪吾愛破解等論壇,三四年前還在上學時,論壇里的大牛一直都是自己的偶像。

而.NET程序因為編譯結果不是機器代碼語言,而是IL語言,所以加殼脫殼相關的軟件還不是很多,我搜索到了一些,如VS自帶的DotFuscator、.NET Reactor、xeoncode等,這次我們就簡單介紹下手邊有的.NET Reactor 。

1.代碼混淆

代碼混淆主要通過一些名稱替換、移位、流程混淆的方式來實現。

先來看一個測試的DEMO程序,很簡單的一個Winform程序,實例化窗體時實例化一個User類,點擊按鈕顯示用戶名,這樣也可以測試加密、加殼后程序是否能夠繼續運行。

 1  using System;
 2  using System.Windows.Forms;
 3 
 4  namespace CodeObfuscator
 5 {
 6      public  partial  class Form1 : Form
 7     {
 8          private  readonly User _currentUser;
 9          public Form1()
10         {
11             InitializeComponent();
12             _currentUser =  new User
13             {
14                 UserID =  1,
15                 UserName =  " Parry@cnblogs "
16             };
17         }
18 
19          private  void ButtonAlertClick( object sender, EventArgs e)
20         {
21             MessageBox.Show(_currentUser.UserName);
22         }
23     }
24 
25      public  class User
26     {
27          public  int UserID {  getset; }
28          public  string UserName {  getset; }
29     }
30 }

我們使用最常用的反編譯工具Reflector對生成的exe反編譯查看源碼。

下面我們打開.NET Reactor進行代碼混淆,載入exe后,在一般設置里可以設置壓縮選項,不過設置后程序初始化速度會變慢,是因為需要將代碼解壓縮后再加載到內存中。

在混淆選項里將Enable設置為啟用,混淆公共類型,字符串加密等常用的也設置成啟用。其他的選項Tips里都有詳細的解釋,就不一一講解。

 

當我們再使用Reflector反編譯查看時,發現沒有看到混淆后的代碼,而是看到了這個結果。

猜想應該是.NET Reactor程序對exe進行處理后打了個包,我們使用查殼工具查看后發現果然是這樣,外面套了一層Delphi的東西,這個還不是殼,只是一些額外數據。

關於Overlay相關內容可以查看這里

2.加殼與脫殼

加殼實際上就是一種加密方式,被加殼的程序在運行前要先運行一段附加指令,這段附加的指令完成相關操作后會啟動主程序,程序就像被包在一個殼里一樣,加殼的技術在病毒編寫的時候也被大量使用。

我們使用北斗加殼程序對上面的exe加殼后,再來反編譯看一看。

反編譯后我們已經找不到之前程序任何相關名稱、代碼,完全被一個“殼子”包裹了起來,在程序運行時,程序將先運行我們反編譯看到的main函數進行一系列的解壓、解密動作后將代碼加載到內存中運行原始的程序,這樣就實現了對程序的保護功能。

脫殼就是對程序進行解壓縮、解密,將外面的一層殼脫去后,繼續進行逆向工程進行破解。 

而關於脫殼,本人也是略知皮毛,不敢胡亂賣弄,感興趣的可以去論壇里學習相關知識。

這里介紹的混淆、加殼的方法也只是為了在需要對自己的程序進行保護時的一種方法。

覺得文章還行的話就推薦下吧,哈哈。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM