Reverse engineering. Урок 1. Вводная часть

Reverse engineering. Урок 1. Вводная часть

Jolly Joy

Введение:

Reverse engineering - обратная разработка или же обратное проектирование. Уверен, что это вам ни о чем не говорит, но именно этому я постараюсь научить. как бы странно это не звучало.
Простыми словами - это декомпиляция программы и ее компиляция. Что это такое - объясню чуть позже. Впредь весь этот процесс я буду называть реверсом для удобства. В нашем деле важно понимать логику того, как это устроено. Если вы знаете математику, но с логикой у вас так себе, то Вам будет крайне тяжело понять, о чем идет речь.

Термины

Есть несколько основных терминов, которые вам будут нужны в дальнейшем:
Декомпиляция - разбор приложения (или же программы, но мы будем рассматривать APK) каким-либо инструментом. APK файл представляет собой ZIP архив, который можно легко открыть с помощью того же winrar, но проблемно будет собрать обратно - это называется компиляция
Компиляция - сборка приложения. Компилятор собирает ваше приложение из множества папок в APK (исходников).
Компилятор - программа, которая собирает приложение из его исходников. Примером может служить apktool (Mac/windows (и вроде на Linux тоже есть)) или же BatchApkTool (это не совсем компилятор, скорее инструмент для работы с APK)
Исходники - исходные файлы APK - байт код (smali), разметка (Layouts), графика (drawable) и т.д
Логи - если объяснить максимально просто, то это строки, которые показывают, что сейчас происходит с апк или системой. С их помощью можно узнать почему приложение крашнуло, а так же вывести в них какую-либо информацию
Подпись - META-INF - это как бы описание вашего файла. Подпись содержит в себе MD5-суммы всех пакетов и если хотя бы 1 байт информации изменить в apk, то подпись сломается и придется подписывать заново. С свое время подпись я себе представлял так:

Инструменты

Для реверса большинство используют ApkTool - небольшая программа, которая разбирает и собирает ваш APK. Сам APKTool не имеет графической оболочки, но зато есть BatchApkTool
Atom - текстовый редактор. На его месте может быть любой, но этот мне нравится больше всего (много плагинов, хорошо выглядит и т.д)
BatchApkTool - утилита для перекомпиляции файлов. Заметьте - это не сам компилятор, это утилита, которая с помощью компилятора (ApkTool) собирает и разбирает ваш файл.
Т.к все дальнейшие действия я буду показывать на Windows, то использовать мы будем именно BatchApkTool. Скачиваем, распаковываем и заходим в саму папку. Перед вами будут 4 основные папки:

INPUT_APK - сюда вы будете класть свой apk, тот, который хотите разобрать

INPUT_JAR - папка, которая тоже важная, но использовать мы ее не будем, т.к в большинстве случаев она нужна при декомпиляции системных файлов
OUT_APK - папка, в которой будет лежать скомпилированный файл. Файл, который соберется из ваших исходников
OUT_JAR - тоже пока ее не трогаем, можно даже забыть про нее

Сам BatchApkTool:

Основные пункты, которыми мы будем пользоваться - 81 (выбрать файл, который вы хотите разобрать), 1 (разобрать файл, который вы выбрали 81-ым пунктом), 3 (собрать файл, который вы разобрали 1-ым пунктом), 11 (установить apk, который вы собрали 3-ым пунктом. Для этого в настройках телефона должна быть включена отладка по USB), 18 (снятие логов приложения на случай, если оно упадет)
Так же отмечу тот самый компилятор - 85 пункт, его можно не трогать, просто для справки

Внутренности

Когда вы декомпилируете apk, у вас будут следующие папки в папке INPUT_APK: • Сама папка (имеет название apk, но это папка, то есть будет 2 одинаковых названия)
Исходники в папке

Разберем по порядку каждый пункт:
assets - вспомогательная папка (не обязательная, но удалять не стоит) - в ней лежат шрифты, эмодзи (в случае с вк) и другие штуки
build - папка, которая нам не нужна, но это не значит, что ее можно удалять, она для BatchApkTool, с нее он собирает файл
lib - библиотеки приложения. Если проще, то бывают разные телефоны - с процессорами intel (x86) и snapdragon (arm 64), зачастую для каждого делаются библиотеки, которые много весят, их можно удалить (ту архитектуру, которая не используется, например, х86). Но не всегда это могут быть именно для процессоров, иногда это могут быть для самого приложения, скажем так, поэтому с ними надо быть аккуратными
original - тоже папка для BatchApkTool, в которой лежит еще папка - META_INF, про которую я говорил ранее. Запомните - в ней должно быть 3 основных файла - CERT.RSA, CERT.SF и MANIFEST.MF, все остальное можно смело удалять - это мусор, но главное эти 3 файла не трогать
P.S. Иногда название первых двух может быть другое, но главное, чтобы расширения были такие
res - одно из самых интересных мест. В этой папке лежат графика, разметка (макет экранов приложения), звуки, анимации (в коде, естественно) и т.д. В этой папке так же лежат локализации, то есть даже без знания каких-либо языков программирования можно легко перевести почти любой apk (так же рассмотрим в следующих уроках).
smali-папки (classes.dex) - это dex классы приложения, то есть пакеты, в них лежит весь код, который написан на java, kotlin и т.д, но не в чистом виде. а в байт коде (smali). Внутри этих папок есть и другие папки - это так сказать пакеты, их создают, чтобы в проекте было удобнее ориентироваться (messages, UI, server и т.д). Представьте просто несколько пакетов, с которыми вы ходите в магазин. Дк вот, размер одного пакета не может превышать примерно 8 килограмм - так и тут, размер пакета не может превышать примерно 8мб (насколько я помню, это 65тыс. методов (функций)). Если размер все же превышает, то надо создать еще один пакет и т.д, но иногда кривые разработчики делают 2 пакета по 2-3мб, что не есть хорошо и их лучше объединить, но это уже в следующих уроках.
unknown - неизвестные штуковины. В них лежат остатки библиотек, которые иногда можно удалить (метрика и прочее), но лучше не трогать, иначе что-нибудь может сломаться
AndroidManifest - некое описание приложения (словно вывод в каком-либо сочинении, где говорится, что есть вот это и это) - в нем регистрируются активности (зачастую это экраны). Мы как бы говорим приложению:"Эй, у меня есть активность, видишь ее? Зарегистрируй", если есть активность, но она не зарегистрирована в манифесте, то приложение крашнет. Так же могут быть сервисы, различные ключи, разрешения приложения, имя пакета и т.п (в настоящих исходниках задается и номер сборки)
apktool - ну и последний пункт, это создал компилятор, в основном это все должно лежать в манифесте, тут пишется (в нашем случае) номер сборки, версии и т.д

Собственно все, первый урок (вводный) подошел к концу. В следующих уроках мы уже рассмотрим подробнее ресурсы, байт код, и т.д и т.п :)

Report Page