Загрузка...

Авторская статья Пишем свой интернал чит для игры AssaultCube. C++

Тема в разделе C/C++ создана пользователем Checkerchin 7 мар 2018. 9896 просмотров

  1. Checkerchin
    Checkerchin Автор темы 7 мар 2018 178 16 апр 2017
    Тема не для новичков.

    Я буду писать интернал чит на Vusial Studio 2015/Vusial C++. (После перезапуска игры нужно будет найти значение, но только одно, позже увидите)
    Так как у нас интернал чит, т.е его нужно будет внедрять, то мы будем писать DLL.

    Программы, которые понадобятся:
    Visual Studio (либо компилятор C++)
    Cheat Engine
    Process Hacker (Для внедрения DLL, так как инжектор я писать еще не научился:admin: )
    Ну и конечно же сама игра AssaultCube. ( https://assault.cubers.net/ )

    И так приступим.

    1. Создаем новый проект в VS. Visual C++ -> Win32 Project -> Next -> Ставим галочку на DLL -> Finish.
    [IMG]
    https://prnt.sc/inz6sj

    2. Удаляем все файлы исходного/заголовочного кода и в файле dllmain.cpp добавляем
    Код
    #include <Windows.h>
    Так как без этого не будут работать некоторые типы данных и некоторые дефайны.
    [IMG]

    3. Пишем вызов потока
    После
    Код
    #include <Windows.h>
    пишем
    Код
    DWORD WINAPI MainTHREAD(LPVOID);
    Это функция - поток, мы ее будем вызывать.
    После первого кейса (После события инжекта в процесс) нужно её вызвать.
    Это делаем такой строчкой кода:
    Код
    CreateThread(0, 0, MainTHREAD, 0, 0, 0);
    До создания потока, я выведу MessageBox с повествованием о успешном инжекте.
    Код
    MessageBox(0, L"Injected!", L"Succsessfully!", 0);

    И того у нас получается так:
    Код

    case DLL_PROCESS_ATTACH:
    MessageBox(0, L"Injected!", L"Succsessfully!", 0);

    CreateThread(0, 0, MainTHREAD, 0, 0, 0);

    4. Пишем ф-цию потока.
    Наш поток должен что-то делать, а это значит, что мы должны написать функцию.

    Код

    DWORD WINAPI MainTHREAD(LPVOID) {
    while (true) {
    Sleep(70);
    if (GetAsyncKeyState(VK_INSERT) & 1) {
    //Что-то будет происходить по нажатию кнопки INSERT
    }
    }
    }

    5. Пишем читерские функции и ищем адреса
    Как вы поняли из кода по кнопке INSERT будет выполняться какое-то действие. Этим действием будет увеличение жизней и бронижелета до одного миллиона.
    Так как я за инкапсуляцию я сделаю еще один заголовочный файл и .cpp. Думаю как их создовать вопросов не должно возникнуть.

    Заголовочный файл - Funcs.h
    Cpp файл - Funcs.cpp


    Так же я создам заголовочный и .cpp файл для оффсетов и адресов.

    Заголовочный файл - offsets.h
    Cpp файл - offsets.cpp

    Для написания наших не легальных читерских ф-ций нам нужны адреса и смещения (оффсеты - смещения). Давайте их найдем.

    Запускаем AssaultCube и CE (CE - Cheat Engine)
    В CE находим процесс ac_client

    Ищем адрес наших жизней. Думаю знаете, как это делать, да и полно гайдов.

    И так, я нашел адрес моих жизней - это 0x027DA728

    Но как же нам найти адрес брони не подбирая значения? Никак.
    Ищем броню тоже.

    И так, я нашел адрес моей брони- это 0x027DA72C

    [IMG]
    ( https://ibb.co/nqJMNn )

    Но эти адреса одноразовые, нужно найти адрес от которого можно будет отталкиваться.
    Выбираем HP (в CE) и жмем F5 -> Yes.

    В инструкции нам показали оффсет это F8.
    Открою секрет для брони оффсет это FC.

    Жмем в инструкции на любой из адресов и жмем "More Info"
    И копируем адрес

    [IMG]

    ( https://ibb.co/ne4p8S )

    Если к данному адресу прибавить смещение, то получатся наши жизни/броня.

    Код файла offsets.h:
    Код

    #include <Windows.h>

    extern unsigned __int64 Base;
    struct offsets {
    unsigned __int64 armor_offset = 0xFC;
    unsigned __int64 hp_offset = 0xF8;
    };

    extern offsets offset;
    extern DWORD protection; //Защита

    extern unsigned __int64 armor; //Броня
    extern unsigned __int64 hp; //HP
    И код файла offsets.cpp:
    Код

    #include <Windows.h>

    unsigned __int64 Base = 0x027DA630;
    struct offsets {
    unsigned __int64 armor_offset = 0xFC;
    unsigned __int64 hp_offset = 0xF8;
    };

    offsets offset;
    DWORD protection = 0; //Защита

    unsigned __int64 armor = Base + offset.armor_offset; //Броня
    unsigned __int64 hp = Base + offset.hp_offset; //HP


    Наверняка у вас возник вопрос, зачем нужна эта переменная:
    Код
    DWORD protection = 0;
    Это переменная защиты процесса, если ее не поставить обратно после изменения, в нашем случае накрутки критерий нашего персонажа, то программа может просто напросто вылететь.

    Приступим к написанию ф-ций:
    Код файла Funcs.h:

    Код

    #include <Windows.h>

    #define windowname L"AssaultCube"

    using namespace std;

    void vPlusV(); //Эта ф-ция прибавляет миллион
    void set(); //Эта ф-ция устанавливает значения на миллион
    Код файла Funcs.cpp:

    Код

    #include <Windows.h>
    #include "offsets.h"
    #include "Funcs.h"

    HWND hwnd_FW = FindWindow(0, windowname);

    void set() {
    VirtualProtect((void*)hp, 4, PAGE_EXECUTE_READWRITE, &protection); // HP //Снимаем защиту
    *(int*)hp = 1000000; //Устанавливаем значение
    VirtualProtect((void*)hp, 4, protection, &protection); //Возвращаем защиту

    VirtualProtect((void*)armor, 4, PAGE_EXECUTE_READWRITE, &protection); // Armor
    *(int*)armor = 1000000;
    VirtualProtect((void*)armor, 4, protection, &protection);
    }
    void vPlusV() {
    VirtualProtect((void*)hp, 4, PAGE_EXECUTE_READWRITE, &protection); // HP //Снимаем защиту
    *(int*)hp += 1000000; //Прибавляем
    VirtualProtect((void*)hp, 4, protection, &protection); //Возвращаем защиту

    VirtualProtect((void*)armor, 4, PAGE_EXECUTE_READWRITE, &protection); // Armor
    *(int*)armor += 1000000;
    VirtualProtect((void*)armor, 4, protection, &protection);
    }
    Собственно все.
    Я немного модифицировал код, теперь при нажатии на INSERT прибавляется значение, при нажатии на END устанавливается.

    Проверяем!
    Параметр компиляции: x86
    INSERT - https://ibb.co/fZS1oS
    END - https://ibb.co/igbSTS

    #МояСтатья
    #МногоБукв
     
    7 мар 2018 Изменено
  2. Checkerchin
    Checkerchin Автор темы 7 мар 2018 178 16 апр 2017
    Жду ваших мнений и комментариев.
    RaysMorgan
     
  3. Енот272_inactive171964
    Енот272_inactive171964 8 мар 2018 Ушел на покой 372 6 сен 2017
    У меня навернулись слезы))) Помнится мне была такая игра Fonline, так я там дох с завидным постоянством. Да и **** вещей при смерти заставлял начинать с чистого листа, точнее с пижамы... Ну прикинь после каждой смерти - ты новорег))) Слава богу исходники игры были открыты. Можно было дебажить и радоваться жизни.
     
  4. Checkerchin
    Checkerchin Автор темы 8 мар 2018 178 16 апр 2017
    после смерти новорег)
     
Загрузка...
Top