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

+ Recent posts