无法阻止Obfuscar混淆指定类,求解决方案及混淆器推荐
.NET混淆器问题:Obfuscar规则失效及替代方案
问题说明
我需要让MyNamespace.LeaveThisClassAlone类不被Obfuscar混淆,已经添加了各种SkipNamespace、SkipType等规则,但该类仍被混淆。另外为避免混淆导致程序崩溃,我已关闭大部分通用规则。现寻求免费/低价混淆器,需满足:
- 支持代码混淆
- 可排除单个类
- 不影响程序正常运行
当前使用的Obfuscar配置代码:
<?xml version="1.0" encoding="utf-8" ?> <Var name="HidePrivateApi" value="true" /> <Var name="KeepPublicApi" value="false" /> <Var name="RenameProperties" value="false" /> <Var name="RenameEvents" value="false" /> <Var name="RenameFields" value="false" /> <Var name="UseUnicodeNames" value="false" /> <Var name="HideStrings" value="false" /> <Var name="OptimizeMethods" value="false" /> <Var name="SuppressIldasm" value="false" /> <Module file="C:\Users\gerry\Documents\myproject\ProjectFolder\bin\x64\Release\net8.0-windows7.0\MyDll.dll"> <SkipNamespace name="MyNamespace.LeaveThisClassAlone" /> <SkipNamespace name="MyNamespace.LeaveThisClassAlone*" /> <SkipField type="MyNamespace.LeaveThisClassAlone" attrib="public" name="name" /> <SkipField type="MyNamespace.LeaveThisClassAlone" attrib="public" rx="Pub.*" /> <SkipMethod type="MyNamespace.LeaveThisClassAlone" attrib="public" rx=".*" /> <SkipMethod type="MyNamespace.LeaveThisClassAlone" attrib="family" rx=".*" /> <SkipType name="MyNamespace.LeaveThisClassAlone" skipMethods="true" /> <SkipType name="MyNamespace.LeaveThisClassAlone" skipFields="true" /> <SkipType name="MyNamespace.LeaveThisClassAlone" skipProperties="true" /> <SkipType name="MyNamespace.LeaveThisClassAlone" skipEvents="true" /> <SkipType name="MyNamespace.LeaveThisClassAlone" skipMethods="true" skipFields="true" /> <SkipType name="MyNamespace.LeaveThisClassAlone" skipStringHiding="true" /> <SkipProperty type="MyNamespace.LeaveThisClassAlone" name="name" /> <SkipProperty type="MyNamespace.LeaveThisClassAlone" attrib="public" rx="name\d" /> <SkipProperty type="MyNamespace.LeaveThisClassAlone" name="Event2" /> <SkipProperty type="MyNamespace.LeaveThisClassAlone" rx="Any.*" /> <SkipStringHiding type="MyNamespace.LeaveThisClassAlone" name="*" /> </Module> <assembly name='$(MSBuildProjectName)' frameworkversion='v4.0' /> <Module file="$(InPath)\MyDll.dll" /> <referencepath path='C:\Windows\Microsoft.NET\Framework\v4.0.30319' /> <AssemblySearchPath path="C:\Windows\Microsoft.NET\Framework\v4.0.30319" />
Obfuscar规则失效原因分析
- 重复Module节点:配置里同时存在两个
<Module>节点,分别指向绝对路径和$(InPath)的DLL,可能导致规则应用混乱,无法正确匹配目标类 - 规则冗余冲突:同时使用
SkipNamespace和多个重复的SkipType规则,反而可能让Obfuscar的规则解析逻辑出错 - 环境不匹配:项目是.NET 8,但配置里引用了.NET Framework 4.0的路径,框架版本不兼容可能导致规则无法生效
修正后的Obfuscar配置
如果不想更换混淆器,可简化并修正配置:
<?xml version="1.0" encoding="utf-8" ?> <Var name="HidePrivateApi" value="true" /> <Var name="KeepPublicApi" value="false" /> <Var name="RenameProperties" value="false" /> <Var name="RenameEvents" value="false" /> <Var name="RenameFields" value="false" /> <Var name="UseUnicodeNames" value="false" /> <Var name="HideStrings" value="false" /> <Var name="OptimizeMethods" value="false" /> <Var name="SuppressIldasm" value="false" /> <!-- 保留单个Module节点,指向正确的.NET 8 DLL路径 --> <Module file="C:\Users\gerry\Documents\myproject\ProjectFolder\bin\x64\Release\net8.0-windows7.0\MyDll.dll"> <!-- 用单个SkipType规则排除整个类,包含所有成员 --> <SkipType name="MyNamespace.LeaveThisClassAlone" skipMethods="true" skipFields="true" skipProperties="true" skipEvents="true" /> </Module> <!-- 替换为.NET 8的程序集搜索路径 --> <AssemblySearchPath path="C:\Program Files\dotnet\shared\Microsoft.NETCore.App\8.0.0" />
免费/低价混淆器推荐
- ConfuserEx:完全免费的.NET混淆工具,支持类、方法级别的精准排除,具备混淆、字符串加密、控制流混淆等功能,适配.NET Core/.NET 5+版本,稳定性较好,不易导致程序崩溃
- Eazfuscator.NET Community Edition:免费版支持基础混淆和类排除,操作简单易上手,兼容性强;付费版提供更多高级功能,适合有进阶需求的场景
- Obfuscar(修正配置后):本身完全免费,只要解决配置中的冲突和环境适配问题,就能正常实现类排除,无需额外更换工具
内容的提问来源于stack exchange,提问作者Gerry
相关产品推荐
相关产品推荐

