跳到主要内容

混淆选项详解

恒盾C#混淆加密大师提供多种混淆加密选项,以下是详细说明:

基本保护选项

1. 防调试

勾选后,混淆加密的dll/exe文件无法在VS中,或者其他第三方调试工具中调试,程序如果发现有调试进程附加到自己,将会自动退出。

2. 防ILDasm

勾选后,系统自带的ILDasm程序,无法对加密的dll/exe程序进行反编译,反编译的时候会报错。

防ILDasm

3. 防DnSpy

勾选后,加密的程序如果发现自己正在被DnSpy调试,则会报错并退出程序,防止被DnSpy动态调试。

防DnSpy

4. 防篡改(仅限EXE)

勾选后,exe程序无法被修改,任意对EXE文件的改动将导致EXE程序无法运行。

5. 加壳(仅限EXE)

勾选后,将会对EXE程序加一层壳,原先的程序会被加密内嵌到EXE中,静态反编译工具将无法查看到任何原先的EXE代码。

加壳

6. 防de4dot

勾选后,可以防止de4dot对加密的程序进行反混淆,导致de4dot报错。

防de4dot

7. 防断点

勾选后,加密的程序如果发现自己运行到某个地方长时间停顿(意味着被下断点),则会报错退出。

8. 防ILSpy

勾选后,处理后的EXE/dll将无法被ILSpy解析。

9. 防虚拟机

勾选后,程序如果检测到自己运行在虚拟机中,将自动停止运行。

注入功能选项

1. 垃圾域

勾选后,加密的程序会被注入多个无用的域,可以干扰反编译工具,并且使反编译后的代码更难以阅读,起到保护的效果。

2. 垃圾空指令

勾选后,加密的程序的指令中,会被注入多个空指令,可以使反编译后的IL code难以阅读。

3. 垃圾函数

勾选后,加密的程序会被注入多个无用的函数,可以干扰反编译工具,并且使反编译后的代码更难以阅读,起到保护的效果。

4. 垃圾类型

勾选后,加密的程序会被注入多个无用的类型,可以干扰反编译工具,并且使反编译后的代码更难以阅读,起到保护的效果。

5. 垃圾字符串

勾选后,加密的程序会被注入多个无用的字符串,可以干扰反编译工具,并且使反编译后的代码更难以阅读,起到保护的效果。

混淆功能选项

1. 文件信息混淆

勾选后,会对加密程序的文件信息进行混淆,修改文件的内部名称,Assembly信息等。

2. 布尔混淆

勾选后,会对布尔值进行混淆,将布尔值转换成难以识别的基础类型。

3. 文件时间混淆

勾选后,会对加密文件的时间戳进行修改。

4. 流程混淆

勾选后,会对加密文件中的指令进行乱序,导致整个程序内部进行多次跳转,使得静态分析难以理解程序的意图。

流程混淆

5. 字符串加密

勾选后,会对程序中的字符串进行加密,可以有效防止静态分析出一些程序的关键代码的位置。

字符串加密

6. DOS头混淆

勾选后,会对EXE文件的DOS头进行修改,变成无法识别的字符串。

7. 数字混淆

勾选后,程序会对整型数字进行混淆,使得简单的数字,变成复杂的数字运算,配合控制流程等加密选项,起到更好的保护效果。

数字混淆

8. 字符串拆分

勾选后,将会对字符串进行拆分,将一个完整的字符串拆分成多个字符串相加的形式。

字符串拆分

9. 函数调用混淆

勾选后,调用函数将不再使用函数名的方式进行,而是使用程序内部的函数token进行调用,使得静态分析难以看出使调用了哪个函数。

函数调用混淆

10. 字符串隐藏

勾选后,字符串将会被加密存放到原生函数中,反编译工具将无法获取到其具体的值。

字符串隐藏

11. 数字隐藏

勾选后,整型数字将会被加密存放到原生函数中,反编译工具将无法获取到具体的值。

12. 函数体隐藏

勾选后,将会对函数体进行加密,加密后的函数体在反编译工具中将无法被查看到。

函数体隐藏

13. 混淆引用列表

勾选后,会对引用列表进行混淆,使得反编译工具反编译出来的引用列表难以被理解。

14. 小数混淆

勾选后,代码中的小数会被加密存放,无法直接反编译出小数的值。

15. 链式函数混淆

勾选后,函数调用将会嵌套多层函数调用,使得难以静态分析代码的含义。

16. 异步混淆

勾选后,程序将把一些代码转换为异步调用的形式,使得逆向分析更加困难。

17. 错误函数体混淆

勾选后,会在函数中加入一些错误的指令,使得一些静态分析工具无法正常解析出函数内部的代码。

18. 原生化EXE

勾选后,会对EXE文件进行原生化处理,将EXE文件转变成原生程序,C#反编译工具将无法分析出内部的任何IL代码。

19. 加密资源文件

勾选后,可以对程序中的资源文件进行加密,反编译工具将无法查看资源文件的内容。

重命名选项

不同的重命名模式

不同的重命名模式会把相应的函数,类型,域等按照相应的格式进行重命名,分别如下面所示:

字母数字模式

字母数字模式

UUID模式

UUID模式

特殊字符模式

特殊字符模式

Base64模式

Base64模式

英文单词模式

英文单词模式

重命名对象

  1. Module重命名 - 勾选后,会对全局Module对象进行重命名
  2. 域重命名 - 勾选后,会对类中的域进行重命名
  3. 函数重命名 - 勾选后,会对程序中的函数进行重命名
  4. 命名空间重命名 - 勾选后,会对命名空间进行重命名
  5. 参数重命名 - 勾选后,会对函数的参数进行重命名
  6. 类型重命名 - 勾选后,会对程序中的不同类型进行重命名

忽略列表功能

忽略列表功能可以填入不想被混淆的函数或者类型,对应的函数或者类型将不会被混淆加密。

例如,项目中有下面的代码:

using System;

namespace ConsoleApp1
{
internal class TestClass
{
internal TestClass()
{
new Program();
}

internal int MemberFunc()
{
int a = 1;
a++;
return a;
}
}
}

如果不想让MemberFunc()这个函数被混淆加密处理,可以在忽略列表中输入如下的条目,以下三种写法均可:

ConsoleApp1.TestClass.MemberFunc

或者

TestClass.MemberFunc

或者

MemberFunc

其中第一种写法更为精确,可以避免不同命名空间,或者不同class内部的同名函数都被忽略。

忽略列表

这样在处理的log中,可以看到相应的函数已经被忽略,该函数不会被混淆选项处理,将保持原样。

忽略log