Получение 32-битного базового адреса программы без создания 64-битной (только) программы?
Я делаю Pixel-Cheat для игры. Программа работает только для 64-битных в настоящее время, и я пытаюсь скомпилировать для 32-битных.
Я пробовал много способов найти базовый адрес процесса, но безрезультатно. Работает только 64-битная функция, и она создаст 64-битную программу.
Вот моя 64-битная рабочая функция:
DWORD64 GetModuleBase(HANDLE hProc, string &sModuleName)
{
HMODULE *hModules;
char szBuf[50];
DWORD cModules;
DWORD64 dwBase = -1;
//------
EnumProcessModulesEx(hProc, hModules, 0, &cModules, LIST_MODULES_ALL);
hModules = new HMODULE[cModules/sizeof(HMODULE)];
if(EnumProcessModulesEx(hProc, hModules,
cModules/sizeof(HMODULE), &cModules, LIST_MODULES_ALL)) {
for(int i = 0; i < cModules/sizeof(HMODULE); i++) {
if(GetModuleBaseName(hProc, hModules[i], szBuf, sizeof(szBuf))) {
if(sModuleName.compare(szBuf) == 0) {
dwBase = (DWORD64)hModules[i];
break;
}
}
}
}
delete[] hModules;
return dwBase;
}
Все 32-битные функции в Google не работают, с ошибкой:
21 59 C: \ Users \ Administrator \ Documents \ main.cpp [Ошибка] приведение из 'BYTE* {aka unsigned char*}' к 'DWORD {aka long unsigned int}' теряет точность [-fpermissive]
Как заставить этот код работать в 32-битном?
1 ответ
DWORD64 GetModuleBase(HANDLE hProc, string &sModuleName)
{
HMODULE *hModules;
char szBuf[50];
DWORD cModules;
DWORD64 dwBase = -1;
//------
EnumProcessModulesEx(hProc, NULL, 0, &cModules, LIST_MODULES_ALL);
hModules = new HMODULE[cModules/sizeof(HMODULE)];
if(EnumProcessModulesEx(hProc, hModules,
cModules/sizeof(HMODULE), &cModules, LIST_MODULES_ALL)) {
for(unsigned int i = 0; i < cModules/sizeof(HMODULE); i++) {
if(GetModuleBaseName(hProc, hModules[i], szBuf, sizeof(szBuf))) {
if(sModuleName.compare(szBuf) == 0) {
dwBase = (DWORD64)hModules[i];
break;
}
}
}
}
delete[] hModules;
return dwBase;
}
Ваша функция в том виде, в каком она стояла, прекрасно скомпилирована в 32-битном exe на моей машине с несколькими предупреждениями, которые я исправил в приведенном выше фрагменте.
Несколько вещей, которые вы можете захотеть сделать, это убедиться, что ваш компилятор настроен на работу в многобайтовом символьном режиме, а не в Unicode, если вы собираетесь передать 8-битный массив символов (szBuf) в функцию, в противном случае используйте 16-битный массив wchar. Также вы передали hModules EnumProcessModulesEx()
при первом вызове, где вы должны были получить количество модулей, при котором возникла бы ошибка, поскольку она еще не была выделена, передайте NULL при первом вызове, чтобы получить количество модулей, затем передайте hModules.
Увы, код должен скомпилироваться и работать нормально, но в следующий раз GetModuleHandle()
как упоминалось ранее, избавит вас от головной боли.