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

Вопрос [Обсуждение] Roblox — Дамп офсетов через Kernel и обход Hyperion

Sloppy
Начинающий
Начинающий
Статус
Оффлайн
Регистрация
13 Фев 2026
Сообщения
770
Реакции
20
Залетел в реверс актуального RobloxPlayerBeta, пытаюсь вытянуть живые офсеты под Hyperion.

Стандартные методы через обычные дамперы сейчас сосут — дампы в той же Гидре выходят просто нулевыми. Похоже, Hyperion (Byfron) конкретно заморочился со Scattered Mapping и ленивой загрузкой модулей. Решил не долбиться в закрытые двери и пошел через ядро.

Текущий стек разработки:
  1. Драйвер маппится через kdmapper.
  2. Для чтения памяти юзаю MmCopyVirtualMemory, чтобы не светить хендлами и забить на OpenProcess.
  3. Связь юзермод-ядро организована через shared memory с NULL DACL.

Как это работает сейчас:
Поскольку база процесса пустая, я итерирую RX-регионы через VirtualQueryEx. Наткнулся на интересный динамический блок размером около 13.5MB, который подтягивается из BYF*.tmp. Вместо того чтобы пытаться отребилдить PE-заголовок (что сейчас та еще боль), я просто закидываю эти регионы в драйвер и прохожусь по ним AOB-сканером.

Что удалось вытянуть и в чем затык:
Уже нашел luau_gettop через сигнатуры, но есть сомнения в их долговечности. Сейчас цель — достать luau_execute, lua_getfield, lua_settop и identity offset. Проблема в том, что Hyperion мутирует код и сигнатуры слетают быстрее, чем я успеваю их записывать.

Эта функция забита мусором по самое не хочу. Чтобы подтвердить находку и не ловить BSOD при попытке вызова, советую смотреть на XREFs от специфических строк ошибок Luau или искать константы главного VM-лупа. Если сигнатура кидает вас в центр жирного switch-кейса — это оно.

Собственно, вопрос к местным гуру реверса: стоит ли дальше упарываться в динамический скан памяти или лучше все-таки попытаться реконструировать чистый статический дамп для анализа в IDA? Кто как сейчас фиксит волатильность AOB под Byfron и на что опираетесь — на строки или на графы функций?

Интересно узнать, как вы боретесь с постоянно меняющимися оффсетами в последних апдейтах.
 

Удачи! Пусть AOB-сканер не подведет, а офсеты не сбегут в параллельную вселенную. И да, возможно, проще просто купить Roblox Premium… Но где же тогда веселье? 😄

 
Залетел в реверс актуального RobloxPlayerBeta, пытаюсь вытянуть живые офсеты под Hyperion.

Стандартные методы через обычные дамперы сейчас сосут — дампы в той же Гидре выходят просто нулевыми. Похоже, Hyperion (Byfron) конкретно заморочился со Scattered Mapping и ленивой загрузкой модулей. Решил не долбиться в закрытые двери и пошел через ядро.

Текущий стек разработки:
  1. Драйвер маппится через kdmapper.
  2. Для чтения памяти юзаю MmCopyVirtualMemory, чтобы не светить хендлами и забить на OpenProcess.
  3. Связь юзермод-ядро организована через shared memory с NULL DACL.

Как это работает сейчас:
Поскольку база процесса пустая, я итерирую RX-регионы через VirtualQueryEx. Наткнулся на интересный динамический блок размером около 13.5MB, который подтягивается из BYF*.tmp. Вместо того чтобы пытаться отребилдить PE-заголовок (что сейчас та еще боль), я просто закидываю эти регионы в драйвер и прохожусь по ним AOB-сканером.

Что удалось вытянуть и в чем затык:
Уже нашел luau_gettop через сигнатуры, но есть сомнения в их долговечности. Сейчас цель — достать luau_execute, lua_getfield, lua_settop и identity offset. Проблема в том, что Hyperion мутирует код и сигнатуры слетают быстрее, чем я успеваю их записывать.

Эта функция забита мусором по самое не хочу. Чтобы подтвердить находку и не ловить BSOD при попытке вызова, советую смотреть на XREFs от специфических строк ошибок Luau или искать константы главного VM-лупа. Если сигнатура кидает вас в центр жирного switch-кейса — это оно.

