mraklbrw Опубликовано 25 декабря, 2016 Поделиться Опубликовано 25 декабря, 2016 Всеем доброго дня. Только что разобрался с темой поиска указателей. Пробовал на игре Master of Defense посредством Cheat Engin-а. Нашёл указатель и оффсеты: "Main.exe"+0012FDB4 84 2B0 224 4BC 0 Написал чит-трейнер на Cheat Engine. Всё работает. Теперь хотелось бы написать чит-трейнер на C++. Проблема вот в чём: не пойму, что делать с указателем. К какой ячейке памяти обращаться? Я так полагаю, что должен быть конкретный hex-адрес. Ссылка на комментарий Поделиться на другие сайты Поделиться
Xipho Опубликовано 26 декабря, 2016 Поделиться Опубликовано 26 декабря, 2016 Конечно, нет. Тебе надо найти базовый адрес, который в СЕ представлен именем файла ( "Main.exe" ). К этому базовому адресу нужно прибавить первое смещение ( 0012FDB4 ). Из полученного адреса считать значение. К этому значению прибавить второе смещение ( 84 ). Получившееся число будет адресом следующего значения. Нужно считать значение из этого адреса, и прибавить к нему уже следующее смещение. И так до самого последнего смещения. Ссылка на комментарий Поделиться на другие сайты Поделиться
mraklbrw Опубликовано 26 декабря, 2016 Автор Поделиться Опубликовано 26 декабря, 2016 Принцип понял, однако возникла некоторая проблема. Нашёл указатель второго уровня: "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. В чём я ошибся? Думаю, что проблема в базовом адресе. Не знаю, как его найти в 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-ое значение. Как выйти на этот адрес? Ссылка на комментарий Поделиться на другие сайты Поделиться
partoftheworlD Опубликовано 27 декабря, 2016 Поделиться Опубликовано 27 декабря, 2016 (изменено) В 26.12.2016 в 14:52, mraklbrw сказал: DWORD adres_2 = get_value + 0x50C; Показать Здесь кажется ошибка попробуй так. ReadProcessMemory(phandle, reinterpretate_case<PBYTE*>(get_value + 0x50C), &get_value2, 4, 0); Изменено 27 декабря, 2016 пользователем partoftheworlD Ссылка на комментарий Поделиться на другие сайты Поделиться
mraklbrw Опубликовано 27 декабря, 2016 Автор Поделиться Опубликовано 27 декабря, 2016 В первой строчке ругается на то, что значение unsigned long нельзя присвоить DWORD * Во второй строчке ругается на reintepretate case Ссылка на комментарий Поделиться на другие сайты Поделиться
Xipho Опубликовано 28 декабря, 2016 Поделиться Опубликовано 28 декабря, 2016 В 27.12.2016 в 17:33, mraklbrw сказал: Во второй строчке ругается на reintepretate case Показать reinterpret_cast правильнее будет. Ссылка на комментарий Поделиться на другие сайты Поделиться
partoftheworlD Опубликовано 28 декабря, 2016 Поделиться Опубликовано 28 декабря, 2016 (изменено) Извиняюсь, видимо когда писал на телефоне сработала авто-замена. Изменено 28 декабря, 2016 пользователем partoftheworlD Ссылка на комментарий Поделиться на другие сайты Поделиться
Dino Опубликовано 28 декабря, 2016 Поделиться Опубликовано 28 декабря, 2016 а ты уверен что Main.exe всегда грузится по одному адресу? Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения