본문 바로가기
Study/Window

Simple window debugger(미완성)

by Melpin 2015. 11. 20.
  1. #include <stdio.h>
  2. #include <Windows.h>
  3. #include <Psapi.h>
  4. #include <tchar.h>
  5. #include <Winuser.h>
  6. #pragma comment(lib, "psapi.lib")
  7. #define BUFSIZE 512
  8.  
  9. int main()
  10. {
  11.         STARTUPINFO si = { 0 };
  12.         PROCESS_INFORMATION pi = { 0 };
  13.         wchar_t *target = L"C:\\windows\\system32\\notepad.exe";
  14.         //타겟프로세스 세팅
  15.         if (TRUE != CreateProcessW(
  16.                 target,
  17.                 NULL,
  18.                 NULL,
  19.                 NULL,
  20.                 FALSE,
  21.                 CREATE_NEW_CONSOLE | DEBUG_PROCESS, // DEBUG_PROCESS 로 설정하면 자식프로세스까지 추적할 수 있다.
  22.                 NULL,
  23.                 NULL,
  24.                 &si,
  25.                 &pi))
  26.         {
  27.                 printf("CreateProcess() failed, gle = %u", GetLastError());
  28.                 return -1;
  29.         }
  30.         printf("process created. pid = %u", pi.dwProcessId);
  31.         CloseHandle(pi.hThread);
  32.         CloseHandle(pi.hProcess);
  33.         DEBUG_EVENT debug_event = { 0 };
  34.         _LOAD_DLL_DEBUG_INFO *dll_debug_info;
  35.         //load dll event가 발생했을때 사용하는 구조체이다
  36.         while (1){
  37.                 if (TRUE != WaitForDebugEvent(&debug_event, 100)) continue;
  38.  
  39.                 char* str = NULL;
  40.                 switch (debug_event.dwDebugEventCode)
  41.                 {
  42.                 case EXCEPTION_DEBUG_EVENT:              str = "EXCEPTION_DEBUG_EVENT"; break;
  43.                 case CREATE_THREAD_DEBUG_EVENT:  str = "CREATE_THREAD_DEBUG_EVENT"; break;
  44.                 case CREATE_PROCESS_DEBUG_EVENT:str = "CREATE_PROCESS_DEBUG_EVENT";     break;
  45.                 case EXIT_THREAD_DEBUG_EVENT:   str = "EXIT_THREAD_DEBUG_EVENT"; break;
  46.                 case EXIT_PROCESS_DEBUG_EVENT: str = "EXIT_PROCESS_DEBUG_EVENT"; break;
  47.                 case LOAD_DLL_DEBUG_EVENT:
  48.                         str = "LOAD_DLL_DEBUG_EVENT";
  49.                         dll_debug_info = (LOAD_DLL_DEBUG_INFO*)&debug_event.u;
  50.                         GetFileNameFromHandle(dll_debug_info->hFile); // 아래 url 참조
  51.                         break;
  52.                 case UNLOAD_DLL_DEBUG_EVENT:     str = "UNLOAD_DLL_DEBUG_EVENT"; break;
  53.                 case OUTPUT_DEBUG_STRING_EVENT:  str = "OUTPUT_DEBUG_STRING_EVENT"; break;
  54.                 case RIP_EVENT:                                  str = "RIP_EVENT"; break;
  55.                 default:                                                 str = "unknown";
  56.                 }
  57.                 printf("debug event code = %s", str);
  58.                 DWORD continue_status = DBG_CONTINUE;
  59.  
  60.                 ContinueDebugEvent(debug_event.dwProcessId, debug_event.dwThreadId, continue_status);
  61.                 //디버기프로세스를 계속 실행한다
  62.                 //프로세스 종료 이벤트가 발생했다면 디버거를 종료한다
  63.                 if (EXIT_PROCESS_DEBUG_EVENT == debug_event.dwDebugEventCode){
  64.                         printf("debuggee is terminate.");
  65.                         break;
  66.                 }
  67.         }
  68.         return 0;
  69. }

간단한 window 디버거이다.
어떤 이벤트가 발생했는지 확인할 수 있고,
프로그램에 로드되는 dll의 이름들을 확인할 수 있다.

GetFileNameFromHandle의 소스코드는 다음 url에서 받아왔다.


댓글