注入DLL作为调试器
所以,最近我一直在编写一个类似调试器的小程序,当debugee遇到断点时,它有一个简单的任务来读取/写入EAX寄存器值。在此之前我花了很多时间尝试它被暂停后恢复线程,但后来我想出来并成功恢复了线程..现在我试图让同一个程序工作但是作为 DLL ,并清楚这里的理论:
1.将DLL注入进程
2.设置断点
3.运行调试循环(通过 CreateThread()在新线程中,因为它是 DLL ,如果我们不创建新的,它将会挂起线程)
4.一旦遇到断点,调试对象就会出现问题(这就是问题)
奇怪的是,当调试器是可执行程序(EXE而不是DLL)时,它并没有崩溃,尽管它们都有相同的代码(除了一些小的改动) .. <登记/>
还有一点需要提一下,调试过程是通过 Win32 API 函数完成的。
这里是我的代码进入主题:
void DebuggingLoop()
{
DWORD Breakpoint = 0x12345678;
DWORD dwProcessId = GetCurrentProcessId();
DebugActiveProcess(dwProcessId);
DebugSetProcessKillOnExit(false);
//EnableDebuggingPrivileges(TRUE);
DWORD dwThreadID = _GetThreadId(dwProcessId);
HANDLE hThread = OpenThread(THREAD_ALL_ACCESS,false,dwThreadID);
CONTEXT ctx = {0};
ctx.ContextFlags = CONTEXT_DEBUG_REGISTERS;// | CONTEXT_CONTROL;// | CONTEXT_INTEGER | CONTEXT_EXTENDED_REGISTERS;
GetThreadContext(hThread,&ctx);
ctx.Dr0 = Breakpoint;
ctx.Dr7 = 0x00000001;
SetThreadContext(hThread,&ctx);
CloseHandle(hThread);
hThread = NULL;
DEBUG_EVENT dbgEvent;
while(true)
{
WaitForDebugEvent(&dbgEvent, INFINITE);
switch(dbgEvent.dwDebugEventCode)
{
case EXCEPTION_DEBUG_EVENT:
{
if(dbgEvent.u.Exception.ExceptionRecord.ExceptionCode == EXCEPTION_SINGLE_STEP)
{
if(dbgEvent.u.Exception.ExceptionRecord.ExceptionAddress == (LPVOID)Breakpoint)
{
//This Section is not being executed due to crash
if(hThread = OpenThread(THREAD_ALL_ACCESS, false, dwThreadID))
{
SuspendThread(hThread);
GetThreadContext(hThread, &ctx);
ctx.Eax = 7;
SetThreadContext(hThread,&ctx);
ResumeThread(hThread);
CloseHandle(hThread);
}
}
}
ContinueDebugEvent(dbgEvent.dwProcessId,dbgEvent.dwThreadId,DBG_CONTINUE);
break;
}
default:
ContinueDebugEvent(dbgEvent.dwProcessId,dbgEvent.dwThreadId,DBG_EXCEPTION_NOT_HANDLED);
}
}
}
所以:
Q1:有什么方法可以解决这个问题吗? (步骤4)
Q2:有没有办法实现Win32 API以外的调试过程?