注入DLL作为调试器

时间:2015-08-24 13:11:18

标签: c++ debugging dll

注入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以外的调试过程?

0 个答案:

没有答案