HOME FORUMS MEMBERS RECENT POSTS LOG IN  
× Авторизация
Имя пользователя:
Пароль:
Нет аккаунта? Регистрация
Баннер 1   Баннер 2
НОВЫЕ ТОРГОВАЯ НОВОСТИ ЧАТ
loading...
Скрыть
Вернуться   ANTICHAT > ПРОГРАММИРОВАНИЕ > С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby
   
Ответ
 
Опции темы Поиск в этой теме Опции просмотра

  #1  
Старый 02.11.2022, 16:25
p1cador
Участник форума
Регистрация: 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 формате для гта уже сделано.
 
Ответить с цитированием

  #2  
Старый 02.11.2022, 17:54
F0RQU1N and
Познавший АНТИЧАТ
Регистрация: 29.09.2018
Сообщений: 1,292
С нами: 4012500

Репутация: 138


По умолчанию

хороший стиль кода
 
Ответить с цитированием

  #3  
Старый 03.11.2022, 16:55
kin4stat
Флудер
Регистрация: 06.11.2017
Сообщений: 2,759
С нами: 4483143

Репутация: 183


По умолчанию

C elipsis in 2022 bruh

EDIT:

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

  #4  
Старый 03.11.2022, 18:23
p1cador
Участник форума
Регистрация: 19.03.2014
Сообщений: 222
С нами: 6395080

Репутация: 128
По умолчанию

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

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

  #5  
Старый 03.11.2022, 18:29
kin4stat
Флудер
Регистрация: 06.11.2017
Сообщений: 2,759
С нами: 4483143

Репутация: 183


По умолчанию

Цитата:
Сообщение от p1cador  

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

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

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

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

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

UPD:

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





Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 


Быстрый переход




ANTICHAT ™ © 2001- Antichat Kft.