- Статус
- Оффлайн
- Регистрация
- 7 Ноя 2023
- Сообщения
- 93
- Реакции
- 62
Как взламывался plaguecheat
Вступление
Мозольный привет. Простенькая статья на тему того, как взламывался чит buttplag(ue)CC. Никогда до этого подобного контента на югейме не делал, культ шитпостинга все дела, но под новый предоставилась такая возможность да делать особо нехуй вот выдавил из себя пару абзацев.
Hardware-привязки
KUSER_SHARED_DATA
Автор защиты решил взять реверсеров не качеством, а количеством - и напихал 50k+ проверок по KUSER_SHARED_DATA во всех видах и формах: под VMProtect-виртуализацией, под MBA-блоками. Но оказалось не всё так солнечно, как он ожидал.
Не совсем ясно, почему автор защиты не засунул сам адрес KUSER_SHARED_DATA под MBA. В этой обфусцированной проверки не имеет никакого смысла, кроме как хвастовство бездарными OLLVM-пассами.
Вышеуказанные проверки были найдены трейсером на основе Unicorn (написан за вечер и бутылку водки со спрайтом).
И в первом, и во втором примере это обходится обычной подменой результата чтения KUSER_SHARED_DATA.
В этом примере автору защиты не дали возможности опозориться: логика вычисления адреса и сравнение оказались под виртой. Но это не стало проблемой - последние полгода я трудился над универсальным девиртуализатором на основе форка
Mergen, и Plague показался отличным тестовым полигоном.Примечание: Эта разработка никогда не увидит свет, в связи с чем я не буду освещать детали того, как я обошел проверки под виртой.
Проверка на стэк
Помимо 50k банальных чеков на KUSER_SHARED_DATA, автор защиты решил добавить “оригинальность” - проверку адреса стэка в main-потоке и в потоке чита. На основе адреса стэка происходила расшифровка дальнейших констант и адресов.
При неверной расшифровке
ret возвращал в невалидное адресное пространство.Благодаря девирту я нашёл и обошёл это: простая подмена адреса стэка на старте потока игры и чита.
В результате жертва, которая раскусила охотника, больше не считалась жертвой - и от защиты не осталось ничего, кроме фикса импортов.
Импорты
Фикс импортов тоже не представлял из себя ничего сложного: я выделял память по их изначальным адресам с дампа и ставил jump на уже рабочий импорт.
Заключение
Не считая времени на написание тулинга: на кряк потратил 2 года 3 месяца 14 недель 88 дней, было выпито около 57 литров водки.
Поздравляю всех с наступающим Новым годом и желаю автору разобраться, какие проверки существуют помимо KUSER_SHARED_DATA, и как всё же применять MBA-блоки.