TWProtector 用户手册 · v1.6

.NET 程序集保护权威指南

本手册完整覆盖 TWProtector 的代码虚拟化、符号混淆、字符串加密、Native 原生外壳、反调试反篡改、内置授权系统与命令行自动化,适用于 .NET Framework 4.0/4.8 与 .NET 6/8/10。

1. 简介

不存在能绝对阻止破解的软件保护方法。任何保护系统的价值,在于把逆向分析的成本抬高到攻击者认为"不值得"的程度。抵抗逆向工程的能力,决定了保护系统的整体强度。

TWProtector 是面向 .NET 程序集 的新一代保护工具。它不依赖加壳或简单加密,而是通过 符号混淆、逻辑混淆、代码虚拟化、IL 加密、原生外壳宿主、反调试反篡改 等多层机制,使受保护程序的代码与逻辑对分析者极度复杂且不可逆。

与通用二进制保护器不同,TWProtector 深度理解 .NET 元数据(类型、方法、字段、命名空间、程序集引用),因此能在保持程序行为完全一致的前提下,施加针对性的 IL 级与运行时级保护,并把保护、授权、签名整合进同一条流水线。

2. 术语表

3. 软件分析与保护原理

破解手段分为静态分析与动态分析:

单纯加壳或整体加密不足以防御:解壳后可从内存转储原始 PE,拿到密钥后可解密代码段。TWProtector 采用多层纵深策略同时打击两类分析:

攻击面TWProtector 对应防御
静态反编译符号混淆、字符串加密、逻辑混淆、元数据混淆、PE 头混淆、签名抹除、Anti-ILDASM
IL 阅读方法虚拟化 / IL 加密 / 纯 IL 表 / Native 虚拟化(IL 不以明文存在)
调试器附加反调试、反反射检测、入口点转移
内存转储反转储、Native 外壳内存加载不落盘
补丁篡改Anti Tamper 哈希校验、SHA-256 文件自校验
反编译工具反反编译器进程检测(dnSpy/ILSpy)

核心思想:代码越复杂、语义线索越少、明文暴露面越小,破解者理解程序逻辑就越困难,从而放弃。

4. 什么是 TWProtector

TWProtector 提供两种入口,共享同一保护引擎与授权缓存:

其能力基石是把 .NET 程序集保护拆为可组合的多层:字符串加密、符号混淆、逻辑混淆、方法保护(五模式)、Anti Tamper、强名称签名、Native 原生外壳、其它推荐保护、授权保护,共 9 个功能组,可按需逐组开关、逐文件差异化。

与通用保护器的区别TWProtector 理解 .NET 元数据,能区分 public API 与内部符号、自动规避 WPF BAML、JSON/XML 序列化、EF 实体、DataContract 等反射依赖,避免"保护即破坏"。

5. 版本与功能矩阵

版本主要区分方法保护能力与授权管理能力;混淆与基础保护全版本支持。

功能试用版标准版专业版企业版旗舰版
字符串加密 / 符号混淆 / 逻辑混淆✓✓✓✓✓
Anti Tamper / 其它推荐保护✓✓✓✓✓
方法保护 — IL加密 (DynamicMethod)✗✓✓✓✓
方法保护 — 纯IL表 (PureILTable)✗✓✓✓✓
方法保护 — JIT Hook✗✗✓✓✓
方法保护 — 代码虚拟化 (Virtualize)✗✗✓✓✓
方法保护 — C++虚拟化 (NativeVirtualize)✗✗✗✗✓
双 VM (NativeVmProtection)✗✗✗✓✓
Native 原生外壳✗✗✓✓✓
授权保护 — 离线注入✗✗✓✓✓
授权保护 — 在线验证✗✗✗✓✓
Stub 隐藏诱饵✗✗✓✓✓
降级规则超出当前版本能力的选项会被自动降级并记录警告(如标准版选 Virtualize 会降为 DynamicMethod)。GUI 与 CLI 行为一致。

6. 快速上手

