当前位置: 首页 > news >正文

.NET 程序保护实战系列 09 · 反调试与反转储

  1. 攻击者的两大利器
    攻击方式 工具 目标
    动态调试 dnSpy、Windbg、x64dbg 单步执行、修改变量、修改逻辑
    内存转储 ProcessHacker、MegaDumper 提取解密后的 IL、字符串、密钥

  2. AntiDebug:托管 + 原生双检测
    internal static class AntiDebug
    {
    public static void Initialize()
    {
    // 方式1:托管调试器检测(Visual Studio、dnSpy 托管调试)
    if (Debugger.IsAttached)
    Environment.Exit(-1);

    // 方式2:原生调试器检测(Windbg、x64dbg、OllyDbg) try { if (IsDebuggerPresent()) Environment.Exit(-1); } catch { } // 非 Windows 平台不调用此 API

    }

    [DllImport(“kernel32.dll”)]
    static extern bool IsDebuggerPresent();
    }
    关联的 AdditionalProtectionsStep 将 AntiDebug.Initialize() 插入 …cctor(),确保在任何用户代码之前执行。

  3. AntiDump:unsafe 指针清零 PE 信息
    MegaDumper 等工具通过读取内存中的 PE 头重建程序集文件。我们的对策是直接清零 PE 关键结构:

internal static unsafe class AntiDump
{
public static void Initialize()
{
// 1. 获取模块基址 — 通过 GetModuleHandle
var module = GetModuleHandle(null);

// 2. 解析 PE 头结构 byte* basePtr = (byte*)module; var dosHeader = (IMAGE_DOS_HEADER*)basePtr; var peOffset = dosHeader->e_lfanew; var ntHeaders = (IMAGE_NT_HEADERS*)(basePtr + peOffset); var sections = (IMAGE_SECTION_HEADER*)( basePtr + peOffset + sizeof(IMAGE_NT_HEADERS) - // 其实是 sizeof(IMAGE_NT_HEADERS64) sizeof(IMAGE_OPTIONAL_HEADER64) + ntHeaders->FileHeader.SizeOfOptionalHeader); // 3. 清零 PE 节区名称(每个节区 Name 字段 8 字节) for (int i = 0; i < ntHeaders->FileHeader.NumberOfSections; i++) *(ulong*)sections[i].Name = 0; // "ILT\0\0\0\0" → "\0\0\0\0\0\0\0\0" // 4. 清零 CLR 元数据目录 var corHeader = GetCorHeader(basePtr, ntHeaders); *(uint*)&corHeader->cb = 0; // 大小清零 *(uint*)&corHeader->MajorRuntimeVersion = 0; *(uint*)&corHeader->MinorRuntimeVersion = 0; // 5. 清零元数据流名称 // #~, #Strings, #US, #GUID, #Blob 流名称统一清零 var metaData = GetMetadataRoot(corHeader); for (int i = 0; i < metaData->StreamHeaders.Streams; i++) *(ulong*)metaData->StreamHeaders.Stream[i].Name = 0; // 6. 修改导入表中的 VirtualProtect 调用痕迹 var importTable = GetImportTable(basePtr, ntHeaders); for (int i = 0; i < importTable->Count; i++) { importTable->Entries[i].ModuleName[0] = '?'; // 隐藏模块名 importTable->Entries[i].FuncName[0] = '?'; // 隐藏函数名 } }

}
关键:使用 GetModuleHandle 替代 Marshal.GetHINSTANCE,避免 .NET 版本跨平台兼容性问题。

