ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 안티디버깅 기법 - CheckRemoteDebuggerPresent()
    > Information Security/Windows 2012. 5. 20. 00:26

    안티디버깅 기법 - CheckRemoteDebuggerPresent()

     

     

    CheckRemoteDebuggerPresent()는 IsDebuggerPresent()와 비슷하고,

    WindowsNT버전에서만 가능하다. (XP이상)

    따라서, 이 함수 내부에서는

    NtQueryInformationProcess()라는 API함수를 호출하고,

    EPROCESS라는 구조체 커널구조체에서 Debugport값을 검사한다.

     

    또한, 디버거가 선택된 프로세스내에서 보여지는지에 대한 여부는

    TRUE와 FALSE값으로 나타내어진다.

     

     

     

    먼저, CheckRemoteDebuggerPresent()함수는

    한글로 표현하면

    '원격으로 디버거가 보여지는지를 체크' 한다는 말이다.

     

    즉, 자신 이외의 다른 프로세서가 디버깅을 당하는 지를 알 수 있는 API함수라고 할 수 있겠다.

     

     

    이 함수의 원형은

    BOOL CheckRemoteDebuggerPresent(
    HANDLE hProcess,
    PBOOL pbDebuggerPresent
    );

    로 되어있으며 한가지 예를 들어보겠다.

     

     

     

     다음은 OpenRCE.com에 업로드되어있는 파일이다.

     

    CheckRemoteDebuggerPresent.exe

     

    CheckRemoteDebuggerPresent.obj

     

    이 파일의 코드는 다음과 같다.

    #define _WIN32_WINNT

    #include <stdio.h>
    #include <windows.h>

    int main()
    {
    BOOL bDebugged = FALSE;
    while(1)
    {
    Sleep(1000);
    CheckRemoteDebuggerPresent( GetCurrentProcess(), &bDebugged );
    if(bDebugged)
    printf("It is Debugged!\n");
    else
    printf("Debugger not found!\n");
    }
    return 0 ;
    }

     

    이 파일을 실행해보면 디버거를 찾을 수 없다고 나타나는데,

    만일 디버깅 된 상태라고 했을 때

     

    이를 우회하는 방법은

    인자 bDebugged의 값을 0으로 설정해 주거나,

    JMP문을 이용하여 무조건 정상쪽으로 분기하도록 수정해주는 방법이있다.

     

    우회하는 방법의 어셈블리어 코드는 다음과같다.

     .386
    .model flat, stdcall
    option casemap :none ; case sensitive

    include \masm32\include\windows.inc
    include \masm32\include\user32.inc
    include \masm32\include\kernel32.inc

    includelib \masm32\lib\user32.lib
    includelib \masm32\lib\kernel32.lib

    .data
    DbgNotFoundTitle db "Debugger status:",0h
    DbgFoundTitle db "Debugger status:",0h
    DbgNotFoundText db "Debugger not found!",0h
    DbgFoundText db "Debugger found!",0h
    krnl db "kernel32.dll",0h
    chkrdbg db "CheckRemoteDebuggerPresent",0h
    .data?
    IsItPresent dd ?
    .code

    start:

    ; MASM32 antiRing3Debugger 의 예.
    ; coded by ap0x (출처)
    ; Reversing Labs: http://ap0x.headcoders.net

    ; GetProcAddress를 통해 함수 호출

    PUSH offset krnl ;kernel32.dll
    CALL LoadLibrary

    PUSH offset chkrdbg ;CheckRemoteDebuggerPresent
    PUSH EAX
    CALL GetProcAddress

    ; IsItPresent는 결과값을 저장할 것.
    PUSH offset IsItPresent
    PUSH -1
    CALL EAX

    MOV EAX,DWORD PTR[IsItPresent]
    TEST EAX,EAX
    JNE @DebuggerDetected

    PUSH 40h
    PUSH offset DbgNotFoundTitle
    PUSH offset DbgNotFoundText
    PUSH 0
    CALL MessageBox

    JMP @exit
    @DebuggerDetected:

    PUSH 30h
    PUSH offset DbgFoundTitle
    PUSH offset DbgFoundText
    PUSH 0
    CALL MessageBox

    @exit:

    PUSH 0
    CALL ExitProcess

    end start

     

    -출처 : OpenRCE : http://www.openrce.org

    W.H : http://blog.naver.com/aaaa875,

    hacker dakuo : http://dakuo.tistory.com

     

     

     

     

     

    728x90
    반응형

    '> Information Security > Windows' 카테고리의 다른 글

    악성코드 탐지 - 툴 사용법  (0) 2014.05.30
    Stealth (프로세스 은폐기법)  (2) 2012.06.11
    API Code Patch  (0) 2012.06.11
    안티디버깅 - IsDebuggerPresent  (3) 2012.04.11
    안티디버깅(Anti Debugging)  (0) 2012.04.11
Designed by Tistory.