免费获取学习方案
ARTICLE DETAIL

资讯详情

深耕编程基础知识与建站技术分享的一线实战洞察。

如何用 MemorySharp 检测反调试?PEB.BeingDebugged 攻防实战

如何用 MemorySharp 检测反调试?PEB.BeingDebugged 攻防实战 如何用 MemorySharp 检测反调试PEB.BeingDebugged 攻防实战【免费下载链接】MemorySharpA C# based memory editing library targeting Windows applications, offering various functions to extract and inject data and codes into remote processes to allow interoperability.项目地址: https://gitcode.com/gh_mirrors/me/MemorySharpMemorySharp 是一款基于 C# 的 Windows 内存编辑库专注于与远程进程的深度交互。在逆向分析与安全研究中反调试检测是绕不开的课题而 PEB.BeingDebugged 正是最经典的检测点。本文将以通俗易懂的方式带你用 MemorySharp 完成一次从检测反调试到绕过反调试的完整攻防实战。反调试是什么为什么离不开 PEB反调试Anti-Debugging是软件为防止自己被调试器分析而采取的技术手段。游戏、加壳软件、商业程序经常会检查自己是否正被调试一旦发现就弹窗警告、退出甚至蓝屏让调试者的工作寸步难行。在 Windows 中每个进程都有一块名为PEBProcess Environment Block进程环境块的内核数据结构它记录了进程的诸多运行状态。其中偏移0x02处有一个 1 字节的标志位BeingDebugged——只要进程被调试器附加系统就会自动把它置为1。这一字段的偏移定义可以在 Enumerations.cs 中看到BeingDebugged 0x2PEB 偏移 0x02所以最简单的反调试检测就是读取自己 PEB 里这个标志位。而 MemorySharp 恰好把这个能力封装成了开箱即用的属性。MemorySharp 检测反调试的一行代码方案MemorySharp 在设计时就把 PEB 操作做成了基础设施。在 MemorySharp.cs 中公开了一个IsDebugged属性它内部直接映射到 PEB 的BeingDebugged字段读取与写入都只需一行代码using System; using System.Diagnostics; using Binarysharp.MemoryManagement; // 1. 通过 PID 打开目标进程 using (var sharp new MemorySharp(processId)) { // 2. 检测反调试状态目标进程是否被调试器附加 if (sharp.IsDebugged) { Console.WriteLine(检测到调试器); } else { Console.WriteLine(未发现调试器安全。); } }这个属性背后的实现非常清晰IsDebugged的 getter 读取的是Peb.BeingDebugged而Peb是 ManagedPeb.cs 中封装的ManagedPeb对象它对 PEB 结构做了全面托管化——你甚至可以像操作普通 C# 对象一样读写NtGlobalFlag、ProcessHeap、Ldr等底层字段。你可以在测试用例 MemorySharpTests.cs 中找到官方对IsDebugged的验证逻辑CheckIfNoDebuggerIsAttached这本身就是一份绝佳的检测反调试参考样例。攻如何用 MemorySharp 绕过反调试检测既然BeingDebugged只是进程内存里的一个字节那我们完全可以直接改写它让目标程序以为自己没被调试。这正是攻的乐趣所在——而且 MemorySharp 让这件事简单得令人发指using (var sharp new MemorySharp(processId)) { // 一键抹掉 BeingDebugged 标志骗过最基础的检测 sharp.IsDebugged false; Console.WriteLine(反调试标记已清除现在程序认为自己没被调试。); }仅仅两行代码就完成了一次经典的反调试绕过。原理是 MemorySharp 通过WriteProcessMemory之类的底层调用把 PEB 偏移 0x02 处的字节改写为 0。由于 MemorySharp 在初始化时会自动通过NtQueryInformationProcess定位 PEB 基地址见 ManagedPeb.cs 的FindPeb方法你甚至不需要关心 PEB 地址怎么算。防目标程序如何加固反调试检测有攻就有防。如果程序只检查一次BeingDebugged被抹掉后就再无防备。因此负责任的加固方案通常包括持续轮询开一个后台线程每隔几十毫秒重新读取BeingDebugged一旦发现被置回1就立刻自毁。MemorySharp 的Threads工厂完全可以在远程进程里创建这样的哨兵线程。多点交叉验证除了BeingDebuggedPEB 中NtGlobalFlag偏移 0x68在被调试时会带上0x70的特征值堆检查标志ProcessHeap的 Flags 字段也会异常。MemorySharp 的 ManagedPeb.cs 已封装了这些字段防守方可用同样的库做多点校验。检测父进程正常双击启动的程序父进程是explorer.exe被调试器启动时父进程往往是调试器本身。可通过读取 PEB 中的ProcessParameters等字段交叉判断。可以看出攻防双方用的是同一份底层数据、同一套工具比拼的只是谁先动手、谁检查得更勤。实战小结与注意事项检测反调试读sharp.IsDebugged非0即被调试。绕过反调试写sharp.IsDebugged false抹除标志。加固反调试多点校验 定时轮询别只信一个字段。最后提醒三点其一MemorySharp 目前主要面向 32 位开发使用时请确保目标进程位数匹配其二这类技术仅可用于自己的程序、CTF 比赛或已获授权的安全研究请勿用于破解他人软件其三需要动手实践的话可通过git clone https://gitcode.com/gh_mirrors/me/MemorySharp获取源码参考 MemorySharp.cs 与 ManagedPeb.cs 的完整实现。从一行IsDebugged开始你已经掌握了 Windows 反调试攻防中最经典的入口。剩下的就交给实战去检验吧【免费下载链接】MemorySharpA C# based memory editing library targeting Windows applications, offering various functions to extract and inject data and codes into remote processes to allow interoperability.项目地址: https://gitcode.com/gh_mirrors/me/MemorySharp创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表