其他
初探Windows调试原理和反附加手段
看雪论坛作者ID:Jev0n
1
用户态调试基本流程
int main(int argc,TCHAR *argv[])
{
DWORD dwPID;
BOOL waitEvent = TRUE;
if (argc > 1) {
dwPID = atoi(argv[1]);
}
else {
printf("usage: MyDebugger.exe dwPID\n");
exit(0);
}
DebugActiveProcess(dwPID);
while (waitEvent)
{
DEBUG_EVENT MyDebugInfo;
waitEvent = WaitForDebugEvent(&MyDebugInfo, INFINITE); // Waiting
switch (MyDebugInfo.dwDebugEventCode)
{
case EXIT_PROCESS_DEBUG_EVENT:
waitEvent = FALSE
break;
}
if (waitEvent) {
ContinueDebugEvent(debugEvent.dwProcessId, debugEvent.dwThreadId, DBG_CONTINUE);
}
}
return 0;
}
CreateProcess(path, // 可执行模块路径
NULL, // 命令行
NULL, // 安全描述符
NULL, // 线程属性是否可继承
FALSE, // 否从调用进程处继承了句柄
DEBUG_ONLY_THIS_PROCESS, // 以“只”调试的方式启动
NULL, // 新进程的环境块
NULL, // 新进程的当前工作路径(当前目录)
&stcStartupInfo, // 指定进程的主窗口特性
&stcProcInfo)) // 接收新进程的识别信息
typedef struct _DEBUG_EVENT {
DWORD dwDebugEventCode;
DWORD dwProcessId;
DWORD dwThreadId;
union {
EXCEPTION_DEBUG_INFO Exception;
CREATE_THREAD_DEBUG_INFO CreateThread;
CREATE_PROCESS_DEBUG_INFO
CreateProcessInfo;
EXIT_THREAD_DEBUG_INFO ExitThread;
EXIT_PROCESS_DEBUG_INFO ExitProcess;
LOAD_DLL_DEBUG_INFO LoadDll;
UNLOAD_DLL_DEBUG_INFO UnloadDll;
OUTPUT_DEBUG_STRING_INFO DebugString;
RIP_INFO RipInfo;
} u;
} DEBUG_EVENT, *LPDEBUG_EVENT;
2
用户态 DebugActiveProcess 实现
我们通过查找NT5的源码可以看到DebugActiveProcess 具体实现代码,主要就是调用了DbgUiConnectToDbg ,ProcessIdToHandle和DbgUiDebugActiveProcess这三个函数。
DbgUiConnectToDbg
ProcessIdToHandle
DbgUiDebugActiveProcess
全览图
3
调试子系统
4
反附加手段
根据此前内容知道,当调试器附加一个进程的时候是调用DebugActiveProcess函数,该函数内部调用了DbgUiDebugActiveProcess,此函数内部会调用DbgUiIssueRemoteBreakin函数,最后内部则会通过RtlCreateUserThread在被调试进程内创建一个线程,线程的起始地址是DbgUiRemoteBreakin。
5
反反附加插件
6
x64dbg的Titan Engine
对于新版x64dbg会内嵌Titan Engine(2020年11月12日版本后添加),所以SharpOD插件对于反反附加对新版本x64dbg起不到作用。在Titan Engine内部自己实现了DebugActiveProcess一套流程。
7
总结
本文初步学习了Windows用户层基本的调试原理和模型,并给出了一个简单的反附加方案,同时分析了目前常见的反反附加插件。不过同时存在不知道如何绕过SharpOD的反反附加检测等问题,还需要进一步学习研究。因为本人水平有限,如果存在错误还望各位前辈指正。
看雪ID:Jev0n
https://bbs.pediy.com/user-home-870016.htm
# 往期推荐
2. 祥云杯2021 Windows R0题 Rev_APC
球分享
球点赞
球在看
点击“阅读原文”,了解更多!