在 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