Project./Security

API Hooking - Debug

D2v 2017. 2. 3. 23:49

API Hooking - Debug


Debugger - 디버깅 프로그램

Debuggee - 디버깅 당하는 프로그램


Debugger 동작 원리


프로세스가 디버거에 등록되면 OS는 해당 프로세스에서 디버그 이벤트가 발생할 때 실행을 정지 후 디버거에게 전달합니다.

디버거는 해당 이벤트에 대해 처리 후 프로세스를 다시 재개합니다.


일반적인 예외도 디버그 이벤트에 해당되며, 프로세스가 디버깅 중이 아니라면 디버그 이벤트는 프로세스 자체에서 예외처리가 되거나 OS의 예외 처리 루틴에서 처리됩니다.


Debug Event


◆ EXCEPTION_DEBUG_EVENT : 예외 이벤트 발생


◇ EXCEPTION_ACCESS_VIOLATION : 존재하지 않거나 접근권한이 없는 메모리 영역에 접근을 시도 할 때 발생

◇ EXCEPTION_BREAKPOINT : INT3(0xCC) 브레이크 포인트 발생

◇ EXCEPTION_ILLEGAL_INSTRUCTION : CPU가 해석할 수 없는 명령어를 만날 때 발생

◇ EXCEPTION_INT_DIVIDE_BY_ZERO : 정수 나눗셈 연산에서 분모가 0인 경우 발생

◇ EXCEPTION_SINGLE_STEP : eflags Register에서 TF부분이 세트되면 발생  - SEH 기법과 결합하여 안티디버깅 기법에 사용



◆ 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 : OutputDebugString() 함수 호출시 발생



이 중에 디버그 방식 후킹에 사용되는 이벤트는


EXCEPTION_DEBUG_EVENT -> EXCEPTION_BREAKPOINT 입니다.


BreakPoint는 어셈블리어로 INT3(0xCC) 입니다.

디버깅 중 INT3 명령어를 만나면 실행이 중지가 되어 디버거에게 EXCEPTION_BREAKPOINT 예외 이벤트가 전송되어

디버거에서 작업을 할 수 있습니다.


디버깅을 계속 진행하고 싶을 때 바꿨던 값을 원래 값으로 복원 후 디버깅을 계속 진행하면 됩니다.


디버그 기법 API Hooking 작업 순서


1. 원하는 프로세스 Attach 하여 디버기로 만듦

2. Hook: API 시작 주소의 첫 바이트를 0xCC로 변경

3. 해당 API가 호출 될 시 디버거에게 제어 넘어옴

4. 원하는 작업 수행(파라미터, 리턴 값 조작 등)

5. UnHook: 0xCC를 원래 값으로 복원

6. 해당 API 실행

7. Hook: 다시 0xCC로 변경(지속적인 후킹)

8. 디버기한테 제어 권한 줌