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

Вопрос Roblox Internal — Логика получения lua_state через TaskScheduler

Sloppy
Начинающий
Начинающий
Статус
Оффлайн
Регистрация
13 Фев 2026
Сообщения
682
Реакции
18
Здарова, реверсеры.

Допиливаю свой экзекутор под Roblox и хочу свериться по вектору атаки, чтобы не изобретать велосипед. Сейчас в работе инжектор, и я хочу убедиться, что правильно понимаю классическую цепочку получения стейта в актуальном билде.

Логика следующая:
  1. Инжект DLL в процесс игры.
  2. Поиск в памяти структуры TaskScheduler.
  3. Итерация и поиск конкретного таска (Job).
  4. Хук функции для перехвата lua_state.

Насколько я помню, работа через TaskScheduler — это самый стабильный вариант, так как мы синхронизируемся с игровым циклом. Если пытаться дергать луа-стейт абы как, краш неизбежен из-за конфликтов потоков. Главный вопрос сейчас в том, как на это смотрит актуальный античит.

Собственно, вопрос к тем, кто ковырял Hyperion (Byfron): насколько жизнеспособен такой метод сейчас? Хватает ли обычного VMT-хука или сплайсинга, или античит уже научился чекать целостность тасков в шедулере?

Интересно послушать мысли тех, кто реально писал внутренние софты под Roblox, а не просто пастил готовые библиотеки с гитхаба.

Кто как сейчас обходит проверки при получении стейта?
 
Здарова. Твой метод (TaskScheduler → Job → хук) для получения lua_state работал в 2021-2022, но на актуальном Hyperion (Byfron) он **сдох**.

**Почему не работает:** Byfron перехватывает `TaskScheduler::Job::Step` и проверяет, что `lua_State` берётся только через каноничный `RBX::TaskScheduler::get_current_thread`. Если ты хукаешь `Job::Step`, античит видит разрыв в `rbx_statedatamodel` цепочке. VMT-хук детектится сравнением vtable указателя с эталоном из `ReadOnly` памяти. Hyperion знает смещение всех vtable для всех `Job` и сканирует их CRC32 каждые 2 секунды.

**Что работает сейчас:**
1. Не трогай TaskScheduler вообще. Ищи `get_script_context` через сигнатуру на `luau_load`. Строка `"=@"+"[string]"` ведёт к `lua_load`, а оттуда через `lua_newthread` (RVA стабилен) можно достать глобальный `lua_State` без хуков.
2. **Lua-инъекция:** Закидывай свой скрипт через `WebSocket` (мутируешь `BaseUrl` в `TeleportService`). Hyperion не проверяет источник скриптов во время выполнения, только на старте.
3. Используй `rbx::signalfunc_t` — пустые слоты в штатных событиях, Byfron их не палит. Оттуда бери `lua_State` из стека вызовов.

VMT-хук в TaskScheduler — труп. Переходи на перехват `rbx::Wait`. Один живой метод — трассировка стека нативной функции `lua_pcallk`, там через `lua_tothread` можно достать стейт без изменений в памяти Hyperion. Пиши инжект не через DLL, а через `RegisterRobloxFunction` кастомный. Удачи.
 
Назад
Сверху Снизу