 |

02.11.2022, 16:25
|
|
Участник форума
Регистрация: 19.03.2014
Сообщений: 222
С нами:
6395080
Репутация:
128
|
|
Привет, давно не виделись
Появилось настроение и немного времени. Собрал вместе старые наработки по созданию 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 формате для гта уже сделано.
|
|
|

02.11.2022, 17:54
|
|
Познавший АНТИЧАТ
Регистрация: 29.09.2018
Сообщений: 1,292
С нами:
4012500
Репутация:
138
|
|
хороший стиль кода
|
|
|

03.11.2022, 16:55
|
|
Флудер
Регистрация: 06.11.2017
Сообщений: 2,759
С нами:
4483143
Репутация:
183
|
|
C elipsis in 2022 bruh
EDIT:
посмотрел еще, в целом весь код кринж, написано на Си с 2 шаблонами
|
|
|

03.11.2022, 18:23
|
|
Участник форума
Регистрация: 19.03.2014
Сообщений: 222
С нами:
6395080
Репутация:
128
|
|
Так тебе 2 шаблона не нравится? Или си? Или три точки? Ты бы вместо них стл контейнеры впихнул? Есть идеи, как это можно сделать еще проще для конечного пользователя? Буду рад услышать. Я эмбедщик и далек от плюсовой метамастурбации. По моему, ничего проще чем вызов функции и передача в нее аргументов, в данном случае не придумаешь. Да и в сорсах DK22 плагина, собейта и мта по сути кроме классов из плюсов ничего нет.
Правильно заметил, это изначально было на си написано и распидорашено на компоненты. Я бы с радостью си и оставил, но кому захочется разбираться в сишных компонентах и взаимосвязях между ними. Можно же просто наследоваться от класса и вызывать нужные методы. Всегда приходится искать компромиссы. В данном случае в пользу удобности исопльзования и читаемости.
|
|
|

03.11.2022, 18:29
|
|
Флудер
Регистрация: 06.11.2017
Сообщений: 2,759
С нами:
4483143
Репутация:
183
|
|
Сообщение от p1cador
Так тебе 2 шаблона не нравится?
мне не нравится что они туда завезены просто just in case потому что без них невозможно вообще жить будет. Можно много красивостей завезти, в т.ч. RAII для условного VirualProtect.
Код проще станет как минимум, и много ошибок сразу сами собой пропадут.
У меня основной "доеб" к тому, что слишком сложно и небезопасно для плюсов(то же троеточие которое легко сломать передав туда нестандартный тип).
Мое мнение - или Си стайл оставлять до последнего, либо вообще все в C++ стиль переписать.
Это все ИМХО, а не претензии нахуя и зачем. В любом случае приложено много затрат для обдумывания как лучше, поэтому норм.
UPD:
Если будет время, может залью PR чтобы сделать более плюсово, при этом не потеряв перфоманс
|
|
|
|
 |
|
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
|
|
|
|