PC리버싱/안티디버깅

IsDebuggerPresent기법

Lamed_Dhhd 2020. 5. 15. 15:52
반응형

#define _WIN32_WINNT 0x0500
#include <stdio.h>
#include <windows.h>

int main()
{
         while(1)
        {
                      Sleep(1000);
                      if(IsDebuggerPresent())
                                printf("디버거 발견\n");
                     else
                               printf("정상\n");
        }

        return 0;
}

 

예제 파일

 

IsDebuggerPresent.zip
0.01MB

 

원리

mov eax, dword ptr fs:[0x30]

//FS세그먼트 레지스터는 현제 실행중인 스레드를 설명하는 Win32 TIB를 가르킨다

//0x30 에는 PEB가있다

https://ko.wikipedia.org/wiki/Win32_%EC%8A%A4%EB%A0%88%EB%93%9C_%EC%A0%95%EB%B3%B4_%EB%B8%94%EB%A1%9D

 

Win32 스레드 정보 블록 - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전. 둘러보기로 가기 검색하러 가기 TIB (Win32 Thread Information Block) (TIB)은 Win32의 자료 구조로서 현재 실행 중인 스레드에 대한 정보를 저장하고 있다. 이 구조체는 또

ko.wikipedia.org

movzx eax, byte ptr ds:[eax+0x2]

//저기서 eax+2에값에서 숫자를가져오는명령이다

https://docs.microsoft.com/en-us/windows/win32/api/winternl/ns-winternl-peb

 

PEB (winternl.h) - Win32 apps

Contains process information.

docs.microsoft.com

typedef struct _PEB {
  BYTE                          Reserved1[2];
  BYTE                          BeingDebugged;
  BYTE                          Reserved2[1];
  PVOID                         Reserved3[2];
  PPEB_LDR_DATA                 Ldr;
  PRTL_USER_PROCESS_PARAMETERS  ProcessParameters;
  PVOID                         Reserved4[3];
  PVOID                         AtlThunkSListPtr;
  PVOID                         Reserved5;
  ULONG                         Reserved6;
  PVOID                         Reserved7;
  ULONG                         Reserved8;
  ULONG                         AtlThunkSListPtr32;
  PVOID                         Reserved9[45];
  BYTE                          Reserved10[96];
  PPS_POST_PROCESS_INIT_ROUTINE PostProcessInitRoutine;
  BYTE                          Reserved11[128];
  PVOID                         Reserved12[1];
  ULONG                         SessionId;
} PEB, *PPEB;

peb의 구조는이렇다

여기서 +2 BeingDebugged다

만약 디버깅중이라면 1 아니면 0이란 값을갖고있다

추가 64비트는이렇게보인다(DEV C++로 코딩하면)

 

VS 2019기준으로 main은 저기를걸면된다

직접 f8하면서 main함수를찻았다

sleep후에 isdebuggerpresent를찻았다

내부 어셈명령은이렇다

최종적으로 eax에1이들어간다

eax마지막값이 0이되게 isdebuggerpresent함수내부코드를수정해보자

아예 작동을안한다 그러면 test밑에 je부분을수정해보자

반응형

'PC리버싱 > 안티디버깅' 카테고리의 다른 글

Visual Studio 2019로보는 ASLR  (0) 2020.05.20
1. CheckRemoteDebuggerPresent() Windows API  (0) 2020.05.20
Isdebuggerpresent원리에대해서  (0) 2020.05.16
INT 3 안티디버깅  (0) 2020.05.15
안티디버깅 기법들  (0) 2020.05.15