- #include <stdio.h>
- #include <Windows.h>
- #include <Psapi.h>
- #include <tchar.h>
- #include <Winuser.h>
- #pragma comment(lib, "psapi.lib")
- #define BUFSIZE 512
- int main()
- {
- STARTUPINFO si = { 0 };
- PROCESS_INFORMATION pi = { 0 };
- wchar_t *target = L"C:\\windows\\system32\\notepad.exe";
- //타겟프로세스 세팅
- if (TRUE != CreateProcessW(
- target,
- NULL,
- NULL,
- NULL,
- FALSE,
- CREATE_NEW_CONSOLE | DEBUG_PROCESS, // DEBUG_PROCESS 로 설정하면 자식프로세스까지 추적할 수 있다.
- NULL,
- NULL,
- &si,
- &pi))
- {
- printf("CreateProcess() failed, gle = %u", GetLastError());
- return -1;
- }
- printf("process created. pid = %u", pi.dwProcessId);
- CloseHandle(pi.hThread);
- CloseHandle(pi.hProcess);
- DEBUG_EVENT debug_event = { 0 };
- _LOAD_DLL_DEBUG_INFO *dll_debug_info;
- //load dll event가 발생했을때 사용하는 구조체이다
- while (1){
- if (TRUE != WaitForDebugEvent(&debug_event, 100)) continue;
- char* str = NULL;
- switch (debug_event.dwDebugEventCode)
- {
- case EXCEPTION_DEBUG_EVENT: str = "EXCEPTION_DEBUG_EVENT"; break;
- case CREATE_THREAD_DEBUG_EVENT: str = "CREATE_THREAD_DEBUG_EVENT"; break;
- case CREATE_PROCESS_DEBUG_EVENT:str = "CREATE_PROCESS_DEBUG_EVENT"; break;
- case EXIT_THREAD_DEBUG_EVENT: str = "EXIT_THREAD_DEBUG_EVENT"; break;
- case EXIT_PROCESS_DEBUG_EVENT: str = "EXIT_PROCESS_DEBUG_EVENT"; break;
- case LOAD_DLL_DEBUG_EVENT:
- str = "LOAD_DLL_DEBUG_EVENT";
- dll_debug_info = (LOAD_DLL_DEBUG_INFO*)&debug_event.u;
- GetFileNameFromHandle(dll_debug_info->hFile); // 아래 url 참조
- break;
- case UNLOAD_DLL_DEBUG_EVENT: str = "UNLOAD_DLL_DEBUG_EVENT"; break;
- case OUTPUT_DEBUG_STRING_EVENT: str = "OUTPUT_DEBUG_STRING_EVENT"; break;
- case RIP_EVENT: str = "RIP_EVENT"; break;
- default: str = "unknown";
- }
- printf("debug event code = %s", str);
- DWORD continue_status = DBG_CONTINUE;
- ContinueDebugEvent(debug_event.dwProcessId, debug_event.dwThreadId, continue_status);
- //디버기프로세스를 계속 실행한다
- //프로세스 종료 이벤트가 발생했다면 디버거를 종료한다
- if (EXIT_PROCESS_DEBUG_EVENT == debug_event.dwDebugEventCode){
- printf("debuggee is terminate.");
- break;
- }
- }
- return 0;
- }
간단한 window 디버거이다.
어떤 이벤트가 발생했는지 확인할 수 있고,
프로그램에 로드되는 dll의 이름들을 확인할 수 있다.
GetFileNameFromHandle의 소스코드는 다음 url에서 받아왔다.
댓글