mraklbrw
-
Постов
6 -
Зарегистрирован
-
Посещение
Тип контента
Профили
Форумы
Загрузки
Блоги
Сообщения, опубликованные mraklbrw
-
-
Есть программа 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, является динамическим.
Как найти статический базовый адрес / указатель на него? -
В первой строчке ругается на то, что значение unsigned long нельзя присвоить DWORD *
Во второй строчке ругается на reintepretate case
-
Принцип понял, однако возникла некоторая проблема.
Нашёл указатель второго уровня:
"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-ое значение. Как выйти на этот адрес?
-
Всеем доброго дня.
Только что разобрался с темой поиска указателей.
Пробовал на игре Master of Defense посредством Cheat Engin-а.
Нашёл указатель и оффсеты:
"Main.exe"+0012FDB4
84
2B0
224
4BC
0Написал чит-трейнер на Cheat Engine. Всё работает. Теперь хотелось бы написать чит-трейнер на C++.
Проблема вот в чём: не пойму, что делать с указателем.
К какой ячейке памяти обращаться?
Я так полагаю, что должен быть конкретный hex-адрес.
Патчинг программы Cheat Engine + hex-редактор
in Вопросы по созданию читов в одиночных играх
Опубликовано
Открываем Cheat Engine-ом программу, находим нужную инструкцию, например, уменьшающую наши ХП.
В CE смотрим байты этой инструкции, копируем, открываем любым hex-редактором, ищём эти байты - ничего не находит.
Выходит, байты в CE - это байты загруженной памяти, а не exe-файла, а в hex-редакторе - байты exe-шника.
Но каким-то образом же можно в hex-редакторе найти байты, отвечающие за найденную в CE инструкцию.