Файлы Odex, что это такое

Обновлено: 25.06.2024

Практически каждый сталкивался с проблемами открытия неизвестных файлов при работе на компьютере. Это может быть очень неприятно. Однако такие проблемы, причем не только с файлами ODEX, можно решить стандартным способом. Следуйте инструкциям ниже, и мы можем гарантировать, что ваша проблема с открытием ODEX будет решена!

  1. 1. Расширение файла ODEX
  2. 2. Что такое (n) файл ODEX?
  3. 3. Как открыть файл ODEX?
    1. 3.1 Загрузите и установите приложение, поддерживающее файлы ODEX
      1. 3.1.1 Программы, поддерживающие файлы ODEX

      Расширение файла ODEX

      • Тип файла Google Android Optimized Executalbe
      • Разработчик файлов Google Inc.
      • Категория файлов: исполняемые файлы
      • Рейтинг популярности файла

      Что такое файл ODEX?

      Расширение ODEX используется файлами, целью которых является ускорение процесса запуска приложений в операционной системе Android. Файлы присваиваются APK-файлам и содержат код, оптимизированный для конкретного устройства, что значительно ускоряет процесс загрузки приложения.

      Как открыть файл ODEX?

      Если данная учетная запись пользователя не имеет необходимых разрешений для открытия файлов с расширением ODEX, весьма вероятно, что в системе пользователей не установлена ​​программа, поддерживающая данные файлы. Ниже приведен список действий, которые должен предпринять пользователь для решения наиболее распространенных проблем.

      Шаг 1. Загрузите и установите приложение, поддерживающее файлы ODEX

      После установки приложения система должна автоматически открывать файлы ODEX с данным приложением. Ниже приведен список соответствующих программ вместе с операционными системами, для которых они доступны:

      Программы, поддерживающие файлы ODEX

      Окна

      Андроид

      Шаг 2. Проверьте, связаны ли файлы ODEX с соответствующим программным обеспечением

      Возможно, приложение, поддерживающее файлы ODEX, не связано с такими файлами. В таком случае программа должна вручную связать файлы ODEX (щелкните правой кнопкой мыши значок файла → СвойстваВкладка «Общие» → В подменю «Открыть с помощью» и нажмите кнопку "Изменить". Система отобразит список предлагаемых программ, поддерживающих файлы ODEX. Выберите приложение, установив флажок "Всегда использовать выбранное приложение для открытия файлы такого типа". Система сохранит эту информацию в своем реестре и будет использовать ее для открытия файлов ODEX с помощью выбранной программы.

      Изменение ассоциации файлов ODEX в реестре

      Ассоциацию файлов для файлов ODEX можно отредактировать вручную, отредактировав соответствующую запись в системном реестре Windows. Однако это не рекомендуется, так как может привести к ошибкам в реестре, если не будет выполнено должным образом, и может даже повредить систему.

      Файлы с расширением .ODEX используются устройствами под управлением операционной системы Android, разработанной Google. Файлы ODEX предназначены для оптимизации производительности устройства за счет ускорения процессов загрузки данных APK.

      Файлы ODEX работают только на том устройстве, на котором они были созданы. Предыдущая версия формата файла ODEX, обозначенная как DEX, не имела этого ограничения. Файлы ODEX управляются виртуальной машиной Dalvik.

      Программы, которые могут открыть файл .ODEX

      Окна
      Андроид

      Как открыть файлы ODEX

      Если появилась ситуация, в которой Вы не можете открыть файл ODEX на своем компьютере - причин может быть несколько. Первой и одновременно самой важной (встречается чаще всего) является отсутствие соответствующей аппликации обслуживающей ODEX среди установленных на Вашем компьютере.

      Очень простой способ решить эту проблему — найти и загрузить соответствующее приложение. Первая часть задачи уже выполнена — программное обеспечение, поддерживающее файл ODEX, можно найти в таблице. Теперь просто скачайте и установите соответствующее приложение.

      Возможные проблемы с файлами формата ODEX

      Невозможность открытия файла ODEX и работы с ним не обязательно означает, что на вашем компьютере не установлено соответствующее программное обеспечение. Могут быть и другие проблемы, которые также блокируют нашу способность работать с оптимизированным исполняемым файлом Google Android. Ниже приведен список возможных проблем.

      • Повреждение открываемого файла ODEX
      • Неверные ссылки на файл ODEX в записях реестра.
      • Случайное удаление описания расширения ODEX из реестра Windows.
      • Неполная установка приложения, поддерживающего формат ODEX
      • Открываемый файл ODEX инфицирован нежелательным, вредным программным обеспечением.
      • На компьютере недостаточно аппаратных ресурсов, чтобы открыть файл ODEX.
      • Драйверы оборудования, используемого компьютером для открытия файла ODEX, устарели.

      Если вы уверены, что всех этих причин в вашем случае не существует (или они уже устранены), файл ODEX должен без проблем работать с вашими программами. Если проблема с файлом ODEX все-таки не решена, это может значить, что в этом случае появилась другая, редкая проблема с файлом ODEX. В этом случае единственное, что вы можете сделать, это обратиться за помощью к профессиональным сотрудникам.

      В этом руководстве представлены форматы Android, а также API для их использования. Речь идет о DEX, OAT, VDEX и ART.

      Файлы, используемые в этом руководстве, доступны в репозитории учебных пособий

      Ромен Томас - @rh0main

      Введение¶

      Начнем с краткого напоминания об компиляции, установке и выполнении приложений Android.

      При разработке приложений основная часть кода обычно пишется на Java. Разработчики также могут писать собственный код ( C/C++ ) через интерфейс Java Native Interface (JNI).

      В процессе сборки APK код Java в конечном итоге преобразуется в байт-код Dalvik, который интерпретируется виртуальной машиной Android Java. JVM для Android отличается от реализации Oracle, и среди отличий она основана на регистрах, тогда как виртуальная машина Oracle основана на стеке.

      Для создания байт-кода Dalvik исходные коды Java сначала компилируются с помощью javac в байт-код Java, а затем Android преобразует этот байт-код в байт-код Dalvik с помощью компилятора dx (или нового: D8). Этот байт-код, наконец, завернут в файл(ы) DEX, такой как class.dex . Формат DEX специфичен для Android, и документация доступна здесь.

      Во время установки APK система применяет оптимизацию к этому файлу DEX, чтобы ускорить выполнение. Действительно, интерпретация байт-кода не так эффективна, как выполнение собственного кода, а виртуальная машина Dalvik основана на регистрах с шириной 32 бита, тогда как большинство современных ЦП имеют ширину 64 бита.

      Чтобы решить эту проблему, до Android 4.4 (KitKat) среда выполнения использовала JIT-компиляцию для преобразования байт-кода Dalvik в сборку. JIT происходил во время выполнения и выполнялся каждый раз при выполнении приложения. Начиная с Android 4.4 они перешли на новую среду выполнения, которая, помимо других функций, выполняет оптимизацию во время установки. Следовательно, установка занимает больше времени, но преобразование в собственный код выполняется один раз.

      Это формат по умолчанию, используемый Linux и Android для упаковки ассемблерного кода.

      Это позволяет использовать тот же загрузчик: /system/bin/linker

      Файлы OAT на самом деле являются файлами ELF, поэтому мы решили добавить этот новый формат в LIEF. Этот формат ELF на самом деле используется в качестве оболочки поверх другого формата, специфичного для Android: формата OAT.

      В основном связанный с ELF экспортирует несколько символов:

      Эти разные форматы могут немного сбивать с толку, и если подытожить:

      DEX преобразуются в файлы .odex, которые в основном представляют собой файлы ELF, заключенные в пользовательский формат OAT.

      Структура OAT плохо документирована, а ее внутренние структуры меняются для каждой версии Android без обратной совместимости. Это означает, что файлы OAT, созданные на Android 6.0.1, можно использовать только в этой версии.

      В платформе Android исполняемый файл dex2oat отвечает за преобразование и оптимизацию файлов APK DEX в OAT. Этот исполняемый файл находится в каталоге /system/bin/, и мы можем получить его вывод через logcat:

      Вышеприведенный результат представляет собой преобразование файлов SaftyNet DEX, расположенных в /data/user/0/com.google.android.gms/snet/installed/snet.jar , в OAT, сохраненный в /data/user/0. /com.google.android.gms/snet/dalvik-cache/snet.dex .

      Можно заметить, что расширение .dex, поэтому это должен быть файл DEX, а не OAT. На самом деле, если мы проверим тип:

      Мы видим эльфа.

      Не доверяйте расширениям: .dex может быть DEX или OAT, .odex – OAT, .oat – OAT, …

      Процесс преобразования исходного кода Java в OAT можно упростить с помощью следующей схемы:

      Недостающий DEX¶

      Если мы анализируем приложения из Google PlayStore, у нас обычно есть файлы class.dex в APK. Поскольку этот файл содержит байт-код Dalvik, большинство инструментов используют этот файл для выполнения анализа (декомпиляции, статического анализа и т. д.)

      Просматривая файлы в SecSettings2.apk, мы не можем найти файлы .dex:

      Рядом с SecSettings2.apk мы находим SecSettings2.odex, который представляет собой файл OAT, полученный в результате оптимизации отсутствующего файла DEX. Поскольку разработчики ПЗУ контролируют версию Android и целевую архитектуру, им достаточно предоставить файл OAT.

      Они также могут использовать эту "функцию", чтобы избежать анализа и обратного проектирования приложения. Поскольку байт-код Dalvik находится в файле DEX, без этого файла анализ весьма ограничен.

      К счастью, в OAT есть копия оригинального DEX! На самом деле это не точная копия, так как dex2oat заменяет некоторые инструкции Dalvik (например, invoke-virtual) на оптимизированные 1, но, начиная с Android N, мы также можем восстановить исходные инструкции.

      classes.odex: OAT, содержащий собственный код

      Файлы DEX, изначально находившиеся в OAT, были экспортированы в новый файл с новым форматом: формат VDEX. Этот новый формат полностью отличается от OAT, особенно это не ELF.

      Подобно формату OAT, внутренние структуры VDEX меняются для каждой версии Android без обратной совместимости.

      Также существуют инструменты 4, 5, 6 для извлечения DEX из файлов OAT/VDEX, но извлечение 3 ограничено либо OAT 4, либо VDEX 5. С помощью LIEF мы стремимся предоставить единую структуру для работы с этими форматами.

      ОАТ и VDEX¶

      Как объяснялось в предыдущей части, внутренняя структура форматов меняется для каждой версии Android. LIEF обеспечивает абстракцию этих модификаций, и пользователь может работать с OAT или VDEX без использования базовой версии OAT.

      В настоящее время он поддерживает файлы OAT от Android 6.0 Marshmallow (OAT v64) до Android 8.0.1 Oreo (OAT v131).

      Версия OAT доступна с помощью функции lief.OAT.version():

      Можно также получить доступ к соответствующей версии Android с помощью функции lief.OAT.android_version() :

      Чтобы выразить тот факт, что файлы OAT являются первыми файлами ELF, класс Lief.OAT.Binary расширяет класс Lief.ELF.Binary

      Таким образом, доступен тот же ELF API: добавление разделов, изменение динамических записей и т. д., а объект lief.OAT.Binary добавляет следующие методы: класс lief.OAT. Бинарный

      Двоичное представление OAT

      Вернуть итератор по классу

      свойство dex2dex_json_info свойство dex_files

      Вернуть итератор для файла

      get_class ( * args , ** kwargs )

      Вернуть класс по его имени

      Вернуть класс из его индекса

      Проверить, присутствует ли класс с заданным именем в текущем двоичном файле OAT

      класс it_classes класс it_dex_files класс it_methods класс it_oat_dex_files свойство методы

      Вернуть итератор по методу

      Возвращает итератор по DexFile

      Если данный OAT нацелен на Android Marshmallow или Nougat (6 или 7), то файлы DEX можно получить с помощью атрибута lief.OAT.Binary.dex_files:

      Из приведенного выше кода файл lief.DEX.File извлечен в /tmp/classes.dex (с деоптимизацией).

      Если данный OAT предназначен для Android Oreo или выше, извлечение выполняется с использованием файла VDEX. Функция lief.OAT.parse() принимает файл OAT или файл OAT и файл VDEX. При предоставлении файла VDEX во втором параметре объект lief.OAT.Binary будет иметь те же функции, что и объект OAT до Oreo.

      Если файл VDEX не предоставлен, то в файле lief.OAT.Binary будет ограниченная информация:

      Мы также можем напрямую использовать модуль VDEX LIEF:

      Поскольку формат VDEX полностью отличается от форматов OAT, ELF, PE и Mach-O, синтаксический анализатор VDEX создает объект lief.VDEX.File, а не двоичный файл . Мы также можем извлекать файлы DEX с атрибутом lief.VDEX.File.dex_files:

      Предыдущая часть была посвящена форматам OAT/VDEX и доступу к базовому DEX. В этой части представлен основной API для объекта lief.DEX.File.

      Модуль LIEF DEX позволяет получить информацию о коде Java, такую ​​как String, имя класса, байт-коды dalvik и т. д.

      Поскольку проект LIEF ориентирован только на форматы, в модуле DEX не будет дизассемблера Dalvik.

      Основной API для файла DEX находится в объекте lief.DEX.File. Этот объект можно создать с помощью:

      • lief.OAT.Binary.dex_files

      • lief.VDEX.File.dex_files

      • lief.DEX.parse()

      После создания мы можем получить доступ к строкам с помощью атрибута lief.DEX.File.strings:

      Аналогичным образом методы и классы доступны с атрибутами lief.DEX.File.classes/lief.DEX.File.methods:

      В формате файла DEX есть специальный атрибут для классов, которые регистрируют исходное имя исходного файла: source_file_idx. Некоторые обфускаторы искажают классы, но сохраняют этот атрибут! Поскольку имена исходных файлов Java связаны с именами классов, мы можем легко восстановить деобфускированное имя, используя:

      • lief.DEX.Class.source_filename

      • lief.DEX.Class.pretty_name

      ART — это название среды выполнения Android, но это еще и формат! Этот формат используется в целях оптимизации платформой Android.

      При создании экземпляра нового класса Java создается зеркальный объект C++ (выделение памяти, вызов конструкторов и т. д.), а JVM обрабатывает ссылку на этот объект C++.Чтобы ускорить процесс загрузки и избежать создания экземпляров хорошо известных классов 2 при каждой загрузке, Android использует формат ART для хранения экземпляров объектов C++. Для упрощения его можно рассматривать как дамп кучи объектов C++.

      Так же, как OAT и VDEX, внутренняя структура этого формата меняется для каждой версии Android.

      LIEF 0.9 имеет очень базовую поддержку этого формата и предоставляет только ART LIEF.ART.Header . Основной API доступен в объекте lief.ART.File.

      последнее слово¶

      LIEF 0.9 только для чтения в этих форматах, но последующие версии должны позволять изменять их (добавлять методы, изменять имена, исправлять контрольную сумму и т. д.)

      Обычно из Android Framework

      У них есть и другие полезные функции, такие как дизассемблер, псевдокод и т. д., которых нет в LIEF

      Меня, как новичка в Android, больше всего беспокоила терминология, которую я не понимал. Не имея опыта работы с Linux, стало трудно идти в ногу с очень часто используемыми словами, распространенными в сообществе разработчиков. Точно так же, поскольку я не понимал терминов, следовательно, я не мог определить, было ли что-то полезно для меня или нет. Судя по тому, что я видел, эта проблема затрагивает многих начинающих и даже обычных пользователей.

      Одним из часто встречающихся слов при игре с пользовательскими ПЗУ, прошивками и даже темами является деодексация и одексация. Большинство пользователей не понимают, что на самом деле означают эти термины, и хотя разработчики снова и снова хвастаются тем, что их темы и ПЗУ деодексированы, обычный пользователь остается в неведении относительно того, что происходит.

      ЧТО ТАКОЕ ФАЙЛ ODEX?

      В файловой системе Android приложения поставляются в виде пакетов с расширением .apk. Эти пакеты приложений или APK содержат определенные файлы .odex, предполагаемая функция которых заключается в экономии места. Эти файлы «odex» на самом деле представляют собой наборы частей приложения, которые оптимизируются перед загрузкой. Это ускоряет процесс загрузки, поскольку предварительно загружает часть приложения. С другой стороны, это также затрудняет взлом этих приложений, поскольку часть кода уже была извлечена в другое место перед выполнением.

      ЗАТЕМ ДЕОДЕКС

      Деодексация — это, по сути, переупаковка этих APK-файлов определенным образом, так что они снова собираются в файлы class.dex. При этом все части пакета приложения снова собираются в одном месте, что избавляет от беспокойства о том, что измененный APK-файл конфликтует с некоторыми отдельными одексированными частями.

      Подводя итог, деодексированные ПЗУ (или APK) содержат все пакеты приложений, собранные в одном месте, что позволяет легко модифицировать их, например, создавать темы. Поскольку никакие фрагменты кода не поступают из какого-либо внешнего источника, пользовательские ПЗУ или APK всегда деодексируются для обеспечения целостности.

      Для самых продвинутых: в ОС Android используется виртуальная машина на основе Java для запуска приложений, которая называется Dalvik Virtual Machine. Деодексированный файл или файл .dex содержит кеш, используемый этой виртуальной машиной (называемый Dalvik-кэшем) для программы, и он хранится внутри APK. Файл .odex, с другой стороны, представляет собой оптимизированную версию того же файла .dex, который хранится рядом с APK, а не внутри него. Android применяет этот метод по умолчанию ко всем системным приложениям.

      Теперь, когда загружается система на базе Android, кэш davlik для виртуальной машины Davlik строится с использованием этих файлов .odex, что позволяет ОС заранее узнать, какие приложения будут загружены, и, таким образом, ускорить процесс загрузки.

      Деодексируя эти APK, разработчик фактически помещает файлы .odex обратно в соответствующие пакеты APK. Поскольку весь код теперь содержится в самом APK, становится возможным изменять любой пакет приложения, не конфликтуя со средой выполнения операционной системы.

      Преимущество деодексации заключается в возможности модификации. Это наиболее широко используется в пользовательских ПЗУ и темах. Разработчик, создающий пользовательское ПЗУ, почти всегда сначала выберет деодексацию пакета ПЗУ, поскольку это не только позволит ему модифицировать различные APK, но и оставит место для тем после установки.

      С другой стороны, поскольку файлы .odex должны были быстро создавать кеш dalvik, их удаление означало бы увеличение времени начальной загрузки. Однако это верно только для первой загрузки после деодексации, поскольку кеш все равно будет создаваться с течением времени по мере использования приложений. Более длительное время загрузки может снова наблюдаться только в том случае, если кэш dalvik по какой-либо причине был стерт.

      Для обычного пользователя главное значение имеют возможности оформления. Темы для Android также поставляются в виде APK-файлов, и если вы хотите изменить какой-либо из них, вам всегда следует выбирать пользовательское ПЗУ без декодирования.

      Была ли эта статья полезной? Если вас смущают какие-то другие термины и вы хотите, чтобы мы помогли их объяснить, сообщите нам об этом в комментариях.

      Читайте также: