如何用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
相关产品推荐
相关产品推荐

