본문으로 바로가기

[예외 기반] Single Step - Trap Flag

category Reversing/Anti Debugging 2015. 3. 31. 19:41

Trap Flag를 이용한 안티 디버깅
예외 기반 안티 디버깅은 예외를 발생 시키고, 예외 처리기(SEH, VEH, ..)에 중요한 루틴을 숨기거나 안티 디버깅 유무를 판단하여 코드의 흐름(EIP)을 변경시키는 방법
일반적인 실행 인 경우 예외가 발생되면 예외 처리기에 의해 실행 흐름이 정상적으로 진행되지만, 디버거에 의한 실행일 경우 예외를 디버거가 받게 되고, INT3 예외인 경우 디버거의 처리에 의해 예외 처리기가 실행되지 않은 상태에서 코드가 진행됨
SEH를 이용할 경우 예외 기반 안티 디버깅을 수행할 수 있으며, 직접 핸들러를 등록하거나 __try, __except를 이용하여 구현
Trap Flag(TF) 값을 1로 설정할 경우 CPU는 Single Step 모드로 변경되며, CPU가 Single Step 모드일 경우 명령어 하나를 실행 시킨 이 후에 SINGLE_STEP 예외를 발생시키고, 이 후 Trap Flag(TF) 값을 0으로 초기화 함


TRAP 설정되었을 경우
1) 명령어 하나를 실행 후 SINGLE STEP 예외가 발생
2) 예외가 발생된 후 TF 값이 0으로 초기화 됨
3) JMP 명령이 실행되지 않음
4) CALL 명령 시 Step Over로 진행 됨(Step Into 사용 시에도)
5) ...?

 

EFLAGS REGISTER

 

소스 코드


안티 디버깅 우회 방법
1. OllyDbg인 경우 : Options -> Debugging options -> Exceptions -> Single-step break 체크(Single Step에 대한 예외 무시 - 소프트웨어 자체적으로 처리)
2. 예외 처리기에 주요 루틴이 있어 분석을 해야될 경우는 Shift + F8로 예외 처리 루틴에 따라 들어가 예외 처리기로 진입하여 분석(분석 방법은 SEH 분석 방법에 대한 글에서 참고)