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

Статус
В этой теме нельзя размещать новые ответы.

mraklbrw

Пользователь
25 Дек 2016
0
0
Всеем доброго дня.

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

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

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

"Main.exe"+0012FDB4

84
2B0
224
4BC
0


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

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

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

Я так полагаю, что должен быть конкретный hex-адрес.[DOUBLEPOST=1482764333][/DOUBLEPOST]Принцип понял, однако возникла некоторая проблема.

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

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

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

0x1012F454

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


#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.

В чём я ошибся?[DOUBLEPOST=1482764794][/DOUBLEPOST]Думаю, что проблема в базовом адресе.

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

Определял его через стороннюю программу.[DOUBLEPOST=1482770793][/DOUBLEPOST]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-ое значение. Как выйти на этот адрес?
 
Статус
В этой теме нельзя размещать новые ответы.