写在前面

  此系列是本人一个字一个字码出来的,包括示例和实验截图。由于系统内核的复杂性,故可能有错误或者不全面的地方,如有错误,欢迎批评指正,本教程将会长期更新。 如有好的建议,欢迎反馈。码字不易,如果本篇文章有帮助你的,如有闲钱,可以打赏支持我的创作。如想转载,请把我的转载信息附在文章后面,并声明我的个人信息和本人博客地址即可,但必须事先通知我

  看此教程之前,问几个问题,


🔒 华丽的分割线 🔒


调试对象

  我们都知道在高2G的空间是共用的,调试进程和被调试进程就是通过内核对象建立起联系,示意图如下:

调试篇——调试对象与调试事件-LMLPHP

  如何在调试器与被调试程序之间通过调用API建立起联系呢?一个是通过CreateProcess在参数带上调试标志以创建进程的方式进行,另一个就是DebugActiveProcess,直接附加正在运行的进程。由于DebugActiveProcess比较简单,就以该函数进行介绍,如下是它的执行流程:

graph TD kernel32!DebugActiveProcess --> 1[kernel32!DbgUiConnectToDbg] -..-> ntdll!ZwCreateDebugObject --> nt!NtCreateDebugObject 1 --> kernel32!DbgUiDebugActiveProcess -..-> ntdll!DbgUiDebugActiveProcess --> ntdll!NtDebugActiveProcess --> nt!NtDebugActiveProcess --> nt!DbgkpSetProcessDebugObject
03-03 05:23