강력한 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 |