본문 바로가기

reversing

예외 처리를 이용한 Anti-Debugging

강력한 Anti-Debugging 기법은 아니지만 예외 처리를 이용한 Anti-Debuggging 기법에 사용할 수 있다.

바로 코드를 살펴보자.

 

#include <stdio.h>

#include <windows.h>

 

void AntiDebugging() {

DWORD dwDebugger = 1;

 

__try {

__asm {

__emit 0xCC      // INT 3

}

}

__except(EXCEPTION_EXECUTE_HANDLER) {

dwDebugger = 0;

printf("No Debugging\n");

}

 

if(dwDebugger) {

printf("Debuggingt\n");

ExitProcess(0);

}

}

 

int main() {

AntiDebugging();

return 0;

}

 

위의 소스코드를 실행하면 정상적이라면 "No Debugging" 문자열을 출력한다.

그 이유는 __try 안에 반드시 예외가 일어나도록 0xCC 를 넣었기 때문이다. 따라서 __except 안에 들어와 dwDebugger = 0 의 값을 갖도록 예외 처리를 한다.

 

디버거는 일반적으로 INT 3 or INT 1 명령어를 지날 때 예외 처리를 하지 않는다. 즉, __except  안의 코드를 실행하지 않기에 여전히 dwDebugger 변수의 값은 1 이며, 이런 부분을 체크하여 dwDebugger 의 값이 0 이 아니라면 해당 프로세스가 디버깅 중이라고 판단할 수 있다.

'reversing' 카테고리의 다른 글

gdb child process debugging  (1) 2016.11.04
IDA remote gdb debugging with gdbserver  (0) 2016.04.10
windbg kernel debugging  (0) 2016.01.31
BSWAP instruction  (0) 2016.01.19
assembly jump instruction  (0) 2016.01.19