C#入门教程08.05:代码混淆

系列索引:C#开发入门系列教程索引

上一篇:C#开发入门教程08.04:添加强签名

说明

  • 混淆,比如说函数名为license_check(),这样别人一眼丁真发现这个函数是证书检测相关,需要混淆一下,把它变为abc_123(),这样就增加了分析难度。
  • 加密(加壳),代码指令mov eax,1;把他加密为abc defgf;普通状态下是无法运行的,只有解密后才能正常运行。

本文测试使用PreEmptive Protection - Dotfuscator 6.0.1 破解版

混淆

点击打开

dotfuscator界面

点击+按钮选择需要混淆的dll/exe

选择混淆文件

选择后取消Library的勾选,否则的话,几乎所有的公共函数变量,不会被加密和混淆,还是可以很容易的看到代码。

勾选参数

点击Settings页面,将Disable String Encryption置为No

设置参数

点击Rename页面,勾选Use Enhanced Overload Induction

勾选参数

点击String Encryption页面,勾选文件

选择需要混淆的文件

如果dll原本就有签名,需要重新签一个。

签名文件

点击编译按钮

编译按钮

会提示保存为文件,随便填一个名字就可以了。

混淆日志输出为:

1
2
3
4
5
6
7
...
Build Finished.


Types Renamed: 1 of 1 (100.00%)
Methods Renamed: 1 of 2 (50.00%)
Fields Renamed: 1 of 1 (100.00%)

切换到output界面

输出界面

函数下有个盾牌,应该是他把原本的类修改为a了。

在dll所在目录下会生成一个新目录,编译结果就在里面

编译结果

效果

打开dll文件,未混淆的可以直接看出代码

ilspy打开未混淆dll

打开混淆后的dll

dnspy打开混淆的dll

增加了许多无用代码,但是参数没变,而且仔细分析还是可以看出原来的流程的。

代码混淆后,类名变了,函数名也变了,那么调用方法就要改了

1
2
3
4
5
6
7
8
9
10
11
namespace getsum
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("The answer of 2+8 = {0}", a.a(2, 8));
Console.ReadKey();
}
}
}

然后编译运行,运行结果正常。

去混淆

使用de4dot反混淆

de4dot反混淆结果

只是捋了一下名称,可读性增加。

下一篇:C#开发入门教程08.06:代码加壳


C#入门教程08.05:代码混淆
https://feater.top/csharp/how-to-obfuscate-csharp-app/
作者
JackeyLea
发布于
2023年10月12日
许可协议