• Объявления

    • Garik66

      Пользователям форума   05.11.2017

      Прошу обратить внимание на эту тему (чтобы увидеть ссылку, войдите в объявление - нажмите на заголовок):   
mraklbrw

Поиск базового адреса программы

5 сообщений в этой теме

Есть программа TrainMe.
В ней есть переменная: золото.
Через Cheat Engine я нашёл указатель первого уровня на неё:
"THREADSTACK0"-00000CC8
50

Через Cheat Engine я определил базовый адрес программы: 0046FF18На C++ я написал такой код:

Spoiler

#include <iostream>
#include <cstdlib>
#include <string>
#include <cstring>
#include<Windows.h>
#include <Shellapi.h>
#include <process.h>
#include <tlhelp32.h>
#include <psapi.h>
#pragma comment( lib, "psapi" )

using namespace std;

DWORD Base_Adress = 0x0046FF18; // Базовый адрес программы(игры)
DWORD pid;
DWORD value_1 = 0x00000CC8; // Первое смещение
DWORD get_value;
DWORD get_value_2;
DWORD get_value_3;

int main()
{

    HWND hwnd = FindWindowA(0, ("D:\\TrainMe.exe"));

    GetWindowThreadProcessId(hwnd, &pid);

    if (hwnd)
        cout << "process id: " << pid << endl;
    else
        cout << "Window isn't found." << endl;

    HANDLE phandle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid);

    ReadProcessMemory(phandle, (LPVOID)(Base_Adress - value_1), &get_value, sizeof(get_value), 0); // Получаем 1-ое значение

    cout << get_value << endl; // 1431787091

    DWORD adres_2 = get_value + 0x50;

    //cout << "adr2 = " << adres_2 << endl;

    ReadProcessMemory(phandle, (LPVOID)adres_2, &get_value_2, sizeof(get_value_2), 0); // Получаем 2-ое значение

    cout << get_value_2 << endl;


    cin.get();
    cin.get();

    return 0;
}

 

Он работает.
Но, есть одно Но:
базовый адрес программы, определённый через Cheat Engine, является динамическим.
Как найти статический базовый адрес / указатель на него?

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Активно занимался подобным на C# там использовалась стандартная библиотека system diagnostics

Пример был достаточно простым, скину ссылку на c#-вский пример. Думаю с C++ примерно так же)

Работает как часы, надо еще сказать одну оговорочку, которая была в моем проекте, 32х и 64х разрядные проги не имеют друг к другу доступа(да, с формулировкой я мог напутать) Но в итоге при компиляции было необходимо указать компилить под ту или иную разрядность)

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

x64 трейнер сможет получить доступ и к х86 игре, и к х64 игре. Наоборот - нет.

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
16 час назад, mraklbrw сказал:

Как найти статический базовый адрес / указатель на него?

никак. юзай K32EnumProcessModules, получи базу 1 модуля (ехе) +адрес

или NtQueryInformationProcess+ReadProcessMemory (PROCESS_BASIC_INFORMATION.PebBaseAddress)

 

Изменено пользователем gmz
0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте аккаунт или войдите для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!


Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.


Войти сейчас