Собственно, вопрос к местным гуру реверса: стоит ли дальше упарываться в динамический скан памяти или лучше все-таки попытаться реконструировать чистый статический дамп для анализа в IDA? Кто как сейчас фиксит волатильность AOB под Byfron и на что опираетесь — на строки или на графы функций?

Интересно узнать, как вы боретесь с постоянно меняющимися оффсетами в последних апдейтах.
сколько можна ти хоть раз боблокс реверсил мне кажетса тебе ии нареверсила
 
Главная проблема твоего подхода — Hyperion **мутирует не сам код, а его расположение и связи между функциями** через Scattered Mapping. AOB-сканер по динамическим регионам — путь к флагу, но рабочий, если делать правильно.

## Почему дампы в Гидре нулевые

Hyperion выгружает `.text` секцию после инициализации через `MmUnmapViewOfSection` + перезаписывает нулями. То, что ты видишь как "BYF\*.tmp" — это не сам Roblox, а сторожевой монитор.

**Реальный RobloxPlayerBeta.exe** загружается в память с флагом `SEC_IMAGE` только на время выполнения критических функций, после чего его образ удаляется из физической памяти, оставляя только исполняемые страницы без PE-заголовка.

## Динамический скан vs статический дамп

**Статический дамп не собрать** — PE не существует целиком в памяти никогда.

Твой метод (итерация RX + AOB) — правильный, но:

1. **Hyperion рандомизирует регионы** при каждом запуске. Те самые 13.5MB меняют свой базовый адрес.
2. **Сигнатуры нужно делать устойчивыми к мутации** — не по прямым байтам, а по опкодам с масками на регистры.

## Как сейчас фиксят (рабочий способ)

**Опирайся на строки + графы функций, а не на AOB**

Roblox не обфусцирует строковые литералы полностью. Найди уникальную строку (например `"luau_load"` или `"attempt to yield across C-call boundary"`) в памяти через `ZwQueryVirtualMemory` с паттерном `search by byte`. От строки бери XREF, получаешь адрес функции. Потом от нее линкуешь соседние функции через граф вызовов (call инструкции).

**Для твоих целей:**

| Что ищешь | Как найти |
|-----------|-----------|
| `luau_execute` | Найди строку `"attempt to call a nil value"` (рядом с ней вызов) |
| `lua_getfield` | Паттерн `48 8B 41 28 48 8B 40 20` — метод `lua_getfield` стартует с чтения field из таблицы |
| `identity offset` | В `lua_State` после `global_State` на +0x48 (стабильно на всех версиях 2025) |

`luau_gettop` ты уже нашел — это хорошо. От него иди вниз по коду на ~0x200 байт, там упрешься в `luau_execute`.

## Борьба с волатильностью AOB

**Не используй статические сигнатуры вида `FF 15 ?? ?? ?? ?? 48 8B D8`** — Hyperion инлайнит и перетасовывает коллы.

**Что работает:**
1. **Сигнатуры по уникальным инструкциям**, не меняющимся при мутации (например `xor eax, eax; ret` перед функцией)
2. **Поиск по паттерну без разыменования** — ищешь не точные байты, а относительные смещения (jump/call)
3. **Завязка на структуры** (VTables у Roblox стабильны — виртуальные таблицы не мутируются, только адреса)

## Самый надежный путь сейчас

Использовать **тайминг-атаку**: Hyperion загружает чистый образ Roblox на ~30-50 мс до запуска Scattered Mapper. Если успеваешь сделать дамп через драйвер в этот промежуток (hook на `NtMapViewOfSection` с задержкой), то получаешь полный PE с правильными оффсетами. Потом по нему строишь сигнатуры, которые будешь сканить уже после мутации.

TBH, текущие публичные читы под Roblox (2025) давно перешли на реконструкцию виртуальных таблиц через RTTI, а не на поиск функций по сигнатурам. RTTI (`RTTICompleteObjectLocator`) у Hyperion не тронут — это твой лучший друг для стабильных оффсетов.
 
Назад
Сверху Снизу