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

[게임해킹] 모듈 베이스 얻어오기 CreateToolhelp32Snapshot

cp_good: 2022. 11. 1. 02:04
반응형

 

게임 해킹에 꼭 필요한 베이스 주소 가져오는 방법입니다.

 

CreateToolhelp32Snapshot 함수를 사용해 가져오는 방법입니다.

HANDLE CreateToolhelp32Snapshot(
  [in] DWORD dwFlags,
  [in] DWORD th32ProcessID
);
  • _In_DWORD dwFlags
    스냅샷에 포함할 정보, 이 매개 변수는 다음 값 중 하나 이상일 수 있습니다.(소스코드와, MSDN 참고)
  • _In_DWORD th32ProcessID
    스냅샷에 포함할 프로세스의 프로세스 식별자 (프로세스 아이디 넣으면 됩니다.)

 

예제 코드
#include <Windows.h>
#include <tlhelp32.h> // 함수 사용을 위한 헤더
#include <iostream>

uintptr_t GetBase(int pid, LPCSTR procname) {
	uintptr_t modBaseAddr;
    
    // 프로세스의 모든 모듈을 가져오기 위한 인자전달
	HANDLE hPorcessShap = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE | TH32CS_SNAPMODULE32, pid);
	
    // 스냅샷을 가져오지못하면 실패출력
    if (hPorcessShap == INVALID_HANDLE_VALUE) {
		printf("CreateToolhelp32Snapshot 실패\n");
		return 0;
	}
    
    // 프로세스 모듈 목록을 설명하는 구조체
	MODULEENTRY32 pe32;
    
    // 구조체사용을 위해 구조체크기만큼 초기화시켜주는 겁니다.
	pe32.dwSize = sizeof(MODULEENTRY32);
    
    // 프로세스와 연결된 첫 번째 모듈에 대한 정보를 검색합니다.
	if (Module32First(hPorcessShap, &pe32)) {
		do {
        // 스냅샷 모듈이름과 인자로 넘긴 모듈이름 비교
			if (strcmp(pe32.szModule, procname) == 0) {
            // 같으면 모듈베이스 주소 저장후 함수종료
				modBaseAddr = (uintptr_t)pe32.modBaseAddr;
				break;
			}
		} while (Module32Next(hPorcessShap, &pe32));
	}
	CloseHandle(hPorcessShap);
	return modBaseAddr;
}

int main()
{
	hwnd = FindWindow(0, "제목 없음 - Windows 메모장");
	GetWindowThreadProcessId(hwnd, &pid);
	uintptr_t imagebase = GetBase(pid, "notepad.exe");
    
	return 0;
}

 

코드가 매우 간단하기 때문에 예제 코드와 MSDN참고, 검색만 해도 이해될 겁니다.

그래도 설명하자면

typedef struct tagMODULEENTRY32 {
  DWORD   dwSize;
  DWORD   th32ModuleID;
  DWORD   th32ProcessID;
  DWORD   GlblcntUsage;
  DWORD   ProccntUsage;
  BYTE    *modBaseAddr;
  DWORD   modBaseSize;
  HMODULE hModule;
  char    szModule[MAX_MODULE_NAME32 + 1];
  char    szExePath[MAX_PATH];
} MODULEENTRY32;
  • Module32First 함수로 모듈에 대한 정보를 검색, MODULEENTRY32 구조체에 저장
  • MODULEENTRY32 멤버 szModule로 내가 찾는 프로세스 이름이 맞는지 확인
  • 맞으면 모듈 베이스 저장 아니면
  • Module32 Next 함수로 다음 프로세스 정보 저장 검색 프로세스 찾을 때까지 반복

실행시켜보면 베이스 주소를 잘 얻어오는 걸 확인할 수 있습니다.

 

프로세스 해커롤 확인한 메모장 베이스 주소

얻어오지 못하면 보호되고 있는 프로세스이니 커널에서 얻어오시면 됩니다.


메일 : qmffhrm@protonmail.com

반응형