IsDebuggerPresent()
- PEB.BeingDebugged (+0x2)의 값에 따라 디버깅 여부를 알 수 있다.
디버깅 중일 때 : 0x01(TRUE)
일반 실행 중일 때 : 0x00(FALSE)
[C언어로 작성한 예제 파일]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | #include <stdio.h> #include <windows.h> int main(){ while(1){ printf("IsDebuggerPresent() = %d, ", IsDebuggerPresent()); if(IsDebuggerPresent()){ printf("Debugging\n"); } else{ printf("Not Debugging\n"); } Sleep(1000); } puts(""); return 0; } | cs |
○ 일반 실행 중일 때 IsDebuggerPresent()의 값은 0x00이다.
○ 디버깅 중일 때 IsDebuggerPresent()의 값은 0x01이다.
○ IsDebuggerPresent 어셈블리어 코드(환경 : Windows XP)
7C813123 : TEB 구조체 주소를 구한다.
7C813129 : TEB.ProcessEnvironmentBlock 멤버(+0x30)로 PEB주소를 구한다.
7C81312C : PEB.BeingDebugged 멤버(+0x02)에 접근한다.
[우회 방법] : PEB.BeingDebugged 값을 0x00(FALSE)로 변경한다.
○ 우회 전 PEB.BeingDebugged의 값 : 0x01
○ PEB.BeingDebugged의 값을 0x00으로 변경
○ 우회한 것을 확인할 수 있다.
참고 : 리버싱 핵심원리(책), Windows 구조와 원리(책), MSDN
'Reversing' 카테고리의 다른 글
Static Anti-Debugging 0x03. Process Heap (0) | 2016.07.07 |
---|---|
Static Anti-Debugging 0x02. LDR (0) | 2016.07.06 |
Anti-Debugging (0) | 2016.07.06 |
PEB 구조 (2) | 2016.07.05 |
TEB 구조 (0) | 2016.07.05 |