반응형
게임 해킹에 꼭 필요한 베이스 주소 가져오는 방법입니다.
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참고, 검색만 해도 이해될 겁니다.
그래도 설명하자면
- FindWindow 함수로 메모장 창 이름으로 창 핸들을 찾아옴
- GetWindowThreadProcessId 함수로 창 핸들로 프로세스 아이디를 찾아옴
- GetBase 함수로 진행
- CreateToolhelp32Snapshot 함수 인자로 TH32CS_SNAPMODULE | TH32CS_SNAPMODULE32를 넘겨 모듈 스냅샷을 얻어옴
- 구조체 사용을 위해 MODULEENTRY32 구조체 멤버 dwSize 초기화
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
반응형
'게임해킹 > 게임해킹 ,c++' 카테고리의 다른 글
프로세스 아이디 가져오는 방법 (0) | 2022.11.15 |
---|---|
기본적인 게임해킹 방법과 최근 게임해킹 방법 (안티치트 우회, 드라이버 해킹) (17) | 2022.11.15 |
[게임해킹] PEB구조체로 베이스 주소 얻어오기 (2) | 2022.10.27 |
[게임해킹 C++] 입출력 cout, cin, 메모리 읽기 쓰기 (0) | 2022.09.26 |