Я много исследовал это, и нам нужны только два метода, два из которых могут найти базовый адрес любого процесса, который вам нужен.
DWORD GetProcessId(const wchar_t* processName); //gets the process Id
uintptr_t GetModuleBaseAddress(DWORD processId, const wchar_t* moduleName); //gets the module base address
Это основные заголовки, которые нам нужны.
Первый заголовок найдет идентификатор процесса, сделав снимок всех запущенных процессов и сравнив каждое имя с именем, которое вы передаете.
DWORD GetProcessId(const wchar_t* processName) {
DWORD processId = 0;
HANDLE hSnap = (CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0));
if (hSnap != INVALID_HANDLE_VALUE) {
PROCESSENTRY32 processEntry;
processEntry.dwSize = sizeof(processEntry);
if (Process32First(hSnap, &processEntry)) {
do {
if (!_wcsicmp(processEntry.szExeFile, processName)) {
processId = processEntry.th32ProcessID;
break;
}
} while (Process32Next(hSnap, &processEntry));
}
}
else {
cout << "CreateToolhelp32Snapshot failed. GetLastError = " << dec << GetLastError() << endl;
system("pause");
return EXIT_FAILURE;
}
CloseHandle(hSnap);
return processId;
}
Этот метод делает снимок всех запущенных модулей в указанном процессе и сравнивает модуль (в моем случае мне нужен базовый адрес всего процесса, поэтому он такой же, как processName
), который вы указываете для каждого модуля в текущем процессе.
uintptr_t GetModuleBaseAddress(DWORD processId, const wchar_t* moduleName) {
uintptr_t moduleBaseAddr = 0;
HANDLE hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE | TH32CS_SNAPMODULE32, processId);
if (hSnap != INVALID_HANDLE_VALUE) {
MODULEENTRY32 moduleEntry;
moduleEntry.dwSize = sizeof(moduleEntry);
if (Module32Next(hSnap, &moduleEntry)) {
do {
if (!_wcsicmp(moduleEntry.szModule, moduleName)) {
moduleBaseAddr = (uintptr_t)moduleEntry.modBaseAddr;
break;
}
} while (Module32Next(hSnap, &moduleEntry));
}
}
CloseHandle(hSnap);
return moduleBaseAddr;
}
Способ Я понимаю, что каждая программа имеет свой собственный базовый адрес (который мы нашли), а также установленный указатель, который приведет вас к базовому адресу указателя Dynami c (указатель, который вы добавляете к базовому адресу, можно найти с помощью специального программное обеспечение или онлайн).
Всем спасибо!