March 9, 2019

Записки реверсера #1 Часть 1. Знакомство с APK

Telegram: @VolfsChannel

Если бы у меня спросили, что я умею делать лучше всего, то я бы ответил, что лучше всего у меня получается пиздить идеи и код у других. Я не шучу.

Ну ладно, ок. С опенсорсными проектами понятно. А как же другие, те, что с закрытыми исходниками? Ведь так велик соблазн спиздить крутую фичу, которая есть в проприетарном аналоге, а ты и знать не знаешь как ее реализовать?

Тут-то на помощь и приходят декомпиляторы.

Давным-давно, когда вода была вкуснее, трава зеленее, а рубль был по 5000 рублей за доллар, вышла JDK 1.0. Язык Java, который должен был сгинуть на задворках истории ВНЕЗАПНО стал очень популярным среди мамкиных хакеров, в частности, из-за низкого порога вхождения, удобночитаемости, и возможности крутить свой байт-код на каком угодно дерьме.

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

Шли годы, комьюнити ширилось, и в далёком 2005 году молодой энтузиаст по имени Энди Рубин, пришел в Гугл, чтобы Ларри Пейдж и Сергей Брин выразили респект его операционке для видеокамер, которую он с командой создал за 2 года до этого. Но ВНЕЗАПНО вместо "press F to pay respect", ему предложили выкупить ОС за 130 миллионов вечнозелёных президентов. Неплохой такой подгон, правда?

Настал тот самый 2007 год. Стив Джобс ВНЕЗАПНО представил свой первый iPhone c iPhone OS, и Android также ВНЕЗАПНО стал усиленно перепиливаться под тачскрин. Итог мы знаем.

Telegram: @VolfsChannel

Ближе к делу, пёс

Т.к. Android был представлен в сентябре 2008 года, то основным языком программирования под эту платформу стала Java 6. На тот момент она была последней из доступных, и, справедливости ради, стоит заметить, что на ней до сих пор написан SDK. С языком понятно, а что внутри. Ведь приложение - это не только лишь код.

Для запуска Android приложений используется модифицированный runtime, так что мы не можем "просто взять и запустить jar файл" (хотя есть сторонние решения). Вместо этого нам предлагают использовать собственный формат файла - APK.

Т.к. APK файл представляет собой АРХИВ, то открыть его тем же WinRAR-ом не составит никакого труда.

В любом из существующих ныне APK-файлов мы увидим следующие папки и файлы:

/META-INF/ - подпись приложения

/res/ - ресурсы приложения (разметка/иконки/raw-файлы)

resources.arsc - строковые ресурсы/цвета/id/булевые значения

classes.dex - скомпилированный байт-код приложения. Этих файлов может быть больше чем 1, (classes.dex, classes2.dex, classes3.dex... classes100500.dex)

Расширение произошло от Dalvik EXecutable (Dalvik - виртуальная машина, использующаяся в Android вплоть до версии 5.0, в 5.0 заменена на ART)

AndroidManifest.xml - паспорт приложения. В нем описано, какое имя пакета имеет приложение, какие разрешения ему нужны для работы, какие уровни API оно поддерживает.

Опционально, могут встречаться следующие папки:

/assets/ - внешние raw-ресурсы приложения

/lib/ - скомпилированные нативные библиотеки

/kotlin/ - мета-дата KotlinCompiler

и так далее и тому подобное...

Telegram: @VolfsChannel

Компиляция

Декомпиляция Android-приложений отличается от аналогичного процесса на ПК. Dex файл получается путем обработки jar файла с классами утилитой dx. Коротко, процесс создания dex можно описать так:

Java Source Files -> Compile -> JAR -> Dexing JAR with DX -> Megring -> DEX

Если ничего непонятно, это не страшно, я сейчас всё объясню:

  • Исходный Java код компилируется в JAR с помощью утилиты javac
  • JAR файл обрабатывается утилитой dx
  • Получившийся dex мержится с dex файлами сторонних библиотек
  • Формируется конечный DEX

Telegram: @VolfsChannel

Декомпиляция

Мы разобрались с тем, как DEX файл формируется. Теперь подумаем, чисто логически, чтобы де-компилировать приложение, нужно повторить эти операции в обратном порядке.

Большинство декомпиляторов (за исключением JaDX) работают по следующему алгоритму:

DEX -> Dex2Jar -> JAR -> Decompile JAR -> Java Source Files

Т.е. в отличие от десктопных джарников, добавляется промежуточный шаг Dex2Jar, а потом всё идёт как и на десктопе.

О том, как правильно декомпилировать приложение, с чего начать, и как восстановить недекомпилированный код? Всё это ждите в следующих статьях.

Подписывайтесь!