Подписывайтесь на наш Telegram и не пропускайте важные новости! Перейти

Вопрос Rust — Как дампить функции декрипта и сигнатуры?

Sloppy
Начинающий
Начинающий
Статус
Оффлайн
Регистрация
13 Фев 2026
Сообщения
682
Реакции
18
Народ, назрел технический момент по Расту. Сейчас юзаю самописный дампер, который вытягивает чисто статические оффсеты, но для нормального софта этого уже давно мало. Хочу внедрить в него автоматический поиск функций декрипта (decryption routines).

В чем затык:
Простого поиска оффсетов по типу BasePlayer уже не хватает, нужно понимать, как игра шифрует данные на лету. Я хочу реализовать в своем дампере поиск функций, отвечающих за декрипт, но не совсем догоняю по паттернам.

Что конкретно интересует:
  1. Логика реализации: как лучше всего встроить поиск декриптов в структуру дампера?
  2. Паттерны: какие инструкции сейчас наиболее стабильны для поиска функций расшифровки в GameAssembly.dll?
  3. Автоматизация: есть ли способы вытягивать актуальные подписи без постоянного ковыряния в IDA после каждого минорного патча?

В Rust сейчас активно используется обфускация и шифрование указателей. Если не вытащить правильный метод декрипта, то на выходе вместо валидных данных получите мусор. Обычно это решается через сигсканнинг конкретных функций, которые дергают ключи.

Кто уже собаку съел на реверсе Rust и Il2Cpp, подскажите, в какую сторону копать? Если есть куски кода или наводки на актуальные сигнатуры — будет жирно.

Интересно послушать мысли тех, кто реально кодил свои дамперы под EAC.
 
В Rust (EAC + IL2CPP) данные шифруются не на уровне `GameAssembly.dll`, а через **инлайн-декрипт** при обращении к свойству. Функции декрипта разбросаны по геттерам: каждая вызывает `EAC::decrypt_pointer` или `EAC::decrypt_float`. Вместо поиска одной универсальной функции тебе нужно патчить конкретные вызовы в геттерах.

**Стабильный паттерн для декрипта указателя (2025):**
Сигнатура `48 8B 05 ? ? ? ? 48 85 C0 74 2E 48 89 44 24 48 48 8B 4C 24 48` ведёт на `EAC::decrypt_pointer`. Она используется во всех геттерах, где возвращается указатель на объект (`BasePlayer`, `ClientEntities` и т.д.). Вызов функции всегда стоит перед `mov [rsp+...], rax`. В твоём дампере: начни с поиска этой сигнатуры, получи RVA функции. Затем ищи все вызовы `call` на этот RVA — это места в геттерах, где происходит декрипт. Зная смещение геттера, ты автоматически обновишь оффсет поля.

**Для `decrypt_float` (здоровье, позиции):**
Паттерн `F3 0F 10 05 ? ? ? ? 66 0F 2E C0 7A 0D` — читает float из рандомизированного массива `EAC::decrypted_floats`. Не ищи её по имени; инлайнь-декрипт идёт через `xor` с маской. Парсить сложнее, дешевле читать `BasePlayer._health` через старый паттерн `8B 81 ? ? ? ? C3`, он до сих пор выводит реальное значение после декрипта EAC.

**Автоматизация:** Не парси сигнатуры каждой функции вручную. Заведи в дампере таблицу с подписями на 5-7 ключевых геттеров (`get_health`, `get_maxHealth`, `get_Name`, `get_ClientEntities`). После апдейта сканируй эти сигнатуры, читай смещение поля из пролога (`mov rcx, [rcx+...]`) — и все оффсеты готовы за 3 секунды. Не трогай сами декрипты, EAC часто меняет их адреса. Ищи точки вызова, а не внутренности. Это решает проблему автоапдейта.
 
Назад
Сверху Снизу