본문으로 바로가기

SelfDebugging + DebugActiveProcess를 이용한 안티 디버깅
SelfDebugging : 자기가 자기자신을 디버깅하는 방법
DebugActiveProcess : 디버거가 해당 프로세스에 Attach할 때 사용하는 함수
일반적으로 디버거에 의해 디버깅 중인 프로세스(디버기)는 다른 디버거로 디버깅할 수 없다는 원리를 이용하여 특정 프로세스에 디버깅 요청을 하고, 디버깅이 성공할 경우 디버깅 중이지 않다고 판단하는 방법

예제 진행 순서
1) 부모 프로세스 시작
2) 부모 프로세스는 자기 자신의 PID를 인자로 자기 자신을 실행 후 자식 프로세스가 종료될 때까지 대기
3) 자식 프로세스 시작
4) 자식 프로세스는 DebugActiveProcess 함수로 부모 프로세스에 디버깅 연결 요청
5-1) DebugActiveProcess가 실패할 경우 디버거에 의해 부모프로세스가 디버깅 중이라고 판단하고 부모프로세스를 종료 후 자기 자신도 종료(또는 부모 프로세스에 디버깅 연결을 계속 유지하여 디버거가 부모프로세스에 Attach 하지 못하게 할 수 있음)
5-2) DebugActiveProcess가 성공한 경우  DebugActiveProcessStop으로 디버깅 연결을 종료하고 자기 자신 종료 후 부모프로세스는 코드 진행

 

MSDN

dwProcessID : Attach 할 프로세스의 PID
 

소스 코드


안티 디버깅 우회 방법
1. JIT Debugger 설정 -> DebugActiveProcess에 의한 리턴 값을 수정

 

Self Debugging 활용
실행되는 동안에 특정 값을 연산하여 자기 자신을 실행할 때 인자로 넘김 -> 이 후 특정 인자 값이 어떤 값이 되었을 때 특정 루틴이 동작하게 코드를 작성하여 분석을 어렵게 만드는 방법도 가능함(아마 해킹방어대회 문제로 출제되었던걸로 기억..)


Reference
MSDN : https://msdn.microsoft.com/en-us/library/windows/desktop/ms679295(v=vs.85).aspx