Подскажите что я делаю не так

lalakas2

Известный
Автор темы
10
0
C++:
#include <Windows.h>
#include <TlHelp32.h>
#include <string>
#include <conio.h>
#include <iostream>

using namespace std;

DWORD FindProcessId(string processName);
DWORD GetBaseAddress(DWORD pid);

int main() {
    HANDLE _hProc = NULL;
    DWORD _pID = NULL;
    _pID = FindProcessId("ac_client.exe");
    cout << _pID << endl;
    _hProc = OpenProcess(PROCESS_ALL_ACCESS, NULL, _pID);
    DWORD baseAddress = GetBaseAddress(_pID);
    cout << hex << baseAddress << endl;
    DWORD HEALTH = baseAddress + 0x17E0A8 + 0xEC;
    cout << HEALTH << endl;
    int read;
    ReadProcessMemory(_hProc, (PBYTE*)HEALTH, &read, sizeof(int), 0);
    std::cout << read;
    CloseHandle(_hProc);
    return 0;
}

DWORD FindProcessId(std::string processName)
{
    PROCESSENTRY32 peInfo;
    peInfo.dwSize = sizeof(peInfo);
    HANDLE _hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, NULL);
    if (_hSnap== INVALID_HANDLE_VALUE)
        return 0;
    Process32First(_hSnap, &peInfo);
    if (!processName.compare(peInfo.szExeFile))
    {
        CloseHandle(_hSnap);
        return peInfo.th32ProcessID;
    }
    while (Process32Next(_hSnap, &peInfo))
    {
        if (!processName.compare(peInfo.szExeFile))
        {
            CloseHandle(_hSnap);
            return peInfo.th32ProcessID;
        }
    }
    CloseHandle(_hSnap);
    return 0;
}

DWORD GetBaseAddress(DWORD pid) {
    HANDLE hModule = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, pid);
    MODULEENTRY32 ModuleEntry;
    ModuleEntry.dwSize = sizeof(ModuleEntry);
    do {
        if (!strcmp(ModuleEntry.szModule, "ac_client.exe"))
        {
            CloseHandle(hModule);
            return (DWORD)ModuleEntry.hModule;
        }
    } while (Module32Next(hModule, &ModuleEntry));
    return 0;
}
Есть такой код, оффсеты получил через Cheat Engine.

1720299286480.png

По логике базовый адрес процесса = 71C460, но функция в моем коде постоянно пишет что 0x400000. Что не так?
 
Решение
ac_client.exe + 0x17E0A8 - это указатель на класс. А для класса смещение 0xEC - это оффсет до хп. В твоём коде ты буквально всё в 1 адрес запихнул.
Сначала читай baseaddress + 0x17E0A8. Потом читай результат предыдущего чтения + оффсет до хп.

fuflexxxx

Участник
27
11
ac_client.exe + 0x17E0A8 - это указатель на класс. А для класса смещение 0xEC - это оффсет до хп. В твоём коде ты буквально всё в 1 адрес запихнул.
Сначала читай baseaddress + 0x17E0A8. Потом читай результат предыдущего чтения + оффсет до хп.
 
  • Нравится
Реакции: lalakas2

lalakas2

Известный
Автор темы
10
0
ac_client.exe + 0x17E0A8 - это указатель на класс. А для класса смещение 0xEC - это оффсет до хп. В твоём коде ты буквально всё в 1 адрес запихнул.
Сначала читай baseaddress + 0x17E0A8. Потом читай результат предыдущего чтения + оффсет до хп.
спасибо, я и правда затупил довольно сильно