API Hooking - Debug
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. 디버기한테 제어 권한 줌