ANTICHAT

ANTICHAT (https://forum.antichat.xyz/index.php)
-   С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby (https://forum.antichat.xyz/forumdisplay.php?f=24)
-   -   Класс для создания external (.exe) читов + примеры (https://forum.antichat.xyz/showthread.php?t=1456284)

p1cador 02.11.2022 16:25

Привет, давно не виделись

Появилось настроение и немного времени. Собрал вместе старые наработки по созданию 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

(
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 формате для гта уже сделано.

F0RQU1N and 02.11.2022 17:54

хороший стиль кода

kin4stat 03.11.2022 16:55

C elipsis in 2022 bruh

EDIT:

посмотрел еще, в целом весь код кринж, написано на Си с 2 шаблонами

p1cador 03.11.2022 18:23

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

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

kin4stat 03.11.2022 18:29

Цитата:

Сообщение от p1cador

Так тебе 2 шаблона не нравится?

мне не нравится что они туда завезены просто just in case потому что без них невозможно вообще жить будет. Можно много красивостей завезти, в т.ч. RAII для условного VirualProtect.

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

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

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

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

UPD:

Если будет время, может залью PR чтобы сделать более плюсово, при этом не потеряв перфоманс


Время: 16:35