GUI 三步流程

  1. 启动 TWProtector.exe,在"保护"页点击选择文件夹,载入程序所在目录(左侧生成项目树)。
  2. 点击项目节点配置全局保护选项,或点击单个文件节点配置每文件覆盖。
  3. 点击右下角🚀 生成保护程序,输出到指定目录,在"日志"页查看每层保护结果。

CLI 一行命令

:: 激活授权(首次)
TWProtector.CLI --activate <授权码>

:: 保护单个 EXE,全功能
TWProtector.CLI --input app.exe --output protected

:: 仅字符串加密 + 混淆
TWProtector.CLI --input app.dll --output out --preset obfuscate

:: 使用 JSON 配置 + 每文件覆盖
TWProtector.CLI --config protect.json --file-options overrides.json
授权缓存共享GUI 与 CLI 在同一目录运行时共享 .twprotector.license 缓存,激活一次即可。

7. GUI 图形界面

主界面顶部为五个选项卡:保护 / 授权 / 日志 / 帮助 / 关于,标题栏含授权版本与深浅色主题切换按钮。"保护"页是核心工作区。

7.1 文件与项目树

选择文件夹后,左侧呈现项目树:

点击项目节点,右侧显示全局选项;点击文件节点,右侧显示该文件的继承与覆盖面板。

7.2 全局保护选项

项目节点对应右侧面板,按 9 个功能组分块组织(详见 第 9 章)。父开关关闭时,组内子选项自动失效。授权版本不支持的功能会显示为不可用。

7.3 每文件保护选项(v1.6)

点击文件节点,右侧显示该文件对 9 个功能组的三态覆盖:

典型场景:全局启用混淆,但把某个对外提供 API 的第三方 DLL 设为"名称混淆:禁用",保留其公开符号不被改名。"全部恢复继承"可一键清除该文件所有覆盖。配置随 TWProtector.option 持久化,下次打开自动载入。

进程级选项Native 保护与方法保护是进程级选项,任一文件启用会自动提升到全部模块(见 第 14 章)。

7.4 授权配置

"授权"页配置对被保护程序注入的授权保护:验证模式(在线/离线)、API 地址与密钥、产品名、RSA 公钥、入口点注入、多点注入等。详见 第 12 章。

7.5 日志与生成

"日志"页实时显示每个文件的保护进度、兼容性提示、方法保护覆盖率与最终结果摘要。日志同时落盘到输出目录 Logs\yyyy-MM-dd.log,便于排查失败原因。

8. 命令行工具 (CLI)

CLI 与 GUI 共享同一引擎,所有保护行为完全等价,适合集成进 MSBuild / CI 流水线。支持两种模式:命令行开关与 JSON 配置文件。

8.1 参数全表

命令与输入

参数说明
--activate <key>激活工具授权
--input <file|folder>输入文件或目录,可重复或用分号分隔
--output <dir>输出目录
--config <json>JSON 配置文件模式
--file-options <json>每文件覆盖字典
--pattern <glob>目录模式匹配,默认 *.dll;*.exe
--presetall / strings-only / rename-only / obfuscate

功能开关(均支持 --flag / --no-flag)

组参数
字符串--encrypt-strings、--string-mode
混淆--obfuscate、--rename-mode、--rename-ns/types/methods/properties/fields/params/public/private/protected/internal、--flatten-namespaces
逻辑--obfuscate-logic、--opaque-strength、--dispatcher、--nesting-depth、--randomize-patterns、--reorder-locals、--insert-nops、--cctor-state-machine
方法--encrypt-methods、--method-mode、--method-scope、--method-names、--native-vm-protection、--jit-hook-stub-hiding
防篡改--anti-tamper
Native--native、--native-anti-dump、--native-mini-dump-hook、--native-anti-process、--native-obfuscate、--native-instr-subst、--native-junk-code
其它--additional、--anti-debug、--anti-dump、--encrypt-resources、--metadata-confusion、--anti-decompiler、--pe-header-confusion、--signature-erasure、--anti-reflection、--sha256-self-check
签名--strong-name、--snk <path>
授权--license、--validate-mode、--api-url、--api-key、--product-name、--public-key、--encrypt-entry、--multi-point

