게임해킹/게임해킹 ,c++

[게임해킹] PEB구조체로 베이스 주소 얻어오기

cp_good: 2022. 10. 27. 21:20
반응형

 

많이 들어본 PEB구조체를 게임 해킹 어디에 쓰는지 알아봅시다.

 

PEB(Process Environment Block)는 유저 레벨에서 프로세스에 대한 정보를 저장하고 있는 구조체입니다.

PEB를 게임 해킹에서 활용은 주로 베이스 주소를 얻어올 때 사용합니다.


소스코드

 

아래 코드는 메모장의 베이스 주소를 얻어오는 코드인데,

"제목 없음 - Windows 메모장"을 수정하면 원하는 게임창을 가져올 수 있습니다.

    // 프로세스의 기본 정보를 받을 때 사용하는 구조체
    PROCESS_BASIC_INFORMATION pbi = {}; 
    DWORD returnLength = 0;
    DWORD pid;
    
    // 윈도우 창 핸들을 찾아서
    HWND hwnd = FindWindow(0, "제목 없음 - Windows 메모장");
    // 창 핸들로 프로세스 아이디를 가져온 뒤
    GetWindowThreadProcessId(hwnd, &pid);
    // 프로세스 핸들을 얻어
    HANDLE handle = OpenProcess(PROCESS_ALL_ACCESS, 0, pid);
    
    // 프로세스의 기본정보를 받아옵니다.
    NtQueryInformationProcess(handle, ProcessBasicInformation, &pbi, sizeof(PROCESS_BASIC_INFORMATION), &returnLength);
    // PEB구조체 +0x10에는 베이스 주소(ImageBaseAddress)가 있습니다.
    DWORD_PTR pebOffset = (DWORD_PTR)pbi.PebBaseAddress + 0x10;
    
    // 베이스 주소 포인터 읽어오기
    LPVOID imageBase = 0;
    ReadProcessMemory(handle, (LPCVOID)pebOffset, &imageBase, sizeof(LPVOID), NULL);
    cout << imageBase << endl;

추가 설명

NtQueryInformationProcess 함수 인자 "ProcessInformationClass"를

"ProcessBasicInformation"로 요청해 PEB주소를 얻어 올 수 있습니다.

NTSTATUS NtQueryInformationProcess(
  [in]            HANDLE           ProcessHandle,
  [in]            PROCESSINFOCLASS ProcessInformationClass,
  [out]           PVOID            ProcessInformation,
  [in]            ULONG            ProcessInformationLength,
  [out, optional] PULONG           ReturnLength
);
  • _In_HANDLE ProcessHandle
    정보를 검색할 프로세스에 대한 핸들입니다.
  • _In_ PROCESSINFOCLASS ProcessInformationClass
    검색할 프로세스 정보의 유형입니다. (소스코드, MSDN 참고)
  • _Out_ PVOID ProcessInformation
    요청한 정보에 대한 결과를 인자로 지정한 버퍼에 저장합니다.
  • _In_ ULONG ProcessInformationLength
    버퍼의 크기를 나타냅니다. (요청한 정보 구조체의 크기)
  • _Out_opt_PULONG ReturnLength
    선택 사항으로, 함수가 요청된 정보의 크기를 반환

 

PROCESS_BASIC_INFORMATION구조체입니다.

typedef struct _PROCESS_BASIC_INFORMATION {
    NTSTATUS ExitStatus;
    PPEB PebBaseAddress;
    ULONG_PTR AffinityMask;
    KPRIORITY BasePriority;
    ULONG_PTR UniqueProcessId;
    ULONG_PTR InheritedFromUniqueProcessId;
} PROCESS_BASIC_INFORMATION;

코드를 보면(pbi.PebBaseAddress + 0x10)

PROCESS_BASIC_INFORMATION구조체의 PebBaseAddress 멤버로 PEB주소를 가져옵니다.

그다음 PEB에 0x10을 더해 "ImageBaseAddress"의 포인터를 가져오고요.

WinDbg로 확인해보면 "ImageBaseAddress"멤버가 0x10인걸 확인해 볼 수 있습니다.

 

 

코드를 실행해보면 메모장 베이스 주소를 잘 얻어오는 걸 볼 수 있습니다.

 

프로세스 해커에서 베이스 주소 확인

 

만약 안티 치트로 핸들이 보호되어 있다면 유저 모드에선 베이스 주소를 얻어오지 못하겠죠.

그럴땐 커널로 얻어오면 됩니다.

반응형