通常我們通過代碼混淆、加密的形式達到軟件保護的目的。在Web開發里我們接觸過的可能就是JS代碼加密了,可以通過對JS代碼進行混淆、加密從而實現對核心JS代碼的保護。如果沒有接觸過的可以在這里簡單了解一下,這次我們就不去細說了。
在以前Win32的軟件中,加殼脫殼的技術已經發展的非常成熟,國內有大名鼎鼎的看雪、吾愛破解等論壇,三四年前還在上學時,論壇里的大牛一直都是自己的偶像。
而.NET程序因為編譯結果不是機器代碼語言,而是IL語言,所以加殼脫殼相關的軟件還不是很多,我搜索到了一些,如VS自帶的DotFuscator、.NET Reactor、xeoncode等,這次我們就簡單介紹下手邊有的.NET Reactor 。
1.代碼混淆
代碼混淆主要通過一些名稱替換、移位、流程混淆的方式來實現。
先來看一個測試的DEMO程序,很簡單的一個Winform程序,實例化窗體時實例化一個User類,點擊按鈕顯示用戶名,這樣也可以測試加密、加殼后程序是否能夠繼續運行。
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函數進行一系列的解壓、解密動作后將代碼加載到內存中運行原始的程序,這樣就實現了對程序的保護功能。
脫殼就是對程序進行解壓縮、解密,將外面的一層殼脫去后,繼續進行逆向工程進行破解。
而關於脫殼,本人也是略知皮毛,不敢胡亂賣弄,感興趣的可以去論壇里學習相關知識。
這里介紹的混淆、加殼的方法也只是為了在需要對自己的程序進行保護時的一種方法。
覺得文章還行的話就推薦下吧,哈哈。