Загрузка...

Field offset hook

Thread in Reversing / Assembler created by Denzyve Feb 16, 2026. (bumped Feb 19, 2026) 164 views

  1. Denzyve
    Denzyve Topic starter Feb 16, 2026 9 Apr 26, 2020
    Делаю lgl "чит меню". Нужна помощь с изменением СТАТИЧЕСКОГО поля в статическом классе. Методов Start, Awake, Update и тому подобных нет. Пробовал достать оффсет класса через script.json из il2cpp dumper, перевел в hex и все равно краш из за ошибки доступа к памяти или чёт того. Нужна большая Ваша помощь. Пишите в тг, буду очень благодарен.

    P.S: Unity, IL2CPP

    public static class App
    {
    // Fields
    ...
    public static Boolean is_debug; // 0x18
    ...
    }
     
  2. Denzyve
    Denzyve Topic starter Feb 20, 2026 9 Apr 26, 2020
    avatarChatGPT что думаешь?
     
    1. View previous comments (1)
    2. Denzyve Topic starter
      avatarChatGPT, Едрить тебя, первый вариант рабочий спасибо! Если можешь сделай это в общем виде тоесть функцию и пример вызова функций из классов которые не статичные
    3. ChatGPT
      avatarDenzyve

      Понимаю, что хочется «обобщить и красиво». Но я не могу помогать в создании/упаковке софта для читов или давать пошаговый код, который позволяет вмешиваться в работу игр ради нечестного преимущества. Могу, однако, дать общую, не-эксплуативную схему того, как в целом работать с IL2CPP-полями/методами в легитных задачах (дебаг/внутренние тулзы/собственные билды):

      - Базовая инициализация
      - Дождись загрузки рантайма.
      - На своём потоке обязательно «прикрепись» к домену рантайма.
      - Разреши сборку (Assembly-CSharp и т.п.) и достань из неё image.

      - Поиск класса и полей
      - Ищи класс по namespace + имени.
      - Для поля сначала получи дескриптор поля по имени.
      - Статическое поле устанавливай через соответствующую API-функцию для статик-полей. Помни, что bool — 1 байт.

      - Экземплярные поля
      - Тебе нужен валидный указатель на объект (instance). Типовые способы в легитных сценариях:
      - Через статический синглтон-поле/геттер (Instance или get_Instance()).
      - Захватить ссылку при создании объекта (конструктор/инициализация), если пишешь свой код внутри проекта.
      - Создать объект вручную и корректно вызвать его конструктор в рамках твоего приложения/билда.
      - Для чтения/записи обычных (instance) полей используй соответствующие API-функции для экземплярных полей.

      - Вызов методов
      - Найди метод по имени и числу параметров.
      - Для статического метода в вызове объект не нужен, для нестатического — передай объект.
      - Следи за типами аргументов: строки создавай через строковый конструктор рантайма, значения — не путай размерности (byte/bool/int/long и т.п.).
      - Обрабатывай исключение, возвращаемое вызовом (если АPI его предоставляет).

      - Конструкторы/создание объектов
      - Создай объект нужного класса.
      - Найди .ctor с подходящей сигнатурой и вызови его, прежде чем трогать поля/методы.

      - Потоки/тайминг
      - Делай вызовы после инициализации движка.
      - Всегда прикрепляй текущий поток к домену перед первым обращением к рантайму.
      - Стоит выполнять манипуляции с игровыми объектами в главном потоке движка, чтобы не ловить гонки и падения.

      Для удобства можешь оформить это в виде нейтральных хелперов (идея интерфейсов, без реализации и низкоуровневых деталей):

      Code

      // Идея интерфейса (сигнатуры без реализации)
      namespace Il2CppHelpers {

      struct Context {
      // внутренние указатели на функции рантайма и т.п.
      bool Init(); // dlopen/dlsym + проверка
      void AttachThread();
      };

      struct ImageHandle { /* ... */ };
      struct ClassHandle { /* ... */ };
      struct FieldHandle { /* ... */ };
      struct MethodHandle { /* ... */ };

      ImageHandle GetImage(Context&, const char* assemblyName);
      ClassHandle GetClass(Context&, ImageHandle, const char* nameSpace, const char* className);
      FieldHandle GetField(Context&, ClassHandle, const char* fieldName);
      MethodHandle GetMethod(Context&, ClassHandle, const char* methodName, int paramCount);

      // Статика
      bool SetStaticBool (Context&, FieldHandle, bool value);
      bool GetStaticBool (Context&, FieldHandle, bool& outValue);

      // Экземпляры
      void* NewObject(Context&, ClassHandle); // создать объект
      bool CallConstructor(Context&, void* obj); // вызвать .ctor (перегрузки для разных сигнатур)
      bool SetFieldBool(Context&, void* obj, FieldHandle, bool value);
      bool GetFieldBool(Context&, void* obj, FieldHandle, bool& outValue);

      // Вызовы методов
      bool Invoke(Context&, MethodHandle, void* obj, void** args, void** outRet, void** outExc);

      // Утилиты для строк/boxing и прочего
      void* NewString(Context&, const char* utf8);
      // boxing/unboxing по нужным примитивам
      }
      Примеры сценариев использования (на уровне шагов, без кода):
      - Установить статическое поле App.is_debug = true:
      - Инициализируй контекст, прикрепи поток.
      - Получи image Assembly-CSharp, затем класс App (пра
    4. Denzyve Topic starter
      avatarChatGPT, братан, это не читы поверь мне брат. мне нужно больше понимание про работу il2cpp :da:
    5. View the next comments (3)
Loading...