8.2 JSON 配置文件

{
  "input": ["App.exe", "Lib.dll"],
  "outputDir": "protected",
  "options": {
    "EncryptStrings": true,
    "Obfuscate": true,
    "EncryptMethods": true,
    "MethodMode": "NativeVirtualize",
    "NativeProtection": false,
    "AntiTamper": true
  },
  "fileOverrides": {
    "Lib.dll": { "Rename": "Off" }
  }
}

枚举值用字符串(如 "DynamicMethod"、"在线验证")。fileOverrides 键为相对配置文件目录的路径。

8.3 每文件覆盖

优先级:--file-options > config.fileOverrides > TWProtector.option.FileOverrides。覆盖文件示例:

{
  "App.exe":  { "Methods": "On", "Native": "On" },
  "Lib.dll":  { "Rename": "Off" },
  "Third.dll":{ "Obfuscate": "Off" }
}

9. 保护选项详解

9.1 字符串加密

把 ldstr 指令加载的字符串字面量加密为资源,运行时由注入的解密方法还原。明文字符串是反编译最强的语义线索,加密后分析者无法从字符串推断功能。

模式强度说明
DelegateProxy(默认)中委托间接调用解密,抗 de4dot 自动解密
XorWithJunk中XOR + 解密路径插入干扰指令
MultiLayer高外层 XOR + 内层委托转发
StackWalk最高XOR + StackFrame 调用方验证,防反射调用解密(与方法保护互斥,会降级为 DelegateProxy)

9.2 符号混淆

重命名命名空间、类、方法、属性、字段、参数、泛型参数。基于 VTable 感知算法,自动阻止会破坏虚表/接口实现/反射依赖的重命名。

自动规避反射依赖内置分析器识别 WPF(BAML/依赖属性)、System.Text.Json、Newtonsoft.Json、XmlSerializer、DataContract、EntityFramework 等,标记相关成员不可改名。

9.3 逻辑混淆

对方法体 IL 施加等价变换,保持行为不变但结构面目全非:

9.4 方法保护五模式

方法保护是核心强度来源,五选一互斥。选择依据是安全强度 vs 性能开销 vs 平台兼容:

模式原理强度性能平台
DynamicMethod(默认)IL 提取后加密存入资源,stub 调用运行时经 DynamicMethod 解密执行高较好全平台
PureILTable真实 IL 存入数据表,运行时 DynamicMethod 直接执行,无解释器开销,支持所有 opcode中高最好全平台
VirtualizeIL → 自定义 VM 字节码,托管解释器执行很高较低全平台
JitHookHook clrjit!compileMethod(FW)/ COM Profiler(Core),JIT 时还原哨兵 IL很高接近原生仅 .NET Framework 4.5+
NativeVirtualizeIL → C++ 原生 VM 字节码,VM 解释器在原生内存运行最高低全平台

加密范围

All(全部)、EntryPointOnly(仅入口)、ByMethodName(按方法名列表,分号分隔)三种。建议对关键算法方法用 ByMethodName 精准保护,兼顾性能。

覆盖率报告保护日志尾部输出"方法保护覆盖",列出被保护与未保护(降级)的方法清单,便于评估实际强度。

9.5 双 VM 增强(NativeVmProtection)

用 C++ 原生虚拟机保护 C# 虚拟机的关键方法(或各模式的解密方法),形成嵌套双层保护。与 NativeVirtualize 互斥(后者已直接用 C++ VM)。需企业版及以上。

9.6 Stub 隐藏诱饵(JitHookStubHiding)

把受保护方法在 PE 中只留下诱饵空体(如 throw new NotSupportedException(...)),真实 IL 运行时由 JIT Hook 恢复。反编译看到的只是抛异常的方法,形成"JIT Hook 隐藏 + 虚拟化执行"双层。被 VM 跳过的方法走 E 类降级:原始 IL AES-256 加密 + 诱饵体,Profiler 在 JIT 前恢复原生执行。

