论坛首页 逆向工程技术区 阅读主题

[原创]windows调试体系初探

236 浏览 18 回复
#1 楼主 2026-06-01 21:08:57
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.exeObCreateObject创建调试对象ExInitializeFastMutex (&DebugObject->Mutex); InitializeListHead (&DebugObject->EventList); KeInitializeEvent (&DebugObject->EventsPresent, NotificationEvent, FALSE);‌互斥锁 ‌事件链表 ‌事件对象初始化,保证同步操作ObInsertObject将调试对象插入进程句柄表


回复或点赞可查看完整内容

---
来源: 看雪论坛
原文链接: https://bbs.kanxue.com/thread-288064.htm
#2 2026-06-01 21:08:57
学习一下
#3 2026-06-01 21:08:57
谢谢分享
#4 2026-06-01 21:08:57
mark
#5 2026-06-01 21:08:57
感谢楼主分享
#6 2026-06-01 21:08:57
mark
#7 2026-06-01 21:08:57
谢谢分享
#8 2026-06-01 21:08:57
学习一下
#9 2026-06-01 21:08:57
你的分享对大家帮助很大,非常感谢!
#10 2026-06-01 21:08:57
真好,谢谢,学习中
#11 2026-06-01 21:08:57
学习一下
#12 2026-06-01 21:08:57
谢谢分享
#13 2026-06-01 21:08:57
学习一下
#14 2026-06-01 21:08:57
学习一下
#15 2026-06-01 21:08:57
dddd
#16 2026-06-01 21:08:57
学习一下
‹ 上一页 1 2 下一页 ›

请登录后参与讨论

立即登录 注册账号