Перейти к содержанию

Использование найденного указателя при написании чита


Рекомендуемые сообщения

Всеем доброго дня.

Только что разобрался с темой поиска указателей.

Пробовал на игре Master of Defense посредством Cheat Engin-а.

Нашёл указатель и оффсеты:

"Main.exe"+0012FDB4

84
2B0
224
4BC
0

Написал чит-трейнер на Cheat Engine. Всё работает. Теперь хотелось бы написать чит-трейнер на C++.

Проблема вот в чём: не пойму, что делать с указателем.

К какой ячейке памяти обращаться?

Я так полагаю, что должен быть конкретный hex-адрес.

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

Конечно, нет. Тебе надо найти базовый адрес, который в СЕ представлен именем файла ( "Main.exe" ). К этому базовому адресу нужно прибавить  первое смещение ( 0012FDB4 ). Из полученного адреса считать значение. К этому значению прибавить второе смещение ( 84 ). Получившееся число будет адресом следующего значения. Нужно считать значение из этого адреса, и прибавить к нему уже следующее смещение. И так до самого последнего смещения.

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

Принцип понял, однако возникла некоторая проблема.

Нашёл указатель второго уровня:

"Main.exe"+0012F320
50C
1C0

Определил базовый адрес программы:

0x1012F454

И пытаюсь прочитать значение переменной, отвечающей за монеты таким образом:

Spoiler

 

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

#pragma warning(disable: 4996)
using namespace std;

// 0x002A1D28

DWORD Base_Adress = 0x1012F454;
DWORD pid;
DWORD value_1 = 0x0012F320;
DWORD get_value;

int main()
{

    HWND hwnd = FindWindowA(0, ("Master of Defense  by Voodoo Dimention (c) 2006 "));

    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);

    value_1 = get_value + 0x50C;

    ReadProcessMemory(phandle, (LPVOID)(value_1), &get_value, sizeof(get_value), 0);

    value_1 = get_value + 0x1C0;

    ReadProcessMemory(phandle, (LPVOID)(value_1), &get_value, sizeof(get_value), 0);

    cout << get_value;

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

    return 0;
}

 


Однако получаю значение 0.

В чём я ошибся?

 

Думаю, что проблема в базовом адресе.

Не знаю, как его найти в Cheat Engine.

Определял его через стороннюю программу.

 

Скрытый текст

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

int main()
{

    HWND hwnd = FindWindowA(0, ("Master of Defense  by Voodoo Dimention (c) 2006 "));

    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; // 1431...

    DWORD adres_2 = get_value + 0x50C;

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

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

    cout << get_value_2 << endl;  

    DWORD adres_3 = get_value_2 + 0x1C0;
    cout << "adr3 = " << adres_3 << endl;
    ReadProcessMemory(phandle, (LPVOID)adres_3, &get_value_3, sizeof(get_value_3), 0); // Получаем 3-ое значение
    cout << get_value_3 << endl;


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

    return 0;
}

 

 


Высчитывается 1-ое значение - базовый адрес + первый офсет(0x0012F320).
Прибавляем к нему 50C - 2-ой офсет - и всё - 0 в значении, хотя в cheat engine наше п олученное значение - представлено как значение, а есть ещё и адрес, который хранит это значение, 00270000. И прибавляя к нему 50C, в Cheat Engine можно выйти на 2-ое значение. Как выйти на этот адрес?
 

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

 

В 26.12.2016в17:52, mraklbrw сказал:

DWORD adres_2 = get_value + 0x50C;

 

Здесь кажется ошибка

попробуй так.

ReadProcessMemory(phandle, reinterpretate_case<PBYTE*>(get_value + 0x50C), &get_value2, 4, 0);

 

Изменено пользователем partoftheworlD
Ссылка на комментарий
Поделиться на другие сайты

×
×
  • Создать...

Важная информация

Находясь на нашем сайте, Вы автоматически соглашаетесь соблюдать наши Условия использования.