使用 Dotfuscator 对代码进行混淆
Dotfuscator 简介
作为一种高级语言,c# 类库很容易被 .NET Reflector 这样的工具反编译。攻击者很容易从代码中找到数据库连接方式,加解密方法等重要信息。使用 dnspy 这样的工具甚至可以随意修改类库,下断点进行调试。
所以我们需要用 Dotfuscator 等工具对代码进行混淆。
Dotfuscator 使用方法:https://www.preemptive.com/dotfuscator/pro/userguide/en/index.html
Dotfuscator 使用流程
1 在 Input 中选择需要输入的类库(这些类库的依赖项必须在文件所在目录)
2 在 Settings 中设置临时目录和输出目录。
3 合理设置混淆参数(见下文)。
4 保存工程文件,方便下次使用。
5 开始混淆,在输出目录获取混淆后的类库,在反编译软件中验证混淆结果。
Dotfuscator 的保护措施
第一层保护:模糊转换 ,在反编译后增加阅读难度。(包括:Renaming, Control Flow, String Encryption)
第二层保护:运行时检测,防止他人篡改程序(包括:Tamper Check , Debug Check , Root Check , Shelf Life Check)(本文不作介绍)
其他保护:Removal , Watermarking(本文不作介绍)
Renaming
对命名空间,类,方法,字段进行重命名以增加阅读难度。
对于卖控件的公司来说,需要勾选 Library 选项,以防止 public 的类被重命名。如果类被重命名了那么其他人将无法调用这个类库。
对于卖软件的公司来说,需要取消勾选 Library 选项,这样所有的类都会被重命名。
类的属性往往无法混淆,如果需要混淆的话,尽量使用方法代替属性。
Dotfuscator 利用了 c# 的重载特效,将完全不同的方法重命名为同一个方法,被称为 Overload Induction。
勾选 Use Enhanced Overload Induction 。
右侧的 Renaming Scheme 建议选择 Unprintable ,会将把类名重命名为一些不可打印的字符。这些字符无法再显示器上显示出来。
Overload Induction 这项技术不适用于 xaml 代码,使用反射和指定入口点的配置文件的情况。(wpf 控件大量使用 xaml ,不能进行 overload induction)
如果勾选了 Use Enhanced Overload Induction 选项时,需要将不需要进行重命名的类库在 Exclude 界面中勾选以排除重命名列表。
Control Flow
Control Flow 会打乱方法的执行顺序,增加大量无用的分支,以增加阅读难度。但有时会影响到性能。如果对性能有要求的话可以将类库排除出列表。
String Encryption
场景:在软件的某个位置弹窗:“您的软件是盗版的!”。
对软件反编译后寻找这个字符串后可以很方便的定位到程序的关键位置,通过篡改程序可以很方便的绕过核心的授权机制。
如果对字符串进行加密,反编译后将找不到这段话。
需要强调的是,对于 const string 常量,字符串加密功能将不起作用。所以建议在编写代码时将重要的常量改为 static string !!!!!!!!!!!!!!!!!!!!!
首先需要将 Disable String Encryption 改为 No (默认为 Yes)
然后将需要混淆字符串的类库勾选
部分勾选
Dotfuscator 所有的勾选都可以精确到类,方法和字段。
可以使用筛选器筛选出符合要求的匹配对象。这样在编写代码时可以对特定的类采用相似的命名规则以满足筛选器。(筛选器支持正则表达式)
具体使用方法见官方文档:https://www.preemptive.com/dotfuscator/pro/userguide/en/index.html
使用批处理进行混淆
https://www.cnblogs.com/aitong/p/10627930.html
故障处理
我在更换电脑时碰到过一个报错:
Could not find a compatible version of ildasm to run on assembly D:\Dotfuscator\1.exe. This assembly was originally built with .NET Framework v4.0.30319. Build Error.
可以参考这篇文章:https://blog.csdn.net/winnyrain/article/details/17141331?utm_source=copy
在 Project Properties 中添加两组配置:
ILASM_v4.0.30319
C:\Windows\Microsoft.NET\Framework\v4.0.30319\ilasm.exe
ILDASM_v4.0.30319
C:\Program Files (x86)\Microsoft SDKs\Windows\v8.0A\bin\NETFX 4.0 Tools\ildasm.exe