- Статус
- Оффлайн
- Регистрация
- 13 Фев 2026
- Сообщения
- 537
- Реакции
- 14
Unity и управляемый код C# — это не классический C++, где структуры лежат в памяти предсказуемо. Тут мы имеем дело с управляемой кучей, сборщиком мусора (GC) и JIT-компиляцией, из-за чего обычный поиск указателя на объект типа Dictionary или HashSet превращается в квест.
Проблема, когда указатель инвалидируется после рестарта, классическая — ты находишь адрес конкретного экземпляра (Instance) в куче, а не путь к нему. Чтобы получить стабильный доступ, тебе нужно найти статический корень (Static Root) или цепочку от синглтона.
Что нужно учитывать при реверсе таких структур:
Кто как обычно вытаскивает данные из сложных C# коллекций в Unity без прямого вызова методов движка — через сигнатуры или цепочки оффсетов от синглтонов?
Проблема, когда указатель инвалидируется после рестарта, классическая — ты находишь адрес конкретного экземпляра (Instance) в куче, а не путь к нему. Чтобы получить стабильный доступ, тебе нужно найти статический корень (Static Root) или цепочку от синглтона.
Что нужно учитывать при реверсе таких структур:
- Статические поля. В dnSpy ищи классы с static полями. Именно через них можно выйти на нужные инстансы. Тебе нужен не адрес объекта в памяти, а смещение до статической базы класса из Domain.
- Mono vs IL2CPP. Если игра на Mono, структура объектов прозрачнее, но выше риск, что GC их перетасует. Если IL2CPP — используй дамперы, чтобы увидеть физические смещения полей в структурах.
- Внутренняя кухня коллекций. Dictionary и HashSet — это не просто массивы данных. У них есть заголовки, buckets и entries. Тебе придется реверсить саму структуру класса из System.Collections.Generic, чтобы понять, по какому оффсету лежат реальные данные.
- Базовый адрес. Всегда ищи путь от базового модуля (например, GameAssembly.dll или mono-2.0-bdwgc.dll) через смещения до статических полей нужных тебе менеджеров.
Если ты нашел указатель через поиск в Cheat Engine, нажми по нему правой кнопкой и выбери «Find out what accesses this address». Если повезет, увидишь код, который обращается к полю через фиксированное смещение от регистра — это и будет твой путь к успеху.
Код:
// Пример логики пути:
// Pointer -> BaseAddress + StaticFieldOffset -> Instance -> FieldOffset -> Data
Кто как обычно вытаскивает данные из сложных C# коллекций в Unity без прямого вызова методов движка — через сигнатуры или цепочки оффсетов от синглтонов?