반응형
많이 들어본 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인걸 확인해 볼 수 있습니다.
코드를 실행해보면 메모장 베이스 주소를 잘 얻어오는 걸 볼 수 있습니다.
만약 안티 치트로 핸들이 보호되어 있다면 유저 모드에선 베이스 주소를 얻어오지 못하겠죠.
그럴땐 커널로 얻어오면 됩니다.
반응형
'게임해킹 > 게임해킹 ,c++' 카테고리의 다른 글
프로세스 아이디 가져오는 방법 (0) | 2022.11.15 |
---|---|
기본적인 게임해킹 방법과 최근 게임해킹 방법 (안티치트 우회, 드라이버 해킹) (17) | 2022.11.15 |
[게임해킹] 모듈 베이스 얻어오기 CreateToolhelp32Snapshot (2) | 2022.11.01 |
[게임해킹 C++] 입출력 cout, cin, 메모리 읽기 쓰기 (0) | 2022.09.26 |