Pull to refresh

Comments 22

Вот это чтиво, в троллейбусе такое не осилить. Ох, как же я, оказывается, соскучился по reverse engineering'у. Спасибо!
Да, по объему вышло немало — пришлось убрать применение PageGuard Hook и Forced Exception Hook. Следующую статью писать приятней — там по сути сплошное исследование, нет теории в таком объеме:)
Большое спасибо за статью.
Нахлынули приятные воспоминания, когда читал про внедрение, перехват вызовов, аппаратные точки останова, отладочные регистры…
Как будто сидишь перед неким артефактом и впитываешь сакральное знание (которым для меня являются аппаратные точки останова, так сложилось что ни разу не реализовывал, тем более взахлеб читалось).
Нахлынули приятные воспоминания

Если не секрет, для чего использовали?

которым для меня являются аппаратные точки останова, так сложилось что ни разу не реализовывал

В таком случае советую Вам дополнительно изучить работу Page Guard и Forced Exception Hook — их тоже многие античиты игнорируют — правда с быстродействием могут быть проблемы, применять надо осторожно.
Звучит любопытно, добавил в закладки.
Я оснастил свой игровой клиент некоторым дополнительным функционалом (как только скажу, какой и каким — со мной тут же поздоровается человек, которому это не понравилось =X).
А системным программированием я заболел немного раньше, когда сдуру после первого курса бакалавриата взялся за скрытие процесса из Диспетчера задач Windows.
С задачей я не справился (провел две отчаянных недели в ловле сегфолтов в чужом адресном пространстве при попытке нащупать путь к перечислению процессов). Но честное слово, не благоговей я после этого — тогда и теперь — перед системным или прикладным, низкоуровневым и / или алгоритмически сложным софтом, создающим для нас эти чудеса — мультимедийные игры реального времени, компиляторы шаблонов шаблонов шаблонов шаблонов, системы автоматического (!) проектирования (!), распознавания и передачи текста, звука и изображения, никакого программиста из меня бы не вышло.
Проделана большая работа, респект!

Правильно ли я понимаю, что Layerth и другие системы, которые применяются при трансляции проигр, для получения подобной информации используют какие-то «простые» API Dota/Valve/Source, и обходятся без реверс инжиниринга?
Привет, спасибо за интересный вопрос. Я знаком лишь с системами для стриминга и записи экрана (например obs-studio), где получение картинки в игре реализовывается в основном перехватом функций графического API, обычно используется замена виртуальной таблицы (VMT Hook) или тот же Opcode Hook. Также внедряется библиотека, после внедрения создается канал (pipe) и идет общение между внедренным кодом и управляющей программой, своего рода локальный клиент-сервер. VAC ловит эту библиотеку, отправляет на анализ, сравнивает со списком разрешенных и не обращает на нее внимание (собственно несколько недель назад в кастомке Dota Auto Chess был введен античит — добавили сатиров, которые скрывают героев — в итоге те, кто стримил игру получили бан). С системами трансляции игр сталкиваться не доводилось, если говорить конкретно про вывод статистики (HUD) могу лишь подумать вслух, как бы я решал такую задачу — я бы делал оверлей с использованием Panorama, а статистику брал из исторических данных (Dota 2 предоставляет live Game State Integration data).
Apex Legend (структура которой довольно схожа с Dota 2, как мне кажется)
Потому что оба используют один движок?
Замечу, что Titanfall Engine начал свое развитие с Source, должен был претерпеть изменения в процессе разработки Titanfall 1,2. Dota 2 же использует Source 2. Поэтому был удивлен таким сходством. Для меня это как сравнить Source 2 и Quake 3 (могу ошибаться, но родителем Source является Quake Engine) — целая Schema System против простенькой интроспективы для репликации:
#define	NETF(x) #x,(int)&((entityState_t*)0)->x

netField_t	entityStateFields[] = 
{
{ NETF(pos.trTime), 32 },
{ NETF(pos.trBase[0]), 0 },
{ NETF(pos.trBase[1]), 0 },
{ NETF(pos.trDelta[0]), 0 },
{ NETF(pos.trDelta[1]), 0 },

К тому же, когда используют игровые движки, обычно их сетевую часть и модели использую, в сравнении с остальным функционалом, меньше всего и пишут свое решение (мои личные наблюдения).
Для меня это как сравнить Source 2 и Quake 3

Движок первого Half-Life — GoldSrc — форкался от idTech2, т.е. Quake 2, да и idTech3 ещё только начинался в момент лицензирования движка Valve :)
В C++, С# это прячется от нас, а компилятор об этом знает

можно и не лезть в регистры, а тупо взять адрес любого стекового аргумента процедуры и ориентироваться по физическому стеку от него.

Еще как-то из-за невозможности прямого тайпкаста вкручивал поток на метод VCL-класса в борландовском билдере:
// В ДЕКЛАРАЦИИ КЛАССА ФОРМЫ:
private:
void NetThread();
bool NetworkThreadMustDie,NetworkThreadMustPause;
// В КОНСТРУКТОРЕ ФОРМЫ:
LaunchMemberThread(77,&NetThread);
// НАЗНАЧЕНИЕ ПОТОКА НА МЕТОД VCL КЛАССА - вместо тайпкаста всё через жопу:
static void __stdcall LaunchMemberThread(int n,...){
_beginthread((void(*)(void *))((&n)[1]),32768,(void*)((&n)[2]));
}

Таким образом метод класса при системном коллбэке в контексте нового потока штатно получал свой this и других глупостей большей не требовалось.

