본문으로 바로가기

INT 2D
예외 기반 안티 디버깅은 예외를 발생 시키고, 예외 처리기(SEH, VEH, ..)에 중요한 루틴을 숨기거나 안티 디버깅 유무를 판단하여 코드의 흐름(EIP)을 변경시키는 방법
일반적인 실행 인 경우 예외가 발생되면 예외 처리기에 의해 실행 흐름이 정상적으로 진행되지만, 디버거에 의한 실행일 경우 예외를 디버거가 받게 되고, INT3 예외인 경우 디버거의 처리에 의해 예외 처리기가 실행되지 않은 상태에서 코드가 진행됨 
SEH를 이용할 경우 예외 기반 안티 디버깅을 수행할 수 있으며, 직접 핸들러를 등록하거나 __try, __except를 이용하여 구현
INT 2D는 Kernel Mode에서 동작하는 브레이크 포인트


디버깅 상황에서 INT 2D 코드 실행
1) 디버거는 INT 2D 코드를 무시하고 코드를 진행
2) INT 2D 코드 이 후의 1 Byte가 무시되기 때문에 다른 형태의 코드로 디스어셈블링 되게 됨(원래 코드의 1 Byte 다음 지점부터 디스어셈블링 되기 때문에)
3) INT 2D 코드를 Step Into나 Step Over로 실행 해도 Run과 같은 형태로 실행됨

 

예제 소스


안티 디버깅 우회 방법
1. INT 2D 코드에 Break Point 설치 후 진행 -> TF(Trap Flag) 1로 설정 후 코드 실행 -> 다음 정상적인 코드 한 번 더 실행하게 될 경우 Trap Flag에 의해 예외 발생 -> 이 후 예외 처리기 실행 또는 분석
* INT 2D 실행 후 JMP 같은 분기 코드가 있는 경우 NOP 같은 코드로 수정하여 코드 실행