ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 안티디버깅 - IsDebuggerPresent
    > Information Security/Windows 2012. 4. 11. 08:53
    안티디버깅 -  IsDebuggerPresent

     

    IsDebuggerPresent()는 해당 프로세스가 디버깅을 당하고있는지의 여부를 PEB구조체의 디버깅 상태값을 확인한다.

    (디버깅 당할때 리턴 값 = 1, 아닐경우 리턴 겂 = 0)

    이 함수로는 커널모드의 디버거는 탐지하지 못하고, 유저모드의 디버거만 탐지가 가능하다.

    kernel32.dll에서 export되는 함수이며, 보통 프로그램의 보호차원에서 쓰이지만 우회방법이 많다.

     

    1. 환경구축

     

    Visual studio로 Win32 Console응용프로그램으로 프로젝트를 생성하고,

    C++형식의 파일을 추가한다.

     

    2. IsDebuggerPresent 샘플코드 작성

     이 프로그램은 1초마다 IsDebuggerPresent()함수를 계속 호출하면서 디버깅당하고 있는지의 여부를 확인하여 메시지를 출력해주는 간단한 프로그램이다.

    #define _WIN32_WINNT 0x0500

    : 어떤 함수를 사용할 때 해당 프로그램이 실행될 최소의 OS 지정.(Windows 2000이상일 때 해당함수 인식 가능)

     

    _WIN32_WINNT 

    WINVER 

    Windows Server 2008 

    0x0600 

    Windows Vistar 

    0x0600 

    Windows Server 2003 SP1, Windows XP SP2 

    0x0502 

    Windows Server 2003, Windows XP 

    0x0501 

    Windows 2000 

    0x0500 

     

     

    3. 응용프로그램 생성 확인

     

     

    4. OllyDbg로 디버깅

     

    OllyDbg로 no1.exe파일을 열어준다.

     

     Search For > All intermodular calls 

     "IsDebuggerPresent"에 BP를 걸어준다

     실행시켜주면 IsDebuggerPresent에서 멈추고, 이 때 디버거를 탐지했다는 값으로 1을 리턴한다.

    BP를 해제하고 RUN해주면 '디버깅당했어용' 메시지를 계속 출력한다.

     

     

     

     

    IsDebuggerPresent의 우회방법

     

    간단히,

    OllyDbg의 Plugin 중에는 Hide Debugger

    HideOD 에서는 IsDebuggerPresent()함수에 대한 옵션을 활성화

    하면 디버깅을 당하지 않았다는 '정상'메시지를 출력한다.

     

    1. 플러그인으로 우회

    -> Hide Debugger의 옵션 설정 화면

    Hide Debugger v1.24

     

     

    http://www.woodmann.com/collaborative/tools/index.php/Hide_Debugger

     

     

    2. 다른 원리의 우회

     

    Search for > All intermodular calls > Found intermodular calls 에서 IsDebuggerPresent()의 위치 확인, 더블클릭!

    이 상태의 흐름을 디어셈블된 상태에서 해석을 하면

    IsDebuggerPresent()함수가 실행된 후 리턴값을 EAX에 저장

    ESI와 ESP가 같은지 확인 후 ZF와 PF에 1을 세팅

    ESI와 ESP가 다를 경우 에러메시지를 출력해주는 루틴으로 가고, 프로그램 종료

    TEST명령으로 값을 계산하고 EAX와 EAX값이 같다면 ZF와 PF에 0을 세팅. 디버깅중이지 않은 정상적인 경우에는 EAX값이 0이고 디버깅을 당하고 있다면 EAX값이 1.

    ZF가 1이면 분기해서 '정상'메시지 를 출력하고 0이면 '디버깅당했당'을 출력한다.

     

     

    참고, 출처 : 리버스엔지니어링 역분석의 구조와 원리

     

    728x90
    반응형
Designed by Tistory.