.net 混淆工具
obfuscation tools
.net 社区有很多混淆工具, 比如这个清单: https://github.com/NotPrab/.NET-Obfuscator
比较有名的商业工具有 .NET REACTOR https://www.eziriz.com/,
开源软件中, 最受欢迎的有:
- obfuscar https://github.com/obfuscar/obfuscar
- 老版 ConfuserEx https://github.com/yck1509/ConfuserEx
- (推荐)新版 ConfuserEx2 https://github.com/mkaring/ConfuserEx
obfuscar 验证 (弃用)
obfuscar 使用很简单, 但 github 上没有预编译的版本, 需要通过源码编译 Obfuscar.Console.exe 程序.
参考官方文档定制我们的混淆设置, 比如下面就是一个简单的示例.
Obfuscar.xml 文件
<?xml version="1.0" encoding="utf-8" ?>
<Obfuscator>
<!--输入路径-->
<Var name="InPath" value="." />
<!--输出路径:加密混淆过的路径-->
<Var name="OutPath" value=".\Obfuscator_Output" />
<!--混淆代码的参数-->
<Var name="ReuseNames" value="false" />
<Var name="HideStrings" value="false" />
<Var name="KeepPublicApi" value="false" />
<Var name="HidePrivateApi" value="true" />
<!--要混淆的模块-->
<Module file="$(InPath)\test.exe">
<!--SkipType跳过指定的类 Program是Main所在的类名-->
<SkipType name="Program" />
<!--SkipMethod 跳过指定的方法-->
<SkipMethod type="Program" name="Main" />
</Module>
</Obfuscator>
混淆使用命令:
net48\Obfuscar.Console.exe Obfuscar.xml
测试效果, 我的项目大量使用 dapper ORM, 经过 obfuscar 混淆后, 总是 crash.
ConfuserEx2 验证(推荐)
首先说明的是, 我的程序是Winform 程序, 用的是 .net framework 4.8, 经过验证 ConfuserEx 和 ConfuserEx2 效果都很好, 这里仅介绍 ConfuserEx2 的使用.
保护手段:
- ConfuserEx2 支持压缩 pack, 可以提高反编译的难度, 但经常被杀毒软件误报, 所以不建议使用.
- ConfuserEx1 也支持压缩 pack, 在我的电脑不会被杀毒软件报警, 但不确定其他杀毒软件是否会报警, 所以不建议使用.
- 不得不说混淆很有可能会引起程序异常, 尤其是对于匿名类的支持, 所以我仅仅选择了
必要
的保护措施, 经过实验和参考该项目的wiki , 分别是 ctrl flow, anti debug, anti ildasm, harden, 另外去除了 ConfuserEx 的 watermark , 这里最关键的是 ctrl flow. - anti debug 保护是通过启动监控debug的线程实现的, 所以文档中建议不要对所有的assembly 进行 anti debug 保护, 仅仅对 main assembly保护, 已避免性能损失.
项目文件
ConfuserEx2 提供GUI和CLI两种工具, 可以将混淆任务保存为项目文件, 下面就是我使用的项目文件.
<project outputDir="D:\my_workspace\test\src\bin\Debug\Confused" baseDir="D:\my_workspace\test\src\bin\Debug" xmlns="http://confuser.codeplex.com">
<rule pattern="true" inherit="false">
<protection id="ctrl flow" />
<protection id="anti debug" />
<protection id="anti ildasm" />
<protection id="harden" />
<protection id="watermark" action="remove" />
</rule>
<module path="test.exe" />
</project>
GUI设置截图如下: