본문 바로가기
정상을향해/Program Analysis

Python Hacking Programming (2)

by 사이테일 2013. 11. 10.


파이썬 해킹 프로그래밍 (Python Hacking Programming)


저자 : 저스틴 지이츠

출판사 : 에이콘



3장. 윈도우 디버거 개발

[3.3] 디버그 이벤트 핸들러 구현


my_debugger.py


my_debugger_defines.py


my_test.py


 


[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