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