#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;
}
예제 파일
원리
mov eax, dword ptr fs:[0x30]
//FS세그먼트 레지스터는 현제 실행중인 스레드를 설명하는 Win32 TIB를 가르킨다
//0x30 에는 PEB가있다
movzx eax, byte ptr ds:[eax+0x2]
//저기서 eax+2에값에서 숫자를가져오는명령이다
https://docs.microsoft.com/en-us/windows/win32/api/winternl/ns-winternl-peb
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 |