Начинающий
-
Автор темы
- #1
Изучаю взаимодействие с оперативной памятью посредство cs:go, однако столкнулся с проблемой.
Когда читаю верный адрес (client.dll + dwLocalPlayer + iHealth) возвращается значение или не соответствующее здоровью или же 0.
Ниже приведу функции и т.п.
Пытался проделать такие операции с другой программой через известные мне адреса, но проблема никуда не девается даже так... (неправильное значение или 0, а также возможна ошибка с неполным чтением ReadProcessMemory (code: 299)
Все адреса на 100% правильные, дескриптор процесса тоже, но все равно ничего не получается.
P.S. Компилировал и в x64 и x96. Visual Studio 2022
Когда читаю верный адрес (client.dll + dwLocalPlayer + iHealth) возвращается значение или не соответствующее здоровью или же 0.
Ниже приведу функции и т.п.
Получение адреса модуля:
DWORD getModuleBaseAddress(DWORD pid, HANDLE process, char name[]) {
cout << "Required module: " << name << endl;
HANDLE snap = INVALID_HANDLE_VALUE;
MODULEENTRY32 mEntry;
// получение списка модулей процесса PID
snap = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE | TH32CS_SNAPMODULE32, pid);
if (snap == INVALID_HANDLE_VALUE) {
cout << "[ERROR] INVALID PID" << endl;
return 0;
}
mEntry.dwSize = sizeof(MODULEENTRY32);
if (!Module32First(snap, &mEntry)) {
cout << "[ERROR] Module32First" << endl;
CloseHandle(snap);
return 0;
}
do
{
if (strcmp(mEntry.szModule, name) == 0) {
CloseHandle(snap);
return (DWORD)mEntry.modBaseAddr;
}
} while (Module32Next(snap, &mEntry));
Функция main:
int main() {
DWORD pid;
LPCSTR wndName = "Counter-Strike: Global Offensive - Direct3D 9"; // cin >>
getProcessID(wndName, &pid);
cout << "PID of " << wndName << " is " << dec << pid << hex << endl;
HANDLE process = 0;
process = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid);
if (process == 0) {
cout << "Error: " << GetLastError() << endl;
return 0;
}
DWORD clientBase = getModuleBaseAddress(pid, process, (char*)"client.dll");
if (clientBase == 0) {
cout << "Error: " << dec << GetLastError() << hex << endl;
return 0;
}
cout << "\nModuleBaseAddress: 0x" << clientBase << endl;
DWORD localPlayer = (DWORD)dwLocalPlayer + clientBase;
cout << "localPlayer: 0x" << localPlayer << endl;
DWORD health = localPlayer + (DWORD)m_iHealth;
cout << "health: 0x" << health << endl;
int buffer;
if (!ReadProcessMemory(process, (LPCVOID)health, &buffer, sizeof(buffer), NULL)) {
cout << "[Error_ReadProcessMemory] Error: " << dec << GetLastError() << hex << endl;
return 0;
}
cout << "value: " << dec << buffer << endl;
getchar();
}
Все адреса на 100% правильные, дескриптор процесса тоже, но все равно ничего не получается.
P.S. Компилировал и в x64 и x96. Visual Studio 2022
Последнее редактирование: