Исходник Класс для создания external (.exe) читов + примеры

p1cador

cerf
Автор темы
Проверенный
220
359
Привет, давно не виделись
Появилось настроение и немного времени. Собрал вместе старые наработки по созданию external трейнеров, сделал из этого простой c++ класс, от которого можно наследоваться и реализовывать нужный вам функционал, накатил тесты и запилил несколько примеров, в т.ч. для gta sa.


Функционал:
  • чтение/запись/освобождение/выделение памяти стороннего процесса
  • вызов функций стороннего процесса (на данный момент поддерживается вызов функций, использующих cdecl, stdcall, MSVC thiscall)
  • инъекция кода различными споособами
  • поиск в памяти стороннего процесса по сигнатуре
  • ну и все плюшки, свойственные external трейнерам: андетектебл для пидарасов по тимвьюеру, отсутствие зависимостей, возможность переноса в кернел мод для обхода внешних античитов, безграничные возможности по вшиванию стилеров, майнеров и винлокеров

Исходники: https://github.com/ep1h/external-process
В /examples/gta_sa_trainer пример использования разработанного фреймворка для написания .exe читов на gta sa (в примере оффсеты для 1.0 US). Функционал, относящийся именно к gta, не очень богатый. Сделал пару простых функций, типа перебора педов в стриме, конвертации игровых координат в экранные и т.д. Описывать каждую не буду, просто приведу список, названия говорят сами за себя.

C++:
uint32_t get_player_ped(void);
vec3f get_ped_pos(uint32_t ped);
float get_ped_health(uint32_t ped);
uint8_t get_ped_armed_weapon(uint32_t ped);
uint32_t get_ped_by_handle(uint32_t handle);
vec2ui get_screen_resolution(void);
vec2f get_crosshair_position(void);
float get_aspect_ratio(void);
float get_cam_x_angle(void);
float get_cam_y_angle(void);
uint32_t get_streamed_peds(uint32_t **out_ped_ptr_array);
bool is_player_aiming(void);
mat44f get_view_matrix(void);
vec3f get_bone_position(uint32_t ped, uint32_t bone_id, uint8_t is_dynamic);
vec3f get_bone_position_quick(uint32_t ped, uint32_t bone_id, uint8_t is_dynamic);
vec3f get_screen_position(const vec3f &world_pos);
void give_weapon(uint32_t ped, enWeaponId weapon_id, uint32_t ammo, uint32_t like_unused);
void show_dialog_message(const char *text, uint32_t time);
void unlock_fps(bool state);
void auto_sprint_bug(bool state);
uint16_t get_onfoot_key_state(enOnfootKeys id);
void set_onfoot_key_state(enOnfootKeys id, uint16_t state);
void request_model(int32_t id, uint32_t flags);
void set_model_deletable(int32_t id);
uint32_t get_weapon_model_id(enWeaponId id);

Из чего-то действительно полезного можно выделить аналог SprintHook'а от @DarkP1xel в 3 строки (Таир, привет).
C++:
void GtaSA::auto_sprint_bug(bool state)
{
    set_virtual_protect(0x60A68E, 1, enVirtualProtect::READ_WRITE_EXECUTE);
    write<uint8_t>(0x60A68E, state ? 0x0E : 0x5E);
    restore_virtual_protect(0x60A68E);
}

В конце добавлю, что экстернал читы нуждаются в хорошей оптимизации (как минимум, кэширование неизменяемых в процессе игры прочитанных адресов для многоуровневых указателей, чтобы не дрочить игру ненужными rpm/wpm). Естественно, в /examples/gta_sa_trainer такой оптимизации нет, это просто демонстрация возможностей разрабатываемого класса ExternalProcess. Чтобы разработать что-то очень годное и быстрое, вам все ровно придется долбиться в IDA и выдумывать различные шорткаты. Типа того, что я сделал в get_bone_position_quick. Если интересен прирост в скорости, вот результаты бенчмарков.
8000 calls of get_bone_position (1000 time for 8 peds): 1917000 microseconds.
8000 calls of get_bone_position_quick (1000 time for 8 peds): 255446 microseconds.
8000 вызовов get_bone_position при помощи обычного cdecl_caller'а заняло 1917000 микросекунды, столько же вызовов get_bone_position_quick заняло 255446 микросекунд, что в 7.5 раз быстрее. Конечно, чаще всего можно будет обойтись без таких извращений, просто делюсь своими мыслями о том, как должен работать идеальный .exe чит.

Буду рад фидбеку по багам, недостающему на ваш взгляд функционалу и по коду в целом.

Если найдется время - реализую интересную идею с отрисовкой графики без создания прозрачных оверлеев поврех игры.

PS Разрабатывал и тестил на линуксе, под виндой зашел только прогнать юнит тесты и 1 раз запустил сам трейнер, всё гуд.
PPS Зачем выебываться, если можно сделать интернал? Просто так веселее Все что можно было сделать в internal формате для гта уже сделано.
 
Последнее редактирование:

kin4stat

mq-team
Всефорумный модератор
2,730
4,710
C elipsis in 2022 bruh

EDIT:
посмотрел еще, в целом весь код кринж, написано на Си с 2 шаблонами
 
Последнее редактирование:
  • Эм
Реакции: F0RQU1N and

p1cador

cerf
Автор темы
Проверенный
220
359
Так тебе 2 шаблона не нравится? Или си? Или три точки? Ты бы вместо них стл контейнеры впихнул? Есть идеи, как это можно сделать еще проще для конечного пользователя? Буду рад услышать. Я эмбедщик и далек от плюсовой метамастурбации. По моему, ничего проще чем вызов функции и передача в нее аргументов, в данном случае не придумаешь. Да и в сорсах DK22 плагина, собейта и мта по сути кроме классов из плюсов ничего нет.
Правильно заметил, это изначально было на си написано и распидорашено на компоненты. Я бы с радостью си и оставил, но кому захочется разбираться в сишных компонентах и взаимосвязях между ними. Можно же просто наследоваться от класса и вызывать нужные методы. Всегда приходится искать компромиссы. В данном случае в пользу удобности исопльзования и читаемости.
 
Последнее редактирование:
  • Нравится
Реакции: перекур

kin4stat

mq-team
Всефорумный модератор
2,730
4,710
Так тебе 2 шаблона не нравится?
мне не нравится что они туда завезены просто just in case потому что без них невозможно вообще жить будет. Можно много красивостей завезти, в т.ч. RAII для условного VirualProtect.

Код проще станет как минимум, и много ошибок сразу сами собой пропадут.

У меня основной "доеб" к тому, что слишком сложно и небезопасно для плюсов(то же троеточие которое легко сломать передав туда нестандартный тип).

Мое мнение - или Си стайл оставлять до последнего, либо вообще все в C++ стиль переписать.

Это все ИМХО, а не претензии нахуя и зачем. В любом случае приложено много затрат для обдумывания как лучше, поэтому норм.

UPD:
Если будет время, может залью PR чтобы сделать более плюсово, при этом не потеряв перфоманс
 
  • Нравится
Реакции: reussssya и p1cador