2022-01-05调试器00
请注意,本文编写于 328 天前,最后修改于 328 天前,其中某些信息可能已经过时。

目录


调试框架

调试器去调试一个程序时,下断点是通过造异常来通知调试器的

  1. 建立调试会话
c
CreateProcess 标志 DEBUG_ONLY_THIS_PROCESS 创建进程
DebugActiveProcess 附加进程
在调试循环中等待调试事件并处理
  1. 循环等待调试事件(异常)
c
WaitForDebugEvent
  1. 处理事件
c
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;

调试事件

c
EXCEPTION_DEBUG_EVENT       // 异常调试
CREATE_THREAD_DEBUG_EVENT:  // 创建线程
CREATE_PROCESS_DEBUG_EVENT: // 创建进程
EXIT_THREAD_DEBUG_EVENT:    // 退出线程
EXIT_PROCESS_DEBUG_EVENT:   // 退出进程
LOAD_DLL_DEBUG_EVENT:       // 加载DLL
UNLOAD_DLL_DEBUG_EVENT:     // 卸载DLL
OUTPUT_DEBUG_STRING_EVENT:  // OutputString
RIP_EVENT:                  // RIP
  1. 提交处理结果
c
ContinueDebugEvent

LOAD_DLL_DEBUG_EVENT

asm
;===================================
;OnLoadDllDebugEvent 调试事件 导入dll
;参数:hProcess 进程句柄, hThread 线程句柄, lpContext 线程的上下文, lpDebugEvent 调试事件
;返回值:DBG_CONTINUE or DBG_EXCEPTION_NOT_HANDLED
;===================================
OnLoadDllDebugEvent proc uses esi edi hProcess:HANDLE, hThread:HANDLE, lpDebugEvent:LPVOID, lpContext:LPVOID
    LOCAL @dwResult:DWORD
    LOCAL @lpImageAddr:LPVOID
    LOCAL @szFileName[256]:word
    LOCAL @NumberOfByteRead:DWORD
    LOCAL @dwCount:DWORD

    mov @dwResult, DBG_EXCEPTION_NOT_HANDLED
    mov esi, lpDebugEvent
    assume esi:ptr DEBUG_EVENT
    lea esi, [esi].u
    assume esi:ptr LOAD_DLL_DEBUG_INFO
    [esi].lpBaseOfDll
    mov ebx, [esi].lpImageName
    invoke ReadProcessMemory, hProcess, ebx, addr @lpImageAddr, 4, NULL
    invoke ReadProcessMemory, hProcess, @lpImageAddr, addr @szFileName, sizeof @szFileName, addr @NumberOfByteRead
    .if eax == 0
        jmp EXIT_PROC
    .endif

    mov ax, [esi].fUnicode
    .if ax == 0
        invoke crt_printf, addr @szFileName
        invoke crt_printf, offset g_strNewLine
        mov @dwResult, DBG_CONTINUE
    .elseif
        invoke crt_wprintf, addr @szFileName
        invoke crt_printf, offset g_strNewLine
        mov @dwResult, DBG_CONTINUE
    .endif

EXIT_PROC:

  mov eax, @dwResult
  ret
OnLoadDllDebugEvent endp

本文作者:Na1r

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!