파이썬 해킹 프로그래밍 (Python Hacking Programming)
저자 : 저스틴 지이츠
출판사 : 에이콘
3장. 윈도우 디버거 개발
[3.3] 디버그 이벤트 핸들러 구현
[3.3 디버그 이벤트 핸들러 구현]
이벤트가 발생했을 때 디버거가 그 이벤트에 반응하기 위해서는 각 디버깅 이벤트에 대한 핸들러를 구현해야 한다.
WaitForDebugEvent() 함수를 통해 이벤트가 발생할 때마다 DEBUG_EVENT 구조체를 매번 반환한다.
다음 DEBUG_EVENT 구조체를 살펴보자.
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; |
이 구조체 안에는 유용한 정보가 많이 포함되어 있다.
특히 dwDebugEventCode를 통해 발생한 이벤트가 어떤 종류의 이벤트인지 판단할 수 있다.
이 멤버를 통해 이벤트의 종류를 알게되면 u 유니언에서 어떤 구조체를 사용해야 하는지 알 수 있게 된다.
이벤트 코드 | 이벤트 코드값 | 유니언 u의 값 | 설 명 | ||||||
0x01 | EXCEPTION_DEBUG_EVENT | u.Exception | Debuggee에서 예외(Software Break, Zero Division, Invalid Memory Access, SEH, etc..)가 일어나면 발생 | ||||||
0x02 | CREATE_THREAD_DEBUG_EVENT | u.CreateThread | 프로세스가 Debugger에 Attach 되거나 Debuggee에서 새로운 스레드가 생성 될 때 발생 | ||||||
0x03 | CREATE_PROCESS_DEBUG_EVENT | u.CreateProcessInfo | 프로세스가 Debugger에 Attach 되거나 Debuggee에서 새로운 프로세스가 생성 될 때 발생 | ||||||
0x04 | EXIT_THREAD_DEBUG_EVENT | u.ExitThread | Debuggee의 스레드가 종료될 때 마다 발생 | ||||||
0x05 | EXIT_PROCESS_DEBUG_EVENT | u.ExitProcess | Debuggee가 Debugger로부터 떨어져 나오거나 Debuggee 자체가 종료될 때 발생 | ||||||
0x06 | LOAD_DLL_DEBUG_EVENT | u.LoadDll | Debugee가 DLL을 로드하면 발생 | ||||||
0x07 | UNLOAD_DLL_DEBUG_EVENT | u.UnloadDll | Debuggee가 DLL을 언로드하면 발생 | ||||||
0x08 | OUTPUT_DEBUG_STRING_EVENT | u.DebugString | Debuggee가 OutputDebugString 함수를 호출시 발생 | ||||||
0x09 | RIP_EVENT | u.RipInfo | RIP-debugging event (System Debugging Error) |
다음은 calc.exe에 대해서 위 스크립트(올려놓은 소스코드)를 실행한 결과다.
CREATE_PROCESS_EVENT(0x03)가 가장먼저 발생됐고 곧바로 LOAD_DLL_DEBUG_EVENT(0x06)가 발생됐다.
그 이후에는 CREATE_THREAD_DEBUG_EVENT(0x02)와 EXCEPTION_DEBUG_EVENT(0x01)가 발생됐다.
EXCEPTION_DEBUG_EVENT(0x01)는 윈도우가 처리하는 이벤트로서 디버거가 해당 프로세스가 계속 실행되기 만들기 전에
그 프로세스의 상태정보를 조사할 수 있게 해준다.
마지막에 발생한 EXIT_THREAD_DEBUG_EVENT(0x04)는 단순히 TID가 464인 스레드가 종료된다는 것을 나타낸다.
예외 이벤트는 브레이크 포인트, 접근 위반이나 올바르지 않은 접근 권한으로 메모리에 접근(읽기 전용 속성의 메모리 영역에 데이터를
쓰려고 할 때 등)할 때 발생한다.
'정상을향해 > Program Analysis' 카테고리의 다른 글
Ponce(2016, IDA Plugin) - symbolic execution (0) | 2016.12.28 |
---|---|
Mac OS에 Metasploit Framework 설치 방법 (0) | 2016.12.26 |
Python Hacking Programming (3) (0) | 2013.11.10 |
Python Hacking Programming (1) (0) | 2013.11.10 |
PE File Format (4) (0) | 2013.11.10 |
PE File Format (3) (0) | 2013.11.10 |