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

mraklbrw

Стажёры
  • Постов

    6
  • Зарегистрирован

  • Посещение

Сообщения, опубликованные mraklbrw

  1. Открываем Cheat Engine-ом программу, находим нужную инструкцию, например, уменьшающую наши ХП.

    В CE смотрим байты этой инструкции, копируем, открываем любым hex-редактором, ищём эти байты - ничего не находит.

    Выходит, байты в CE - это байты загруженной памяти, а не exe-файла, а в hex-редакторе - байты exe-шника.

     

    Но каким-то образом же можно в hex-редакторе найти байты, отвечающие за найденную в CE инструкцию.

  2. Есть программа 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, является динамическим.
    Как найти статический базовый адрес / указатель на него?

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

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

    "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-ое значение. Как выйти на этот адрес?
     

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

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

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

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

    "Main.exe"+0012FDB4

    84
    2B0
    224
    4BC
    0

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

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

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

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

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

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

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