9.7 Anti Tamper

对方法体 IL 计算 FNV-1a 哈希并嵌入校验逻辑,运行时检测代码段被篡改则 Environment.FailFast 立即终止,抵抗补丁攻击。

9.8 强名称签名

保存时用 .snk 密钥对程序集签名,并同步多程序集互相引用的公钥。用于需要强名称身份的场景。

9.9 Native 原生外壳

把保护后的托管 PE 经 AES-256 加密嵌入 C++ 原生外壳,运行时由外壳宿主 CLR 并在内存解密加载(.NET Core 用 hostfxr,.NET Framework 用 ICLRRuntimeHost)。IL 保护在加密前全部生效,外壳是额外一层。

互斥项Native 与资源加密 / AntiTamper / PE 头混淆 / 反反射检测互斥(外壳已提供等价或冲突的边界)。多程序集 + Stub 隐藏组合存在已知限制,见 第 15 章。

9.10 其它推荐保护

9.11 保护水印

在程序集注入唯一标识特性,用于追踪泄露/盗版副本的合法来源。流水线恒启用,无需手动开关。

10. 保护流水线

保护引擎按固定顺序执行 26 个 Step,分四阶段:Inject → Execute → ConfigureWriter → PostWrite。每个 Step 依据该文件的有效选项决定是否启用。

OrderStep作用
5LicenseInjection注入授权验证器
8CallGuard入口点转移 + 反反射
10StringEncryption字符串加密
20Obfuscation符号重命名(跨模块同步)
30LogicObfuscation控制流扁平化
31CctorStateMachine.cctor 状态机
32PatternRandomization等价指令/重排/NOP
35VirtualizationIL → VM 字节码
40-43AntiDebug/AntiDump/AntiDecompiler/Sha256运行时防护注入
50ResourceEncryption资源加密
52MethodEncryptionIL 加密 + DynamicMethod
55JitHookJIT 拦截还原
60-68MetadataConfusion/AntiTamper/PeHeader/AntiIldasm/SignatureErasure元数据与防篡改
80StrongName强名称签名
90-91NativeAot/NativeShell原生外壳(Core/Framework)
96StackReserve大栈 PE 补丁(防深递归爆栈)
100Watermark保护水印

11. 运行时注入组件

保护会向目标程序集注入运行时辅助类(注入后重命名为不可见 Unicode 名,反编译不可见):

组件职责
MethodGuardDynamicMethod 解密执行入口
JitHookcompileMethod hook 还原
VirtualMachineIL 字节码解释器
NativeVmBridgeC++ VM 反射桥
NativeMemoryModule内存加载 VM DLL(不落盘)
MethodDataTable纯 IL 数据表执行
Constant字符串解密
ResourceEncryptor资源解密
AntiDebug / AntiDump / AntiDecompiler / AntiTamper / CallGuard / Sha256各类运行时防护

12. 授权系统

TWProtector 内置完整授权解决方案,基于 RSA 非对称加密,序列号/离线文件无法伪造,无需集成第三方授权库。

12.1 工作原理

  1. 开发者在 Web 后台创建软件,生成 RSA 密钥对(私钥留存,公钥用于验证)。
  2. 保护时把公钥与授权配置注入被保护程序(LicenseInjection Step)。
  3. 终端用户激活:在线模式向 API 服务器验证;离线模式用机器码 + 签名 .lic 文件 HMAC-SHA256 验证。
  4. 被保护程序在入口点及多个方法点检查授权状态,未授权则限制功能。

12.2 客户端 SDK API

客户端 SDK(netstandard2.0)LicenseClient 公开方法:

ActivateLicenseAsync(...)   // 激活授权
ValidateLicenseAsync(...)   // 在线验证
RequestLicenseAsync(...)    // 申请授权
GetLicenseVersionAsync(...) // 查询版本
GetMachineCode()            // 获取机器码
GetDefaultMachineCode()     // 默认机器码
ValidateOfflineLicenseFile(...)// 离线 .lic 验证

12.3 Web 管理后台

