通常我們通過代碼混淆、加密的形式達到軟體保護的目的。在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 { get; set; }
28 public string UserName { get; set; }
29 }
30 }
我們使用最常用的反編譯工具Reflector對生成的exe反編譯檢視源碼。
下面我們打開.NET Reactor進行代碼混淆,載入exe後,在一般設定裡可以設定壓縮選項,不過設定後程式初始化速度會變慢,是因為需要将代碼解壓縮後再加載到記憶體中。
在混淆選項裡将Enable設定為啟用,混淆公共類型,字元串加密等常用的也設定成啟用。其他的選項Tips裡都有詳細的解釋,就不一一講解。
當我們再使用Reflector反編譯檢視時,發現沒有看到混淆後的代碼,而是看到了這個結果。
猜想應該是.NET Reactor程式對exe進行處理後打了個包,我們使用查殼工具檢視後發現果然是這樣,外面套了一層Delphi的東西,這個還不是殼,隻是一些額外資料。
關于Overlay相關内容可以檢視
2.加殼與脫殼
加殼實際上就是一種加密方式,被加殼的程式在運作前要先運作一段附加指令,這段附加的指令完成相關操作後會啟動主程式,程式就像被包在一個殼裡一樣,加殼的技術在病毒編寫的時候也被大量使用。
我們使用北鬥加殼程式對上面的exe加殼後,再來反編譯看一看。
反編譯後我們已經找不到之前程式任何相關名稱、代碼,完全被一個“殼子”包裹了起來,在程式運作時,程式将先運作我們反編譯看到的main函數進行一系列的解壓、解密動作後将代碼加載到記憶體中運作原始的程式,這樣就實作了對程式的保護功能。
脫殼就是對程式進行解壓縮、解密,将外面的一層殼脫去後,繼續進行逆向工程進行破解。
而關于脫殼,本人也是略知皮毛,不敢胡亂賣弄,感興趣的可以去論壇裡學習相關知識。
這裡介紹的混淆、加殼的方法也隻是為了在需要對自己的程式進行保護時的一種方法。
覺得文章還行的話就推薦下吧,哈哈。
作者:
Parry出處:
http://www.cnblogs.com/parry/本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接配接,否則保留追究法律責任的權利。