SEH(Structtured Exception Handler)
Windows 운영체제에서 제공하는 예외 처리 시스템
소스코드에서 __try, __except 키워드로 쉽게 구현이 된다.(32bit에선 들어감 64bit에는 안들어가던데)
SEH가 리버싱에서 어떻게 작동하는지, 어떻게 안티디버깅에 쓰이는지.
SEH는 예외(BP, ACCESS VIOLATION, ZERO DIVISION 등)가 일어날때 처리하는 메커니즘인데,
디버깅에 있어서 예외가 발생하면 SEH로 가는게 아니라 일단 디버거에게 예외를 넘겨준 후 디버거가 DBG_CONTINUE를 인자로 ContinueDebugEvent 함수를 호출하면
예외를 처리한 것으로 처리되고 디버기에게 제어가 넘어온다.
이러면 예외는 처리되지않았기때문에 정상적인 코드 실행이 안된다.
만약 예외를 디버기에게 넘겨준다면( ContinueDebugEvent 함수를 DBG_EXCEPTION_NOT_HANDLED 를 인자로 넣어서 호출) 디버기는 예외를 프로세스에서 정의한 SEH루틴을 타서 의도한 함수로 갈 수 있다.
만약 디버기에서 CC(BP)를 함수에 넣어두면 예외가 발생하고 디버거는 BP를 보고 넘기면 BP다음 명령어들이 실행이 되지만, 디버거가 없는상황에서는 예외 처리기인 SEH로 넘어가서 다른 실행 흐름을 가져갈 수 있다. 이런 방식으로 SEH가 안티 디버깅에 사용된다.
SEH구조체는 TEB구조체 맨 앞에 존재한다.
회피 방법은 예외를 디버기에게 넘겨주면 된다. 디버거에서 예외 무시