MVC + REST API,控制器涵盖 Software / License / Customer / ApiKey / Account / Admins,支持序列号属性(过期日期、升级期限、硬件锁定、黑名单、用户数据)与激活状态实时监控。

12.4 离线注册机

WinForms Keygen 桌面工具 + 命令行工具(机器码 / 离线 .lic 生成),供无网络场景签发授权。

12.5 授权集成建议

避免典型错误不要把授权检查封装成单一返回布尔值的函数——攻击者只需让该函数恒返回 true。建议:
① 把校验结果与业务逻辑"融合",绕过校验则功能异常;
② 比较密钥哈希而非明文;
③ 校验结果存动态内存而非全局字段;
④ 对校验方法与调用方法同时施加虚拟化保护。

13. 标记与精确控制

选择要保护的方法有三种方式:

被保护程序行为必须与原程序完全一致——TWProtector 以"不破坏"为第一原则,遇不兼容自动降级并记录,而非跳过保护。

14. 进程级选项规则(v1.6)

并非所有功能组都能逐文件差异化。进程级选项必须全进程一致,否则产物无法加载:

类别功能组原因
进程级(自动提升)Native 保护、方法保护外壳宿主/JIT Hook 注入作用于整个进程,混合模式导致依赖 DLL 加载错位或 stub 恢复时序崩溃
模块级(可差异化)字符串/混淆/逻辑/AntiTamper/强签名/其它/授权纯模块内 IL 变换,互不影响

规则:任一文件启用进程级组而其它文件关闭时,自动把该组提升到全部模块并在日志输出"兼容性提升"警告,保证产物可运行且不削弱保护。

15. 兼容性与限制

支持范围

已知限制

互斥速查StackWalk 字符串模式 ⟷ 方法保护;Native ⟷ 资源加密/AntiTamper/PE头混淆/反反射;双VM ⟷ NativeVirtualize。

16. 最佳实践

  1. 分层而非全开:核心算法用 NativeVirtualize / Virtualize,一般逻辑用混淆 + 字符串加密,平衡强度与性能。
  2. 先小范围验证:用 ByMethodName 保护少数关键方法,运行确认行为一致后再扩大。
  3. 保留对外 API:多程序集场景关闭 public 重命名,或用每文件覆盖禁用第三方 DLL 的混淆。
  4. 授权方法虚拟化:对授权校验及其调用方法施加虚拟化,配合融合式校验设计。
  5. CI 用 CLI + JSON:配置纳入版本控制,每文件覆盖固化到 TWProtector.option。
  6. 看覆盖率报告:每次保护后检查方法保护覆盖率与降级清单。

17. 常见问题 (FAQ)

Q:方法保护模式能组合吗?

五种模式互斥,但可搭配"双 VM"增强选项与 Stub 隐藏诱饵。

Q:专业版支持在线授权吗?

专业版仅离线授权;在线(Web)授权为企业版及以上。

Q:保护后程序无法运行?

多为互斥组合或进程级选项冲突。查看日志兼容性提示,逐一排查;参考第 15 章限制。

Q:如何只保护部分方法?

用 MethodScope=ByMethodName 指定方法名,或对不想保护的成员加 [Obfuscation(Exclude=true)]。

Q:每文件覆盖会覆盖全局子选项吗?

不会。覆盖只切换功能组父开关,组内子选项始终跟随全局;强制启用而全局关闭时,子选项采用默认值。

Q:授权码安全吗?

基于 RSA,密钥长度足以杜绝注册机;授权码在设置文件中 AES 加密存储。

18. 性能与体积

保护强度与运行时开销正相关,按场景选择:

模式运行时开销适用
PureILTable几乎无性能敏感、需全 opcode 支持
DynamicMethod小通用推荐
JitHook接近原生FW 高性能强保护
Virtualize中强保护
NativeVirtualize较大最高安全(核心算法)

逻辑混淆强度(Intensity)与嵌套深度也影响体积与性能。深递归场景由 StackReserve 步骤自动补丁大栈,防止爆栈。