ЗЫ. Админы, оформление CODE не отображает красиво табуляции, надо как тупой школьник запиливать пробелы??? На дворе какой год — сделайте нормально дескриптор стиля или выходной процессор на поток.
можно и не лезть в регистры, а тупо взять адрес любого стекового аргумента процедуры и ориентироваться по физическому стеку от него.

Согласен, как вариант.

Обращайте внимание на разницу между тегами source и code. Source вставляет блочный элемент с подсветкой синтаксиса, в то время как code вставляет строчный элемент (по сути просто моноширинным шрифтом). Соответственно, нет смысла вставлять несколько строк кода в тег code — он будет некрасиво смотреться, сливаясь с основным текстом. А вот source — наоборот.

Оформлял статью по заметке, соответственно лучше source использовать.

Код поднял настроение:)
Круто конечно) надеюсь гейб прочитает статью

В последнее время на хабре мало статей, которые чему-то реально учат. Эта, прям… огонь! Очень интересно и познавательно. Заметен академический подход. Спасибо!

Часто вижу статьи по Доте с использованием Cheat Engine. Почему он работает у всех?
Пару лет назад был забанен в доте спустя 2 часа после запуска Cheat Engine. При том, что ничего особо читерного не делал, память не менял, просто сканил какие-то структуры, искал значения — чисто рид-онли.
Пошёл на кухню, сделал чаю, поел, вернулся — бан уже висит. С тех пор был уверен, что античит у них довольно злой в этом плане. Но с завидной регулярностью появляются статьи на всяких форумах про безнаказанное использование чит энджина, типа за него не банят… странно.
Почему он работает у всех?

Вообще видел много постов на соответствующих форумах про баны за использование Cheat Engine — помню даже пост, где автор был возмущен тем, что получил бан за то, что CE был запущен — просто запущен, не был даже выбран процесс для анализа.

Хотя примечательно то, что в последнее время я действительно не встречал постов с жалобами / вопросами о наказании. Не могу сказать, что много ковырял Dota 2 с помощью CE — перед тем, как кинуться изучать игру, я почитал форумы и быстро вышел на Source2Gen. Cheat Engine я активно использовал ранее для изучения CS:GO — и получал баны (правда меня банили через 1,5-2 недели, примерно с таким же периодом получал баны на аккаунты с Dota 2, но не по причине использование CE — Ваш бан спустя 2 часа меня удивил).

То же самое можно сказать про использование отладчика (в моем случае x64dbg) — я применял его очень активно (как с использованием ScyllaHide, так и без, как в рейтинговых сражениях, так и в своем лобби), VAC закрывал на это глаза.

Я не видел информации, чтобы CE как то скрывал свою работу (как это делает ScyllaHide в x64dbg), возможно он стал перехватывать определенные системные вызовы (опять же, предположение). Стоит также сказать, что разработчики постоянно что-то меняют в античите — возможно, если бы я начал писать бота не пол года, а скажем 1-2 года назад, то плагин ScyllaHide был бы обязателен для отладки.

Подведу итог: не могу ответить на Ваш вопрос точно, лишь выскажу предположения:
  • CE начал перехватывать системные вызовы и заметать следы (что врят ли, не слышал такого).
  • Вы попали под период, когда разработчики действительно вели себя кровожадно, но в следствии большого кол-ва ложных срабатываний и жалоб были вынуждены ослабить хватку. (вероятнее всего. на это указывает бан в течении 2 часов — хоть это и не бан за внедрение/подмену/перехват кода, все равно довольно оперативно)
С технической точки зрения отличная статья, спасибо.

С точки зрения же игрока очень обидно, что до сих пор не придумали никакого надежного способа уничтожить читерство на корню… Возможно, когда-нибудь наступит время, когда игры будут целиком играться на удаленном сервере, а связь обеспечит плавный игровой процесс без разрывов.
Согласен, читы доставляют большие проблемы честным игрокам. В Dota 2, LoL, WoW это не супер сильно ощущается, а вот в шутерах это огромная проблема.

Игроки, которые хотят развиваться в жанрах, где читеры имеют слишком сильное преимущество и не дают нормально играть, обычно уходят в лиги (к примеру esea для CS:GO), где свои, довольно суровые античиты (что все равно не спасает), свой mm, а главное — у людей другое отношение к игре.

В итоге нечестному игроку придется заплатить не только за игру, а еще за платформу лиги + подписка на чит будет стоить уже других денег (а если его поймают, забанят не только аккаунт, а еще и железо — отмыть такой бан также стоит дополнительных затрат).

Статья интересная. Какие книги посоветуете почитать на смежные темы, такие как работа ОС на низком уровне?

К сожалению нет такой технической книги, которую я бы прочитал на достойном уровне — обычно читаю кусками. Под Windows мне понравилась книга Windows System Programming, под Linux был затык в понимании, помогла The Linux Programming Interface (прочитал страниц 70, не больше), запомнилась книга Python Programming for Hackers and Reverse Engineers.

Мое знакомство с реверсом началось с того, что я устал прокачивать навык метания ножа в игре Silent Storm (где навыки прокачиваются по мере их использования, как в The Elder Scrolls) и захотел автоматизировать этот процесс — в этом помогли общение на форумах и много самостоятельных исследований. Не могу вспомнить, чтобы книги поначалу как-то помогли — но после практики действительно позволяют углубить знания (как по мне, только после практики).

Помимо приведенных книг могу посоветовать канал Zer0Mem0ry.
Sign up to leave a comment.

Articles