-
-
[原创]windows调试体系初探
-
发表于:
2025-8-16 02:36
3019
-

DebugActiveProcess 建立连接 WaitForDebugEvent等待调试事件 事件处理完成后,使用 ContinueDebugEvent 恢复线程执行
调试事件
断点种类:
软件断点:int3 0xcc触发异常
硬件断点:DR寄存器
内存断点:设置页面属性
标志位;常见调试器特征;断点检测;时间检测;异常干扰;花指令等
使用 IsDebuggerPresent 检测调试器
最简单的反调试技术之一是使用 WinAPI IsDebuggerPresent。此函数如果检测到调试器附加到调用进程,则返回 TRUE;如果未检出调试器,则返回 FALSE。

NtQueryInformationProcess 检测 原理: 通过调用 NtQueryInformationProcess 函数,查询进程信息中的 ProcessDebugPort 字段。若该值不为 0,说明进程被调试器附加(调试器会通过该端口与被调试进程通信)。
那么像标志位检测,为什么检测这个标志位的值就知道进程有没有被调试,背后的原理是什么?这就需要我们逆向windwos调试相关的函数了。不然只得其形不得其意。
通过DebugActiveProcess函数,建立调试进程和被调试进程的链接
通过创建进程 CreateProcess,参数dwCreationFlags给DEBUG_ONLY_THIS_PROCESS,最终也会调用DebugActiveProcess中的函数

kernelbase.dll中

DbgUiConnectToDbg 创建调试对象
ProcessIdToHandle 获取被调试进程句柄
DbgUiDebugActiveProcess 关联调试进程;发假消息;创建远程线程int3;
NtClose 关闭句柄,DbgUiDebugActiveProcess执行失败则设置错误码;
ntdll.dll中

DbgUiConnectToDbg 创建调试对象
判断有没有句柄,然后进内核创建调试对象
NtCurrentTeb()->DbgSsReserved[1]中存储的是当前线程关联的调试对象句柄
ntoskrnl.exe

ObCreateObject创建调试对象
ExInitializeFastMutex (&DebugObject->Mutex); InitializeListHead (&DebugObject->EventList); KeInitializeEvent (&DebugObject->EventsPresent, NotificationEvent, FALSE);
互斥锁 事件链表 事件对象初始化,保证同步操作
ObInsertObject将调试对象插入进程句柄表
传播安全知识、拓宽行业人脉——看雪讲师团队等你加入!
最后于 2025-8-16 02:56
被只会逆一点点编辑
,原因: