参考· 01
加密选项
36 项 ConfuserEx 保护,分 5 组。每项标注默认值、适用场景与它写进模板的内容。
先选一档强度
四档预设会一次性把下面一组开关摆到合理位置,之后仍可逐项微调。 一项保护都不启用时,「加密」这一步在执行时会被自动跳过。
| 预设 | 定位 |
|---|---|
| 不加密 | 只做合并与打包 |
| 基础 | 内部工具、快速验证:重命名(letters)+ 常量加密,几乎不影响启动速度 |
| 标准(推荐) | 常规商业分发:重命名 + 常量加密 + 控制流 + 反调试,兼容性风险低 |
| 严格 | 高价值授权软件:再加反篡改、防转储、强化。可能有兼容性风险,务必回归测试 |
界面上每个选项都标注「默认 X」,改过之后变色;「恢复默认」按钮按 schema 整组重置。 带参数的选项只在对应保护开启后才出现 —— 关掉的保护,它的参数不该占着地方。


组 1 · 保护强度
| 选项 | 默认 | 说明 |
|---|---|---|
preset |
normal |
写进 <rule preset="…">。显式开启的 protection 会覆盖预设里的同名项,所以它更像「兜底强度」 |
组 2 · 反编译与防篡改
目标是「让静态分析变贵、让改动被发现」。这几项对启动速度的影响都很小。
| 选项 | 默认 | 说明 |
|---|---|---|
antiIldasm |
关 | 阻止 ILDASM 等工具直接打开程序集。零成本 |
antiDebug |
关 | 检测调试器 / 分析器并阻止附加。对使用性能分析工具的场景不友好 |
debugMode |
safe |
反调试引擎:safe 走托管 API(兼容性最好)/ win32 走 WinAPI(仅 Windows)/ antinet 最强但不兼容 Mono |
antiTamper |
关 | 用整个模块的校验和加密方法体:任何字节被改动程序就加载不起来。副作用是反编译器里方法体全是空的,且会产生不可验证的模块 |
tamperMode |
normal |
校验时机:normal 启动时校验一次 / jit 每次方法编译前校验(更难绕过、兼容性差) |
tamperKey |
normal |
密钥派生:normal 静态算法 / dynamic 动态生成算法 |
antiDump |
关 | 阻止把解密后的程序集从内存 dump 出来。依赖 WinAPI,仅 Windows |
invalidMetadata |
关 | 写入畸形元数据让反编译器解析出错。对运行时无影响,但某些扫描工具会误报 |
harden |
关 | 加固其它 protection 的运行时,显著提高「脱壳」成本。只在同时启用了别的保护时才有意义 |
组 3 · 代码混淆
目标是「反编译出来的代码读不懂、也编译不回去」。重命名最有效,但对反射密集的程序有风险。
| 选项 | 默认 | 说明 |
|---|---|---|
rename |
关 | 把类名、方法名改成无意义字符。按名字反射查找、或通过序列化跨程序集通信的程序可能被破坏 |
renameMode |
unicode |
unicode 最难读但反射会失效 / letters 兼容性最好 / sequential 输出 symbols.map 便于用崩溃日志里的名字反查 / decodable 可解码 / reversible 用口令加密符号名 / retain 不重命名 |
renamePassword |
空 | 仅 reversible 下生效。上线后收到崩溃日志可用它把混淆名还原成原始名 |
renameArgs |
开 | 连方法参数名一起重命名(参数名会出现在堆栈与反射结果里) |
renEnum |
关 | 重命名枚举成员。枚举成员名常被当作字符串序列化或写进配置,开启前要确认没有依赖名字的地方 |
renPublic |
关 | 重命名公开成员。供外部调用的类库不要开 —— 调用方是按名字找的 |
controlFlow |
关 | 打乱方法内部的控制流。体积会明显增大,执行也变慢 |
cfType |
switch |
switch 用状态机重排(推荐)/ jump 插入跳转制造面条代码,会产生不可验证的模块 |
cfPredicate |
normal |
状态变量存放方式:normal 直接存 / expression 用动态表达式编码 / x86 用原生 x86 表达式(会破坏 AnyCPU) |
cfIntensity |
60 |
0–100。数值越小,每个基本块被切得越碎、越难读,但执行越慢 |
cfDepth |
4 |
1–16,仅在状态变量用 expression / x86 时生效。越深越难还原,编译越慢 |
cfJunk |
关 | 在方法里塞入永不执行的代码干扰阅读。明显增大体积,且会产生不可验证的模块 |
refProxy |
关 | 把字段 / 方法的直接引用改成间接调用,隐藏「谁调用了谁」 |
refMode |
mild |
mild 加一层间接方法(轻量)/ strong 用动态委托(更难还原但更慢) |
refInternal |
关 | 默认只代理跨程序集调用;打开后程序集内部的调用也走代理 |
组 4 · 数据加密(对称)
把常量与内嵌资源编码后存放,运行时再解码 —— 这是 .NET 程序集里最直接的「对称加密」落点, 密钥由 ConfuserEx 随机生成并藏进解码器。
| 选项 | 默认 | 说明 |
|---|---|---|
constants |
关 | 加密字符串与数字常量,让反编译出来的代码里看不到关键字、接口地址、密钥片段 |
constMode |
normal |
normal 带随机参数的静态算法 / dynamic 现场生成算法 / x86 生成原生 x86 表达式(最强,但破坏 AnyCPU) |
constElements |
SI |
加密哪些常量:S 字符串、N 数字、P 常用值(0/1/-1)、I 数组初始化器,可组合。P 必须与 S 或 N 同时出现 |
constCfg |
关 | 把解码过程绑定到控制流状态变量上,静态还原难度大幅提高,代价是运行时性能有可感知下降 |
resources |
关 | 加密内嵌资源(图标、配置文件、内嵌脚本)。资源在加载时解码,启动会稍慢。若已开压缩器,可只留一项以免重复压缩 |
resMode |
normal |
normal 静态算法 + 随机参数 / dynamic 现场生成算法 |
组 5 · 签名与复现(非对称 / 哈希)
| 选项 | 默认 | 说明 |
|---|---|---|
snKeyPath |
空 | 强名称密钥(.snk / .pfx)。用 RSA 私钥给程序集签名,运行时可验证未被替换。留空则不签名 |
snKeyPass |
空 | 仅当上面给的是 .pfx 容器时才需要。.snk 一般没有口令 |
seed |
空 | ConfuserEx 的加密参数是随机的。填一个固定值,同样的输入就能得到字节一致的输出 |
debugSymbols |
关 | 保留 .pdb。线上排障需要它来还原堆栈行号,但发布给用户的包里通常不该带 |
compress |
开 | 把程序集压缩后加载,体积更小、加载稍慢。与「资源加密」同时开启会压缩两次,二选一即可 |
生成强名称密钥:
sn -k app.snk

兼容性提示
cfPredicate=x86、constMode=x86会破坏 AnyCPU:它们生成原生 x86 指令,64 位进程里跑不起来。antiDump、debugMode=win32依赖 WinAPI,仅 Windows。debugMode=antinet最强,但不兼容 Mono。antiTamper、cfJunk、cfType=jump都会产生**不可验证(unverifiable)**的模块, 某些环境会拒绝加载。
需要看「这些开关到底写进模板的什么位置」时,翻模板与占位符。