- Статус
- Оффлайн
- Регистрация
- 18 Дек 2018
- Сообщения
- 352
- Реакции
- 94
Если что, заранее обобщил нейронкой весь свой поток мыслей, чтобы можно было прочитать.
Приветствую всех! Обращаюсь за помощью с проблемой динамической инструментации мобильной игры BLEACH: Soul Resonance на Android.
═══════════════════════════════════════════════════════════════════════════════
ТЕХНИЧЕСКАЯ ИНФОРМАЦИЯ ОБ ИГРЕ:
═══════════════════════════════════════════════════════════════════════════════
• Движок: Unity (версия неизвестна, но использует IL2CPP)
• Бэкенд компиляции: IL2CPP (AOT компиляция C# → C++ → нативный код)
• Скриптовый бэкенд: XLua (Lua интеграция для Unity)
• Платформа: Android (ARM64)
• Архитектура: Client-side prediction (игра полностью функциональна в оффлайн режиме - урон наносится, способности работают, энергия ультимативных способностей накапливается БЕЗ интернета)
• Защита: Анти-тампер/анти-хук система, детектирующая модификации IL2CPP кода
• Метаданные: global-metadata.dat (возможно зашифрован/обфусцирован)
• Библиотеки: libil2cpp.so, libxlua.so (или аналогичные)
═══════════════════════════════════════════════════════════════════════════════
ЦЕЛЬ ПРОЕКТА:
═══════════════════════════════════════════════════════════════════════════════
Идентификация и модификация критических игровых параметров (HP персонажа, наносимый урон) через динамическую инструментацию с использованием Frida, БЕЗ полного реверс-инжиниринга и статического анализа.
═══════════════════════════════════════════════════════════════════════════════
ИСПОЛЬЗУЕМЫЕ ИНСТРУМЕНТЫ:
═══════════════════════════════════════════════════════════════════════════════
• Frida (динамическая инструментация)
• frida-il2cpp-bridge (версия 0.10.0, так как 0.11.x нестабильна на Android 14)
• Python 3 (bleach_interceptor.py - консольное приложение для управления)
• Il2CppDumper (для получения dump.cs с картой классов/методов)
• ADB (Android Debug Bridge)
═══════════════════════════════════════════════════════════════════════════════
ПРОБЛЕМА #1: ACCESS VIOLATION 0x86 НА ANDROID 14
═══════════════════════════════════════════════════════════════════════════════
При работе с frida-il2cpp-bridge на Android 14 (ARM64) возникают критические ошибки:
"Error: access violation accessing 0x86"
Технические детали:
• Ошибка возникает при глубоком рефлекшене IL2CPP (Type.Enum, generics, virtualAddress)
• Связана с особенностями обработки указателей в ART (Android Runtime) и механизмом MTE (Memory Tagging Extension)
• frida-il2cpp-bridge 0.11.x некорректно интерпретирует некоторые указатели на метаданные как объекты JS
• Попытка разыменования невалидного адреса (0x86 - типичное смещение внутри vtable или структуры объекта)
Попытки решения:
✓ Даунгрейд библиотеки до версии 0.10.0 (частично помогло)
✓ Использование Process.setExceptionHandler для подавления некритичных ошибок
✓ Валидация адресов через isValidIl2CppAddress
✓ Обрезка блока "FINAL FULL DEBUG" из bridge
✗ Проблема остается частично - некоторые операции все еще вызывают падения
═══════════════════════════════════════════════════════════════════════════════
ПРОБЛЕМА #2: АНТИ-ТАМПЕР ЗАЩИТА ПРИ RVA-ХУКАХ
═══════════════════════════════════════════════════════════════════════════════
Попытка хукать боевые методы по RVA (Relative Virtual Address) из dump.cs приводит к:
"Error: unable to intercept function at 0x...; please file a bug"
Затем игра падает с:
"Bad access due to protection failure"
Технические детали:
• Анти-тампер/анти-хук защита детектирует патчи IL2CPP-кода (in-place hook)
• Страницы защищены (NX/RO) или поверх кода стоит anti-tamper, отслеживающий изменения кода
• При попытке патча даёт "protection failure" и падение Unity
• Проблемные RVA исключались, затем все RVA-хуки были отключены
Попытки решения:
✓ Исключение проблемных RVA из списка хуков
✓ Использование минимального количества хуков (1-2 вместо 30+)
✗ Массовое хуканье IL2CPP-методов по RVA напрямую ведёт к срабатыванию защиты
Вывод: Прямое патчирование IL2CPP-кода триггерит защиту. Нужны альтернативные подходы.
═══════════════════════════════════════════════════════════════════════════════
ПРОБЛЕМА #3: LUA СКРИПТЫ НЕ ПЕРЕХВАТЫВАЮТСЯ
═══════════════════════════════════════════════════════════════════════════════
Ключевое наблюдение: "Вся логика в Lua, а C# функции не вызываются напрямую во время боя"
и "Lua скрипты загружаются при старте игры, а не во время боя"
Попытки перехвата Lua:
1. XLua API хуки (LuaEnv.DoString, LuaEnv.LoadString):
• Найдены все XLua классы (438 классов!)
• Найден LuaEnv с методами DoString/LoadString
• Найдено 115 экземпляров LuaTable в памяти
• ✗ Методы НЕ вызываются во время боя (только при загрузке)
2. Нативные Lua C API хуки (luaL_loadbuffer, luaL_loadstring, lua_pcall, lua_getfield):
• Хуки установлены успешно
• ✗ При attach к уже идущему процессу - никакие luaL_load* не вызываются
• ✗ При spawn (ранняя инъекция) - перехватов все равно нет
• Вывод: либо скрипты грузятся только на старте игры, либо игра использует XLua-обвязку/байткод без стандартных luaL_* символов
3. Перехват загрузки файлов (GameUtility.SafeReadAllText, File.ReadAllText):
• Найден путь: damage_cfg_path = "damage_cfg.lua"
• ✗ Перехватов нет - файлы уже загружены или загружаются другим способом
4. Модификация загруженных Lua таблиц (LuaTable.Get/Set):
• ✗ Lua таблицы не доступны через LuaTable.Get/Set во время боя
═══════════════════════════════════════════════════════════════════════════════
ПРОБЛЕМА #4: MEMORY SCAN НАХОДИТ ТОЛЬКО UI-ЗНАЧЕНИЯ
═══════════════════════════════════════════════════════════════════════════════
Реализованы методы поиска в памяти (аналог Cheat Engine/GameGuardian):
• scanInt32 / refineInt32 / writeInt32
• scanFloat32 / refineFloat32 / writeFloat32
• Поиск в rw- диапазонах, лимит до 20000 совпадений
Результат:
✗ После refine остаётся 0 кандидатов
✗ Находятся только UI-значения (отображаемые на экране), а реальное HP хранится иначе
Вывод: HP/урон не хранится как простое значение в памяти (вероятно ObscuredFloat или сложная структура).
═══════════════════════════════════════════════════════════════════════════════
ПРОБЛЕМА #5: OBSCUREDFLOAT НЕ НАЙДЕН
═══════════════════════════════════════════════════════════════════════════════
Изучена структура CodeStage ACTk ObscuredFloat:
• currentCryptoKey (Int32) - ключ шифрования
• hiddenValue (Int32) - зашифрованное значение: hidden = BitConverter.ToInt32(realHP) XOR key
• fakeValue (Float) - ловушка (видимое значение)
• inited (Bool)
Реализовано:
• scanObscuredFloat - поиск структур по fakeValue
• writeObscuredFloat - правильная модификация через XOR
• scanGroup - поиск двух значений рядом (CurrentHP и MaxHP)
• scanPointers - поиск указателей на структуры
Результат:
✗ ObscuredFloat не находится
Вывод: Возможно, игра не использует CodeStage ACTk или защита реализована иначе.
═══════════════════════════════════════════════════════════════════════════════
ТЕКУЩИЙ ПОДХОД: IL2CPP.GC.CHOOSE АВТОПОИСК
═══════════════════════════════════════════════════════════════════════════════
После неудач с прямыми хуками и memory scan, перешли к использованию Il2Cpp.gc.choose:
• Автоматический поиск HP каждые 5 секунд
• Сначала проверка целевых классов (BaseEntity, CombatLogic, EntityManager)
• Если не найдено - итеративное сканирование всех классов в Assembly-CSharp (по 10 классов за раз)
• Для каждого объекта сканирование всех полей (не только по ключевым словам)
• Идентификация потенциальных HP-полей по имени (содержит "hp" или "health") или по значению в диапазоне 1-3000
Статус: Автопоиск запущен, результаты ожидаются.
═══════════════════════════════════════════════════════════════════════════════
АЛЬТЕРНАТИВНЫЕ ПОДХОДЫ (РАССМАТРИВАЕМ):
═══════════════════════════════════════════════════════════════════════════════
Вместо прямого изменения HP/урона, рассматриваем обход через:
1. Коллизии и хитбоксы:
• Хук OnTriggerEnter / OnCollisionEnter - игнорировать попадания
• Изменение gameObject.layer на "Ignore Raycast"
• Отключение CharacterController.enabled
• Physics.IgnoreCollision для персонажа и врагов
2. Увеличение скорости атаки (DPS hack):
• Модификация Time.timeScale
• Увеличение Animator.speed
• Уменьшение кулдаунов способностей
3. Визуальные эффекты урона:
• Умножение спавнов DamageText
• Модификация UI-элементов урона
═══════════════════════════════════════════════════════════════════════════════
ВОПРОСЫ К СООБЩЕСТВУ:
═══════════════════════════════════════════════════════════════════════════════
1. Как обойти Access Violation 0x86 на Android 14 при работе с frida-il2cpp-bridge?
Есть ли известные патчи или альтернативные подходы?
2. Как обойти анти-тампер защиту при хуках IL2CPP?
Можно ли безопасно патчить IL2CPP-код без триггера защиты?
3. Как перехватить Lua скрипты/вызовы, если они загружаются при старте игры?
Нужен ли более ранний spawn или есть другие методы?
4. Как найти HP/урон в памяти, если простой memory scan не работает?
Есть ли альтернативные методы поиска защищенных значений?
5. Является ли подход через Il2Cpp.gc.choose оптимальным?
Есть ли более эффективные методы поиска объектов в памяти?
6. Стоит ли переходить на альтернативные подходы (коллизии, скорость атаки)?
Или лучше продолжать поиск HP/урона?
7. Есть ли опыт работы с Unity IL2CPP + XLua играми?
Какие специфические техники работают в такой архитектуре?
═══════════════════════════════════════════════════════════════════════════════
ДОПОЛНИТЕЛЬНАЯ ИНФОРМАЦИЯ:
═══════════════════════════════════════════════════════════════════════════════
• Игра: BLEACH: Soul Resonance (Android)
• Процесс: BLEACH: Soul Resonance (PID меняется)
• Пакет: com.bleach.soulresonance (предположительно)
• Устройство: Android Emulator (Android 14, ARM64)
• Frida версия: последняя стабильная
• frida-il2cpp-bridge: 0.10.0 (из-за проблем с 0.11.x на Android 14)
Любая помощь, советы или опыт работы с подобными проблемами будут очень ценны!
Спасибо за внимание!
═══════════════════════════════════════════════════════════════════════════════
Приветствую всех! Обращаюсь за помощью с проблемой динамической инструментации мобильной игры BLEACH: Soul Resonance на Android.
═══════════════════════════════════════════════════════════════════════════════
ТЕХНИЧЕСКАЯ ИНФОРМАЦИЯ ОБ ИГРЕ:
═══════════════════════════════════════════════════════════════════════════════
• Движок: Unity (версия неизвестна, но использует IL2CPP)
• Бэкенд компиляции: IL2CPP (AOT компиляция C# → C++ → нативный код)
• Скриптовый бэкенд: XLua (Lua интеграция для Unity)
• Платформа: Android (ARM64)
• Архитектура: Client-side prediction (игра полностью функциональна в оффлайн режиме - урон наносится, способности работают, энергия ультимативных способностей накапливается БЕЗ интернета)
• Защита: Анти-тампер/анти-хук система, детектирующая модификации IL2CPP кода
• Метаданные: global-metadata.dat (возможно зашифрован/обфусцирован)
• Библиотеки: libil2cpp.so, libxlua.so (или аналогичные)
═══════════════════════════════════════════════════════════════════════════════
ЦЕЛЬ ПРОЕКТА:
═══════════════════════════════════════════════════════════════════════════════
Идентификация и модификация критических игровых параметров (HP персонажа, наносимый урон) через динамическую инструментацию с использованием Frida, БЕЗ полного реверс-инжиниринга и статического анализа.
═══════════════════════════════════════════════════════════════════════════════
ИСПОЛЬЗУЕМЫЕ ИНСТРУМЕНТЫ:
═══════════════════════════════════════════════════════════════════════════════
• Frida (динамическая инструментация)
• frida-il2cpp-bridge (версия 0.10.0, так как 0.11.x нестабильна на Android 14)
• Python 3 (bleach_interceptor.py - консольное приложение для управления)
• Il2CppDumper (для получения dump.cs с картой классов/методов)
• ADB (Android Debug Bridge)
═══════════════════════════════════════════════════════════════════════════════
ПРОБЛЕМА #1: ACCESS VIOLATION 0x86 НА ANDROID 14
═══════════════════════════════════════════════════════════════════════════════
При работе с frida-il2cpp-bridge на Android 14 (ARM64) возникают критические ошибки:
"Error: access violation accessing 0x86"
Технические детали:
• Ошибка возникает при глубоком рефлекшене IL2CPP (Type.Enum, generics, virtualAddress)
• Связана с особенностями обработки указателей в ART (Android Runtime) и механизмом MTE (Memory Tagging Extension)
• frida-il2cpp-bridge 0.11.x некорректно интерпретирует некоторые указатели на метаданные как объекты JS
• Попытка разыменования невалидного адреса (0x86 - типичное смещение внутри vtable или структуры объекта)
Попытки решения:
✓ Даунгрейд библиотеки до версии 0.10.0 (частично помогло)
✓ Использование Process.setExceptionHandler для подавления некритичных ошибок
✓ Валидация адресов через isValidIl2CppAddress
✓ Обрезка блока "FINAL FULL DEBUG" из bridge
✗ Проблема остается частично - некоторые операции все еще вызывают падения
═══════════════════════════════════════════════════════════════════════════════
ПРОБЛЕМА #2: АНТИ-ТАМПЕР ЗАЩИТА ПРИ RVA-ХУКАХ
═══════════════════════════════════════════════════════════════════════════════
Попытка хукать боевые методы по RVA (Relative Virtual Address) из dump.cs приводит к:
"Error: unable to intercept function at 0x...; please file a bug"
Затем игра падает с:
"Bad access due to protection failure"
Технические детали:
• Анти-тампер/анти-хук защита детектирует патчи IL2CPP-кода (in-place hook)
• Страницы защищены (NX/RO) или поверх кода стоит anti-tamper, отслеживающий изменения кода
• При попытке патча даёт "protection failure" и падение Unity
• Проблемные RVA исключались, затем все RVA-хуки были отключены
Попытки решения:
✓ Исключение проблемных RVA из списка хуков
✓ Использование минимального количества хуков (1-2 вместо 30+)
✗ Массовое хуканье IL2CPP-методов по RVA напрямую ведёт к срабатыванию защиты
Вывод: Прямое патчирование IL2CPP-кода триггерит защиту. Нужны альтернативные подходы.
═══════════════════════════════════════════════════════════════════════════════
ПРОБЛЕМА #3: LUA СКРИПТЫ НЕ ПЕРЕХВАТЫВАЮТСЯ
═══════════════════════════════════════════════════════════════════════════════
Ключевое наблюдение: "Вся логика в Lua, а C# функции не вызываются напрямую во время боя"
и "Lua скрипты загружаются при старте игры, а не во время боя"
Попытки перехвата Lua:
1. XLua API хуки (LuaEnv.DoString, LuaEnv.LoadString):
• Найдены все XLua классы (438 классов!)
• Найден LuaEnv с методами DoString/LoadString
• Найдено 115 экземпляров LuaTable в памяти
• ✗ Методы НЕ вызываются во время боя (только при загрузке)
2. Нативные Lua C API хуки (luaL_loadbuffer, luaL_loadstring, lua_pcall, lua_getfield):
• Хуки установлены успешно
• ✗ При attach к уже идущему процессу - никакие luaL_load* не вызываются
• ✗ При spawn (ранняя инъекция) - перехватов все равно нет
• Вывод: либо скрипты грузятся только на старте игры, либо игра использует XLua-обвязку/байткод без стандартных luaL_* символов
3. Перехват загрузки файлов (GameUtility.SafeReadAllText, File.ReadAllText):
• Найден путь: damage_cfg_path = "damage_cfg.lua"
• ✗ Перехватов нет - файлы уже загружены или загружаются другим способом
4. Модификация загруженных Lua таблиц (LuaTable.Get/Set):
• ✗ Lua таблицы не доступны через LuaTable.Get/Set во время боя
═══════════════════════════════════════════════════════════════════════════════
ПРОБЛЕМА #4: MEMORY SCAN НАХОДИТ ТОЛЬКО UI-ЗНАЧЕНИЯ
═══════════════════════════════════════════════════════════════════════════════
Реализованы методы поиска в памяти (аналог Cheat Engine/GameGuardian):
• scanInt32 / refineInt32 / writeInt32
• scanFloat32 / refineFloat32 / writeFloat32
• Поиск в rw- диапазонах, лимит до 20000 совпадений
Результат:
✗ После refine остаётся 0 кандидатов
✗ Находятся только UI-значения (отображаемые на экране), а реальное HP хранится иначе
Вывод: HP/урон не хранится как простое значение в памяти (вероятно ObscuredFloat или сложная структура).
═══════════════════════════════════════════════════════════════════════════════
ПРОБЛЕМА #5: OBSCUREDFLOAT НЕ НАЙДЕН
═══════════════════════════════════════════════════════════════════════════════
Изучена структура CodeStage ACTk ObscuredFloat:
• currentCryptoKey (Int32) - ключ шифрования
• hiddenValue (Int32) - зашифрованное значение: hidden = BitConverter.ToInt32(realHP) XOR key
• fakeValue (Float) - ловушка (видимое значение)
• inited (Bool)
Реализовано:
• scanObscuredFloat - поиск структур по fakeValue
• writeObscuredFloat - правильная модификация через XOR
• scanGroup - поиск двух значений рядом (CurrentHP и MaxHP)
• scanPointers - поиск указателей на структуры
Результат:
✗ ObscuredFloat не находится
Вывод: Возможно, игра не использует CodeStage ACTk или защита реализована иначе.
═══════════════════════════════════════════════════════════════════════════════
ТЕКУЩИЙ ПОДХОД: IL2CPP.GC.CHOOSE АВТОПОИСК
═══════════════════════════════════════════════════════════════════════════════
После неудач с прямыми хуками и memory scan, перешли к использованию Il2Cpp.gc.choose:
• Автоматический поиск HP каждые 5 секунд
• Сначала проверка целевых классов (BaseEntity, CombatLogic, EntityManager)
• Если не найдено - итеративное сканирование всех классов в Assembly-CSharp (по 10 классов за раз)
• Для каждого объекта сканирование всех полей (не только по ключевым словам)
• Идентификация потенциальных HP-полей по имени (содержит "hp" или "health") или по значению в диапазоне 1-3000
Статус: Автопоиск запущен, результаты ожидаются.
═══════════════════════════════════════════════════════════════════════════════
АЛЬТЕРНАТИВНЫЕ ПОДХОДЫ (РАССМАТРИВАЕМ):
═══════════════════════════════════════════════════════════════════════════════
Вместо прямого изменения HP/урона, рассматриваем обход через:
1. Коллизии и хитбоксы:
• Хук OnTriggerEnter / OnCollisionEnter - игнорировать попадания
• Изменение gameObject.layer на "Ignore Raycast"
• Отключение CharacterController.enabled
• Physics.IgnoreCollision для персонажа и врагов
2. Увеличение скорости атаки (DPS hack):
• Модификация Time.timeScale
• Увеличение Animator.speed
• Уменьшение кулдаунов способностей
3. Визуальные эффекты урона:
• Умножение спавнов DamageText
• Модификация UI-элементов урона
═══════════════════════════════════════════════════════════════════════════════
ВОПРОСЫ К СООБЩЕСТВУ:
═══════════════════════════════════════════════════════════════════════════════
1. Как обойти Access Violation 0x86 на Android 14 при работе с frida-il2cpp-bridge?
Есть ли известные патчи или альтернативные подходы?
2. Как обойти анти-тампер защиту при хуках IL2CPP?
Можно ли безопасно патчить IL2CPP-код без триггера защиты?
3. Как перехватить Lua скрипты/вызовы, если они загружаются при старте игры?
Нужен ли более ранний spawn или есть другие методы?
4. Как найти HP/урон в памяти, если простой memory scan не работает?
Есть ли альтернативные методы поиска защищенных значений?
5. Является ли подход через Il2Cpp.gc.choose оптимальным?
Есть ли более эффективные методы поиска объектов в памяти?
6. Стоит ли переходить на альтернативные подходы (коллизии, скорость атаки)?
Или лучше продолжать поиск HP/урона?
7. Есть ли опыт работы с Unity IL2CPP + XLua играми?
Какие специфические техники работают в такой архитектуре?
═══════════════════════════════════════════════════════════════════════════════
ДОПОЛНИТЕЛЬНАЯ ИНФОРМАЦИЯ:
═══════════════════════════════════════════════════════════════════════════════
• Игра: BLEACH: Soul Resonance (Android)
• Процесс: BLEACH: Soul Resonance (PID меняется)
• Пакет: com.bleach.soulresonance (предположительно)
• Устройство: Android Emulator (Android 14, ARM64)
• Frida версия: последняя стабильная
• frida-il2cpp-bridge: 0.10.0 (из-за проблем с 0.11.x на Android 14)
Любая помощь, советы или опыт работы с подобными проблемами будут очень ценны!
Спасибо за внимание!
═══════════════════════════════════════════════════════════════════════════════