-
Автор темы
- #1
Привествую всех,занимаюсь по гайду от guidehacking(How to Hack Any Game C++ External Trainer Assault Cube 1/2). Может кто подсказать, в чем проблема почему я не могу получить данные по адресу в памяти и изменить их.Хотя все офсеты и полученные адреса из Cheat Engine работают и позволяются мне изменить данные для патронов из CheatEngine
Скрин из CheatEngine
Я так же сохранил проект, после перезапуска AssaultCube из CheatEngine работает. При запуске кода количество патронов равно нулю
Main.cpp:
#include "Headers.h"
#include "proc.h"
int main()
{
const wchar_t gameName[] = L"ac_client.exe";
// Получаем ID процесса
std::cout << "[+] Getting process by name " << std::endl;
DWORD procId = GetProcId(gameName);
std::cout << "[+] Process Id: " << procId << std::endl;
//Получаем базовый адресс модуля
uintptr_t moduleBase = GetModuleBaseAddress(procId, gameName);
//Получаем дескриптор процессора
HANDLE hProcess = 0;
hProcess = OpenProcess(PROCESS_ALL_ACCESS, NULL, procId);
if (!hProcess) {
std::cout << "[-] Error to open process" << std::endl;
return EXIT_FAILURE;
}
//Базовый адресс
uintptr_t dynamicPtrBaseAdr = moduleBase + 0x17e360;
std::cout << "[+] Dynamic Pointer Base Address = 0x" << std::hex << dynamicPtrBaseAdr << std::endl;
std::vector<unsigned int> ammoOffsets = { 0x364, 0x14, 0x0 };
uintptr_t ammoAddr = FindMAAddy(hProcess, dynamicPtrBaseAdr, ammoOffsets);
std::cout << "[+] AmmoAddr = 0x" << std::hex << ammoAddr << std::endl;
//Вывод количества патронов
int ammoValue = 0;
ReadProcessMemory(hProcess, (BYTE*)ammoAddr, &ammoValue,sizeof(ammoValue),nullptr);
std::cout << "[+] Current Ammo = " << std::dec << ammoValue << std::endl;
//Переписываем количество патронов
int newAmmo = 1337;
WriteProcessMemory(hProcess, (BYTE*)ammoAddr, &newAmmo, sizeof(newAmmo), nullptr);
std::cout << "[!] Changing ammo amount... " << std::endl;
ReadProcessMemory(hProcess, (BYTE*)ammoAddr, &ammoValue, sizeof(ammoValue), nullptr);
std::cout << "[+] Changed Ammo amount = " << std::dec << ammoValue << std::endl;
return 0;
}
proc.cpp:
#include "proc.h"
DWORD GetProcId(const wchar_t* procName)
{
DWORD procId = 0;
HANDLE hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if (hSnap != INVALID_HANDLE_VALUE)
{
PROCESSENTRY32 procEntry;
procEntry.dwSize = sizeof(PROCESSENTRY32);
if (Process32First(hSnap, &procEntry))
{
do
{
if (!_wcsicmp(procEntry.szExeFile, procName))
{
procId = procEntry.th32ProcessID;
break;
}
} while (Process32Next(hSnap, &procEntry));
}
}
CloseHandle(hSnap);
return procId;
}
uintptr_t GetModuleBaseAddress(DWORD procId, const wchar_t* modName)
{
uintptr_t moduleBaseAddress = 0;
HANDLE hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE | TH32CS_SNAPMODULE32, procId);
if (hSnap != INVALID_HANDLE_VALUE)
{
MODULEENTRY32 moduleEntry;
moduleEntry.dwSize = sizeof(MODULEENTRY32);
if (Module32First(hSnap, &moduleEntry))
{
do
{
if (!_wcsicmp(moduleEntry.szModule, modName))
{
moduleBaseAddress = (uintptr_t)moduleEntry.modBaseAddr;
break;
}
} while (Module32Next(hSnap, &moduleEntry));
}
}
CloseHandle(hSnap);
return moduleBaseAddress;
}
uintptr_t FindMAAddy(HANDLE hProc, uintptr_t ptr, std::vector<unsigned int> offsets)
{
uintptr_t addr = ptr;
for (unsigned int i = 0; i < offsets.size(); i++)
{
ReadProcessMemory(hProc, (BYTE*)addr, &addr, sizeof(addr), 0);
addr += offsets[i];
}
return addr;
}
Пожалуйста, авторизуйтесь для просмотра ссылки.
Скрин при запуске кода
Пожалуйста, авторизуйтесь для просмотра ссылки.
Я так же сохранил проект, после перезапуска AssaultCube из CheatEngine работает. При запуске кода количество патронов равно нулю
Последнее редактирование: