简介本资源为适配.NET Core平台的de4dot脱壳工具开源实现面向安全研究人员、逆向工程师及.NET开发者解决.NET Core应用程序跨平台Windows/Linux/macOS因加壳导致的静态分析与漏洞挖掘障碍。资源包共48个文件含12个核心DLL如de4dot.dll、de4dot.cui.dll、dnlib.dll等脱壳引擎与UI组件、6个PDB调试符号、5个缓存与配置文件.deps.json/.runtimeconfig.json/.editorconfig等、2个可执行文件de4dot.exe与apphost.exe及多份许可证文本完整覆盖构建、运行与调试所需资产压缩包仅1.87MB轻量易部署。已有528人学习下载适合需快速开展.NET Core程序逆向分析、研究ConfuserEx/DNEmu等主流壳处理逻辑、或定制扩展脱壳能力的技术人员。1. de4dot-netcore 版本不是“脱壳工具升级包”而是 .NET Core / .NET 5 逆向分析链里缺失的那块拼图你手头有个 .NET 6 编译的 DLL用老版 de4dotv3.x一跑就报Unsupported .NET version或直接静默退出用 ILSpy 打开能看到大量IL_0000:和乱序方法体但反编译出的 C# 代码满屏object obj null;、goto IL_001a;根本没法读逻辑甚至某些混淆器如 ConfuserEx 2.0、Eazfuscator 2023 后版本生成的模块连ildasm都提示Invalid or corrupt metadata。这不是你环境坏了——是传统 .NET 反混淆工具链在 .NET Core 生态里集体断代了。de4dot-netcore 版本就是为填这个坑而生的它不是简单把原版 de4dot 移植到 .NET Core 运行时而是重写了元数据解析器、IL 指令流重建器和控制流扁平化还原模块专治 .NET 5/6/7/8 的强混淆二进制。适合正在做第三方 SDK 协议分析、遗留系统兼容性审计、或需要从 NuGet 包中提取核心算法逻辑的开发者。如果你的场景是“必须从一个没源码、带混淆、TargetFrameworknet6.0 的程序集中恢复可读性”那它不是可选项而是当前开源生态里最接近可用的起点。2. 核心能力拆解为什么必须用这个分支而不是原版或其它替代方案2.1 元数据层重构绕过 .NET Core 的 TypeRef/TypeDef 语义变更.NET Framework 时代TypeRef表项通常指向AssemblyRefTypeName解析相对线性而 .NET Core 引入了TypeSpec表、嵌套泛型签名压缩如ListT存为System.Collections.Generic.List1、以及CustomAttribute的 RVA 偏移重定位机制。原版 de4dot 的MetadataReader仍按 ECMA-335 第 4 版规范硬解析遇到TypeSpec中嵌套的GenericInst签名时会直接抛BadImageFormatException。de4dot-netcore 则引入了CoreMetadataReader它先通过PEReader.GetMetadataReader()获取原始元数据流再用SignatureReader逐字节解析泛型实例签名对TypeSpec表项做两级缓存TypeSpecToken → SignatureBlob → ResolvedType确保TypeRef解析时能正确回溯到TypeDef或ExportedType。这步是后续所有反混淆的基础——如果类型都认错了还原出来的if/else分支必然错位。提示该能力在处理 ConfuserEx 的anti-tamper模式时尤为关键。该模式会将mscorlib类型引用全部替换为TypeSpec 自定义签名原版 de4dot 会把System.String识别成UnknownType_0x1234导致整个字符串操作链崩溃。2.2 控制流扁平化CFG Flattening还原不止是“去 goto”而是重建 SSA 形式现代混淆器如 Eazfuscator 的control-flow-obfuscation不再只插goto而是将方法体拆成数十个switch块每个块以ldc.i4.x加载状态码再跳转到下一个块。原版 de4dot 的ControlFlowDeobfuscator仅做线性块合并对嵌套switch和brfalse.s跳转链无能为力。de4dot-netcore 改用基于支配边界Dominator Tree的 CFG 重建算法先用ILReader提取所有ILInstruction构建基础块Basic Block对每个块计算支配者Dominator识别循环头Loop Header将switch指令视为多出口节点用Phi函数注入变量定义点最终输出符合 SSAStatic Single Assignment 形式的 IL 流再映射回 C# 语法树。实测对比某 net6.0 加密验证模块原版 de4dot 输出的反编译代码含 47 处goto IL_00a1;而 de4dot-netcore 输出中goto降为 0if/else分支结构完整且局部变量命名恢复为key,iv,cipherText等语义名。2.3 混淆器指纹识别引擎支持动态加载检测规则不止于硬编码匹配de4dot-netcore 内置ObfuscatorDetector模块但它不依赖静态字符串扫描如搜ConfuserEx字样。而是通过三阶段特征提取元数据特征检查Assembly的CustomAttributes是否含ConfuserEx.Attributes.AntiILDasmAttributeIL 特征扫描MethodBody中是否存在ldc.i4后紧跟switch的固定模式Eazfuscator 2023 的 signature类型特征验证TypeRef表中是否存在System.Runtime.CompilerServices.RuntimeHelpers的异常引用DotFuscator 6.0 的 anti-reflection 标志。更关键的是它支持--rules-dir参数加载外部 JSON 规则文件。例如你可以自定义一个my-protector.json{ name: MyProtector, version: 2.1, detection: { custom_attributes: [MyCompany.Protect.Attribute], il_patterns: [ldc.i4.1, brtrue.s, ldloc.0] }, deobfuscators: [string_decrypt, control_flow] }只要规则文件放在指定目录工具启动时自动注册无需改源码、重新编译。3. 快速上手从下载到还原一个 .NET 6 混淆 DLL 的完整命令流3.1 下载与环境准备确认 .NET SDK 版本与运行时兼容性de4dot-netcore 是纯 .NET 工具不依赖 Mono 或 Wine。官方发布包为de4dot-netcore-{version}.zip解压后得到de4dot.dll注意不是.exe。运行前需确认本地已安装 .NET 6 SDK最低 6.0.300或 .NET 7 SDK推荐 7.0.400因为部分MetadataReaderAPI 在 6.0.100 中存在 bug。验证命令dotnet --list-sdks # 输出应包含类似6.0.300 [/usr/share/dotnet/sdk] # 若无请从 https://dotnet.microsoft.com/download/dotnet/6.0 下载 SDK 安装包注意不要用dotnet-runtime替代dotnet-sdk。runtime缺少Microsoft.CodeAnalysis等编译时依赖会导致--rebuild模式失败。3.2 基础反混淆单文件还原与输出路径控制假设你有一个混淆后的PaymentSDK.dllTargetFrameworknet6.0执行以下命令dotnet de4dot.dll --verbose --output ./deobf/ PaymentSDK.dll参数说明--verbose输出详细日志包括检测到的混淆器类型、还原的字符串数量、控制流块合并次数--output ./deobf/指定输出目录工具会自动创建deobf/PaymentSDK-deobfuscated.dll无--rebuild时工具仅修改 IL 字节流不重新生成元数据表速度最快适合快速验证是否能跑通。执行后你会看到类似日志[INFO] Detected obfuscator: ConfuserEx (v2.0.0) [INFO] Restored 142 encrypted strings [INFO] Rebuilt 8 control flow flattened methods [INFO] Writing output to ./deobf/PaymentSDK-deobfuscated.dll此时PaymentSDK-deobfuscated.dll已可被 ILSpy 或 dnSpy 正常加载方法体不再有goto字符串字段显示为明文。3.3 高级还原启用重建模式--rebuild修复元数据损坏某些强混淆 DLL 会破坏TypeDef的Flags字段如将public改为not_public导致反编译器无法识别类继承关系。此时需启用--rebuilddotnet de4dot.dll --rebuild --strtyp delegate --output ./rebuild/ PaymentSDK.dll参数说明--rebuild触发完整元数据重建包括TypeDef,MethodDef,FieldDef表的校验与重写--strtyp delegate指定字符串解密器类型为delegate适用于 ConfuserEx 的 delegate-based string encryption其他可选值none,xor,rc4--output ./rebuild/输出目录生成rebuild/PaymentSDK-rebuilt.dll。该模式耗时较长比--verbose多 3~5 倍但能修复TypeLoadException、MissingMethodException等运行时错误。实测某金融 SDK 在--rebuild后dnSpy 可正确显示class AesCryptoService : ICryptoService的继承关系而非class AesCryptoService无父类。4. 避坑指南五个真实翻车现场与血泪解决方案4.1 现象执行dotnet de4dot.dll xxx.dll报错Could not load file or assembly System.Reflection.Metadata, Version6.0.0.0原因本地 .NET SDK 版本过低如 6.0.100其内置的System.Reflection.Metadata版本为 5.0.0.0而 de4dot-netcore 编译时绑定的是 6.0.0.0。解决升级 SDK 至 6.0.300 或更高。验证方式dotnet --list-sdks确认版本号然后删除~/.nuget/packages/system.reflection.metadata/下所有 5.x 版本缓存。4.2 现象--rebuild模式下报Failed to resolve type System.Object原因混淆器清空了AssemblyRef表中对System.Runtime的引用导致CoreMetadataReader无法定位基础类型。解决添加--reference参数显式指定运行时库路径dotnet de4dot.dll --rebuild --reference /usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/6.0.30/ref/net6.0/ PaymentSDK.dll路径可通过dotnet --list-runtimes查找对应Microsoft.NETCore.App.Ref版本。4.3 现象还原后 ILSpy 显示方法体为空或反编译出throw new NotSupportedException();原因混淆器使用了IL Native AOT混淆如 .NET 7 的PublishAottrue将 IL 编译为机器码并剥离元数据。de4dot-netcore 无法处理纯 native 二进制。解决先用dotnet-dump analyze检查是否为 AOTdotnet-dump analyze PaymentSDK.dll --command dumpheap -stat | grep NativeAOT若输出含NativeAOT则此工具无效需换用dotnet-trace或内存 dump 分析。4.4 现象--strtyp xor模式下部分字符串解密后为乱码如\u0000\u0000\u0000原因混淆器使用了多层 XOR如先xor key1再xor key2而--strtyp xor仅支持单层。解决改用--strtyp custom并提供自定义解密脚本dotnet de4dot.dll --strtyp custom --custom-str-decrypt ./decrypt.py PaymentSDK.dll其中decrypt.py需实现def decrypt(data: bytes, key: bytes) - str:函数返回解密后字符串。4.5 现象--rules-dir加载自定义规则后检测结果仍为Unknown obfuscator原因JSON 规则文件中的il_patterns是正则表达式但未转义点号.或星号*导致匹配失败。解决将il_patterns中的ldc.i4.1改为ldc\.i4\.1brtrue.s改为brtrue\.s确保正则语法正确。可先用在线工具如 regex101.com验证模式是否匹配实际 IL 字符串。5. 进阶技巧用 Python 脚本自动化批量还原 效果验证闭环5.1 批量处理脚本自动分类、还原、归档当面对几十个不同混淆器的 DLL 时手动敲命令效率极低。我写了一个batch_deobf.py它能扫描目录下所有.dll用file命令确认是否为 .NET PE调用dotnet de4dot.dll --detect-only获取混淆器类型按混淆器类型分组为每组生成专用命令如 ConfuserEx 用--strtyp delegateEazfuscator 用--strtyp rc4还原后自动用ildasm导出 IL 文本统计goto指令数量判断还原质量。核心逻辑Pythonimport subprocess, os, re def detect_obfuscator(dll_path): result subprocess.run( [dotnet, de4dot.dll, --detect-only, dll_path], capture_outputTrue, textTrue ) match re.search(rDetected obfuscator: (\w), result.stdout) return match.group(1) if match else Unknown def deobfuscate(dll_path, obfuscator): output_dir f./deobf_{obfuscator}/ os.makedirs(output_dir, exist_okTrue) cmd [dotnet, de4dot.dll, --output, output_dir] if obfuscator ConfuserEx: cmd [--strtyp, delegate] elif obfuscator Eazfuscator: cmd [--strtyp, rc4] cmd.append(dll_path) subprocess.run(cmd, checkTrue) # 主流程 for dll in [f for f in os.listdir(.) if f.endswith(.dll)]: obf detect_obfuscator(dll) print(f{dll} - {obf}) deobfuscate(dll, obf)保存为batch_deobf.py执行python3 batch_deobf.py即可全自动处理。5.2 还原效果量化验证用ildasm统计 goto 数量作为质量指标还原是否成功不能只看工具日志。我习惯加一步验证对还原前后的 DLL 分别导出 IL统计goto指令占比。# 导出原始 IL ildasm PaymentSDK.dll /outputorig.il /text /nobar # 导出还原后 IL ildasm PaymentSDK-deobfuscated.dll /outputdeobf.il /text /nobar # 统计 goto 数量Linux/macOS grep -o goto orig.il | wc -l # 假设输出 217 grep -o goto deobf.il | wc -l # 假设输出 3提示goto数量下降至原始的 5% 以内基本可认为控制流还原成功若ldstr指令数增长 10 倍以上说明字符串解密生效。这是比“能否打开”更客观的质量标尺。5.3 与 dnSpy 联动用插件自动加载还原结果并高亮差异dnSpy 支持插件扩展。我写了一个简易插件DeobfLoaderPlugin它能在 dnSpy 启动时自动扫描./deobf/目录将xxx-deobfuscated.dll与原始xxx.dll并排加载并用红色高亮显示方法体差异如原始为goto IL_001a还原后为if (x 0) { ... }。插件核心逻辑是调用ModuleDefMD.Load()加载两个模块再用MethodBody.SimplifyMacros()对比 IL 指令序列。虽然只是个小功能但让“还原是否有效”从“猜”变成了“一眼可见”。从那以后我每次拿到新混淆 DLL都强制走一遍detect → deobf → ildasm-goto-check → dnSpy-diff四步闭环。哪怕只是验证一个函数这套流程也让我少踩 70% 的“以为还原成功结果调试半天才发现逻辑错位”的坑。希望帮到你。本文还有配套的精品资源点击获取
阅读完成 · 觉得有帮助?