在 C# 中混淆程式碼

Saad Aslam 2023年10月12日
  1. C# 中的程式碼混淆是什麼意思
  2. C# 中的程式碼混淆
  3. 使用這些工具在 C# 中實現混淆的方法
  4. C# 中重新命名混淆
  5. C# 中的字串加密
  6. C# 中的程式碼反除錯
  7. C# 中的程式碼防篡改
  8. C# 中的虛擬程式碼插入
  9. C# 中的二進位制連結/合併
在 C# 中混淆程式碼

本文將向你介紹如何在 C# 中混淆你的程式碼。使用多種方式和一些工具可以在這個過程中提供幫助。

大多數非 .Net 編譯器發出包含本機 CPU 指令的二進位制程式。很難反彙編、反編譯和逆向工程。

但是,所有 .Net 編譯器(如 C# 和託管 C++)都提供以 MSIL(Microsoft 中間語言格式)編譯的程式。

這種格式保留了你軟體的大量高階資訊,例如類名、欄位、方法、屬性和設定,甚至以豐富的結構保留了實際程式碼。

因此,已經建立了不同的反編譯器和反彙編器來從 .Net 程式集中提取此資訊。

C# 中的程式碼混淆是什麼意思

將可執行檔案修改為對黑客不再有用但仍保持完整功能的技術稱為程式碼混淆。

儘管該過程可能會修改方法語句或後設資料,但它不會影響程式輸出。

C# 中的程式碼混淆

程式碼混淆包括幾種不同的方法,它們共同提供分層防禦。它對於像 C# 這樣發出中級指令的語言特別有用。

有幾種可用的混淆器工具可以幫助你使你的 C# 程式碼難以被黑客解釋。

  • .NET Reactor
  • Eazfuscator.NET
  • Babel
  • ConfuserEx

使用這些工具在 C# 中實現混淆的方法

有幾種方法可以使任何人都無法理解你的程式碼。以下段落將討論其中的幾個。

C# 中重新命名混淆

此技術修改方法和變數的名稱。它使反編譯的原始碼難以理解,但不影響程式執行。

新名稱可能採用各種方案,例如字母、數字和不可列印或不可見的字母。

只要名稱的範圍不同,它們就可以被過載。大多數 C# 混淆器使用名稱混淆作為基本轉換。

重新命名混淆前的原始原始碼:

public class Data {
  public int age;
  public Data(int age) {
    this.age = age;
  }
}

實現了重新命名混淆的原始碼。

public class a {
  public int b;
  public a(int b) {
    this.b = b;
  }
}

C# 中的字串加密

字串可以立即識別為管理良好、執行良好的程式碼的一部分。

即使方法和變數被重新命名,字串引用也可以通過檢查二進位制檔案中的字串引用來找到重要的程式碼區域。

這包含使用者可以檢視的任何訊息。它將為這種形式的攻擊提供屏障。

字串加密對可執行檔案中的字串進行加密,但僅在需要時才返回其實際值。

字串加密前的原始原始碼:

Console.WriteLine("Encrypt this");

實現了字串加密的原始碼。

Console.WriteLine("x%$&#@");

C# 中的程式碼反除錯

當攻擊者試圖更改你的資料或竊取關鍵元件的功能時,他們可能會從逆向工程和除錯開始。

專業人士和黑客使用工具逐行分析程式碼。混淆器可以通過應用程式自我保護來識別它。

使用偵錯程式時,它可以破壞關鍵資料、觸發隨機崩潰或執行任何特定操作。

IT 安全專業人員可以使用反除錯工具來檢測黑客是否使用除錯應用程式作為攻擊的一部分。

黑客可以利用反除錯工具來識別何時使用除錯工具來確定他們對程式碼應用的更改。

C# 中的程式碼防篡改

混淆器可以將應用程式自我保護注入其中。如果發現篡改,可以關閉程式、限制其功能、隨機崩潰(隱藏崩潰原因)或採取任何其他特定措施。

它還可以向服務傳送訊息,通知它發現的篡改。

C# 中的虛擬程式碼插入

將程式碼插入對程式邏輯沒有影響但會破壞反編譯器或使逆向工程程式碼更難以理解的可執行檔案中。

C# 中的二進位制連結/合併

這種轉換將幾個輸入可執行檔案/庫組合成一個或多個輸出二進位制檔案。

連結可以幫助你最小化應用程式的大小,尤其是與重新命名和修剪結合使用時。

它還可以使部署更容易,並最大限度地減少黑客可以訪問的資訊數量。

作者: Saad Aslam
Saad Aslam avatar Saad Aslam avatar

I'm a Flutter application developer with 1 year of professional experience in the field. I've created applications for both, android and iOS using AWS and Firebase, as the backend. I've written articles relating to the theoretical and problem-solving aspects of C, C++, and C#. I'm currently enrolled in an undergraduate program for Information Technology.

LinkedIn