You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无法阻止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规则失效原因分析

  1. 重复Module节点:配置里同时存在两个<Module>节点,分别指向绝对路径和$(InPath)的DLL,可能导致规则应用混乱,无法正确匹配目标类
  2. 规则冗余冲突:同时使用SkipNamespace和多个重复的SkipType规则,反而可能让Obfuscar的规则解析逻辑出错
  3. 环境不匹配:项目是.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 21:35:19