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

如何用Dotfuscator混淆const变量值?保留库模式且不影响运行

如何混淆DLL中常量字符串的值(保留Library模式)

原始代码

namespace Password.Lib
{
    public class PassRepo: IPassRepo
    {
        const string mEntropy= "djbiudv-dsvjkbdjs-svdjkbv";
        const string logLevel = "logLevelKey";

        private string currentLevel;

        public PassRepo()
        {
            int answer = OldPasswordRepo();
        }
    }
}

当前Dotfuscator配置

核心选项

<option>stripoa</option>
<option>library</option>
<option>transformxaml</option>
<controlflow level="high" />

重命名与移除规则

<referencerulelist>
  <referencerule rulekey="{6655B10A-FD58-462d-8D4F-5B1316DFF0FF}" />
  <referencerule rulekey="{7D9C8B02-2383-420f-8740-A9760394C2C1}" />
  <referencerule rulekey="{229FD6F8-5BCC-427b-8F72-A7A413ECDF1A}" />
  <referencerule rulekey="{2B7E7C8C-A39A-4db8-9DFC-6AFD38509061}" />
  <referencerule rulekey="{494EA3BA-B947-44B5-BEE8-A11CC85AAF9B}" />
  <referencerule rulekey="{89769974-93E9-4e71-8D92-BE70E855ACFC}" />
  <referencerule rulekey="{4D81E604-A545-4631-8B6D-C3735F793F80}" />
  <referencerule rulekey="{62bd3899-7d53-4336-8ca2-4e5dbae187d5}" />
</referencerulelist>

<removal>
  <option>disable</option>
  <removalreport overwrite="true">
    <file dir="" name="Removal.xml" />
  </removalreport>
  <referencerulelist />
</removal>

反编译结果

public class PassRepo: IPassRepo
{
    private const string a = "djbiudv-dsvjkbdjs-svdjkbv";

    private const string b = "logLevelKey";

    private string c;

    public PassRepo()
    {
        int l = OldPasswordRepo;
    }
}

需求与问题

需要混淆mEntropy和logLevel的字符串值,但禁用library模式会导致应用UI完全无法运行,必须保留该模式。


解决方案

1. 调整代码:将const改为static readonly

C#中const是编译时常量,编译器会直接把字符串值嵌入到所有引用位置,Dotfuscator无法对这类嵌入值进行加密。改为static readonly后,值会在类初始化时加载,便于加密工具处理:

namespace Password.Lib
{
    public class PassRepo: IPassRepo
    {
        private static readonly string mEntropy = "djbiudv-dsvjkbdjs-svdjkbv";
        private static readonly string logLevel = "logLevelKey";

        private string currentLevel;

        public PassRepo()
        {
            int answer = OldPasswordRepo();
        }
    }
}

2. 启用Dotfuscator字符串加密功能

在Dotfuscator配置文件中添加<stringencryption>节点,明确启用字符串加密并指定目标类:

<stringencryption>
  <option>encryptstrings</option>
  <!-- 指定需要加密字符串的类,确保覆盖目标类 -->
  <type name="Password.Lib.PassRepo" />
</stringencryption>

3. 验证Library模式下的兼容性

Library模式默认会优先保证库的兼容性,但字符串加密功能在该模式下是支持的。添加上述配置后,重新构建混淆,反编译后将看不到明文的字符串值,只会看到加密后的字节序列或解密逻辑。


内容的提问来源于stack exchange,提问作者Tina

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 10:37:23