  1. 元数据混淆:虚假 TypeDef + MVID 修改
    // 添加 5-8 个虚假 TypeDef
    int count = random.Next(5, 9);
    for (int i = 0; i < count; i++)
    {
    var fakeType = new TypeDefUser(
    “”, // 空命名空间
    GenerateInvisibleName(random), // 不可见 Unicode 名称
    module.CorLibTypes.Object.TypeDefOrRef);
    fakeType.Attributes = TypeAttributes.Public | TypeAttributes.Class;

    // 每个虚假类型添加 1-2 个空方法
    int methodCount = random.Next(1, 3);
    for (int j = 0; j < methodCount; j++)
    {
    var method = new MethodDefUser(
    GenerateInvisibleName(random),
    MethodSig.CreateStatic(module.CorLibTypes.Void),
    MethodAttributes.Public | MethodAttributes.Static);
    method.Body = new CilBody();
    method.Body.Instructions.Add(Instruction.Create(OpCodes.Ret));
    fakeType.Methods.Add(method);
    }

    module.Types.Add(fakeType);
    }

// 修改 MVID 破坏反编译器缓存
module.Mvid = Guid.NewGuid();
5. AdditionalProtectionsStep:四项保护统筹
public class AdditionalProtectionsStep : IProtectionStep
{
public string Name => “其它推荐保护”;
public int Order => 40;

public bool IsEnabled(ProtectOptions options) => options.Additional; public void Inject(ProtectionContext context) { // 根据配置选择性注入 if (context.Options.AntiDebug) InjectAntiDebug(context); // AntiDebug 类型 if (context.Options.AntiDump) InjectAntiDump(context); // AntiDump 类型 if (context.Options.EncryptResources) EncryptResources(context); // SPN 三阶段加密(详见第10篇) if (context.Options.MetadataConfusion) InjectFakeTypes(context); // 虚假 TypeDef + MVID 修改 } public void Execute(ProtectionContext context) { // 在 <Module>.cctor 开头插入初始化调用 InsertCctorCalls(context.Module, new[] { context.Options.AntiDebug ? "AntiDebug.Initialize" : null, context.Options.AntiDump ? "AntiDump.Initialize" : null, context.Options.EncryptResources ? "ResourceEncryptor.Initialize" : null, }); }

}
6. 结语
反调试和反转储是动态防御的核心。对抗有经验的逆向工程师需要层层设防——从调试器检测到内存清除再到元数据混淆。这些技术与之前文章中的静态保护形成完整的立体防护。

http://www.jsqmd.com/news/1228765/

相关文章:

  • 分布式软总线认证模块架构与实现分析
  • 10分钟上手Awesome-AIGC-3D:初学者必备的3D AIGC工具使用教程
  • 2026泸州景区古建牌坊检测排名 TOP5 CMA 资质机构提供牌坊裂缝检测、牌坊倾斜检测、老化检测 联系方式推荐 - 诚金汇钻回收公司
  • DOSBox-X终极指南:解锁复古游戏与Windows模拟的完整教程
  • TI eCAP模块深度解析:从捕获到APWM,掌握嵌入式实时控制核心
  • 互联网大厂 Java 求职面试:从基础到复杂的技术考察
  • TI CPTS时间同步协处理器:事件FIFO管理与高精度时间戳实现
  • 终极指南:Redpill Recovery (RR) - 快速搭建专业级黑群晖NAS的完整解决方案
  • 2026年毕业论文指导小程序全方位横评:五大真实平台深度对比
  • InSPyReNet实战应用:如何用这个AI工具创建专业级图像编辑软件
  • 2026泰安工程建筑材料检测排名 TOP5 CMA 资质提供钢材检测、水泥检测、砂石检测 全覆盖联系方式推荐 - 科信检测
  • 手办交流与交易系统设计与实现开题报告
  • 分布式软总线认证方式分析
  • 如何永久保存Spotify音乐:spotDL完整免费下载指南
  • 如何快速掌握ComfyUI Essentials:AI图像处理的新手完整教程
  • AI建站工具怎么用?从零到上线一份完整的保姆级攻略
  • 5分钟极速部署Bonsai-8B:1位量化大模型全平台实战指南
  • 发现Yaagl:重新定义动漫游戏体验的创新开源工具
  • 车企芯片减配内幕:8155芯片性能与识别指南
  • 免费跨平台原型设计工具:Pencil如何帮助新手快速上手UI设计
  • MySQL 3:数据类型
  • 技术赋能:开源视频生成生态的整合革命
  • 传奇3官网下载与安装问题全攻略
  • C语言学习心得(2026.7.19)
  • 还在为论文AI率发愁吗?别再花冤枉钱买那些低效的降AI工具
  • CosyVoice终极指南:零基础实现多语言语音合成,支持中文、日文、粤语等100+语言
  • 2026 北京朝阳区老牌翡翠回收实体全面测评排行,当场出价无套路 - 奢侈品回收实体店
  • Windows系统文件DragDropExperienceDataExchangeDelegated.dll丢失找不到问题解决
  • 互联网大厂 Java 面试:从 Spring Boot 到微服务的深度探讨
  • RPCS3模拟器:5个步骤让你在电脑上重温PS3经典游戏