3 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Разобрать приложение apk онлайн

Разобрать приложение apk онлайн. Простой способ модификации Android приложения. Устройство APK-пакетов и их получение

Для того чтобы редактировать APK приложения. Прежде всего их нужно декомпилировать, а после скомпилировать! Как это сделать и чем можно узнать в этом уроке.

2. Скопировать готовое приложение в папку с распакованным Sign Android

3. Потянуть приложение на файл Sign_APK.bat после чего приложение будет подписано

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

Извлечение ресурсов из APK

  • Вы забыли указать адрес электронной почты.
  • Этот адрес электронной почты не отображается.
  • Вы превысили максимальный предел символов.
  • Укажите корпоративный адрес электронной почты.

Намерения или потенциальные уязвимости в закрытых двоичных файлах. После распаковки корневой каталог будет содержать папки с ресурсами приложения, а также файл подписи. Есть два способа сделать это.

Готовое подписанное приложение будет носить название apk_signed.apk

Работа с системными APK

Для того чтобы модифицировать системные приложения необходимо прежде всего необходимо скормить программе APKTOOL системный файл framework -res.apk который находиться в системном разделе Android :

Устройство APK-пакетов и их получение

Веб-сервис или расширение браузера, например. Обратное проектирование повсюду. Обратное проектирование — это то, что заставляет хакеров разрабатывать эксплойты, вирусы и трояны для систем. Итак, как насчет декомпиляции существующих приложений. Существует большое количество инструментов, которые позволяют вам декомпилировать бинарные файлы приложений на исходный код, который в большинстве случаев является читабельным и понятным с некоторыми усилиями. Способ 2.

Шаг 5 — Откройте окно терминала

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

Для того чтобы скормить Apktool данный файл необходимо, ввести команду:

apktool if framework -res.apk

Учитывайте что, команду нужно вводить относительно пути расположения, то есть если файл framework -res.apk находиться в папке C:primer, то команда будет выглядеть следующим обзором:

apktool if С:primerframework -res.apk

Также для того чтобы можно было модифицировать системные файлы прошивка должна быть вначале Deodex -ирована.

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

После декомпиляции он будет выглядеть следующим образом. Имейте в виду, что это идеальная отправная точка, чтобы изолировать приложения «точки входа», а именно классы, которые вы сначала измените, чтобы понять логику всего программного обеспечения. Короче говоря, этот файл содержит логику, вот что нас интересует.

Теперь как это можно все упросить! (не использовать командную строку)

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

Кому это нужно

С нашей точки зрения это не имеет значения, инструменты, которые мы собираемся использовать, способны обнаружить и добавить его в конвейер декомпиляции. Иногда приложение должно выполнять собственный код, это может быть библиотека обработки изображений, игровой движок или что-то еще.

Внутри этой папки вы обычно найдете. Это напечатает вывод, например. Это отобразит все пакеты на вашем смартфоне, как только вы найдете пространство имен пакета, который хотите изменить, давайте посмотрим, каков его физический путь. Вытащите его из устройства.

Ломаем софт для Android

Ни один разговор о взломе и модификации приложений не обходится без упоминания дизассемблера, дебаггера, формата исполняемых файлов и вездесущей IDA Pro. Однако в случае с Android все намного проще, и здесь для вскрытия и даже внедрения кода в приложение совсем не обязательно использовать все эти инструменты. Код можно легко декомпилировать обратно в Java и модифицировать, используя пару простых инструментов и текстовый редактор.

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

Вторая статья будет целиком посвящена внедрению бэкдора/вируса в чужое приложение. Это уже не просто правка нескольких строк, а глубокая модификация.

Третья статья — методы обфускации и их обхода. Все больше разработчиков используют нетривиальную обфускацию, чтобы осложнить жизнь реверсерам. Мы распутаем их код и опять же внесем правки в приложение.

СНАРЯЖАЕМСЯ

Для выполнения описанных в статье действий понадобится ряд инструментов, и главный инструмент — это Linux. Да, многие из названных далее программ могут работать и в Windows, но в любых операциях, связанных с Android и его приложениями, лучше не полагаться на детище Билли. В Linux практически все сделать проще, командная строка здесь в разы удобнее (она нам ох как понадобится), а некоторые инструменты просто недоступны для других ОС.

После установки Linux в виртуалку или второй системой сразу устанавливаем средства разработки на Java и виртуальную машину. В Ubuntu это можно сделать с помощью одной команды:

Также нам нужны четыре инструмента для распаковки и декомпиляции приложений:

  • Apktool — швейцарский армейский нож для распаковки и запаковки приложений;
  • Jadx — декомпилятор байт-кода Dalvik в код на Java;
  • Backsmali — дизассемблер кода Dalvik (не пугайся, с настоящим ассемблером он имеет мало общего);
  • Sign — утилита для подписи пакетов.

Для удобства создадим в домашнем каталоге подкаталог Android и скачаем эти инструменты в него:

Добавим в конец файла

/.bashrc следующие строки:

Они нужны для того, чтобы вместо длинных и неудобных команд вроде java

/Android/sign.jar можно было набрать просто sign.

ВСКРЫВАЕМ ПОДОПЫТНОГО

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

Для начала пройдемся по APK без использования специальных инструментов. Для этого скачаем пакет при помощи сервиса APKPure : открываем страницу приложения в Play Store, копируем URL из адресной строки и вставляем в строку поиска на APKPure . Далее нажимаем кнопку Download APK и ждем окончания загрузки.

Для удобства переименуем пакет в asap.apk:

Разархивируем с помощью unzip:

Да, APK — это обычный архив ZIP, но тем не менее он имеет четкую структуру:

  • META-INF — каталог, содержащий файлы MF, CERT.MF и CERT. RSA. Первые два — список всех файлов пакета и их контрольных сумм, последний содержит открытый ключ разработчика и созданную с помощью закрытого ключа цифровую подпись файла CERT.MF. Эти данные нужны, чтобы при установке пакета система смогла выяснить, что пакет не был модифицирован и действительно создан его автором. Это важно, так как, поскольку нет возможности подделать цифровую подпись пакета (для этого нужен закрытый ключ), модифицированный пакет придется подписывать другим ключом;
  • res — ресурсы приложения. Здесь находятся иконка (mipmap), переводы строк (values), изображения (drawable), а также описания интерфейса приложения (layout). Все их можно модифицировать, чтобы изменить внешний вид приложения. Правда, файлы XML придется сначала «разжать» — для улучшения производительности они хранятся в бинарном формате;
  • dex — код приложения в форме байт-кода виртуальной машины Dalvik. Обычно приложения содержат только один такой файл, но, используя директиву multiDex, разработчик может заставить среду разработки разбить его на множество более мелких для улучшения производительности или преодоления ограничения на 65 536 методов в одном dex-файле;
  • xml — манифест приложения, описывающий его структуру, включая активности, сервисы, обработчики интентов и так далее. Опять же в формате бинарного XML.

Также пакет может содержать другие каталоги, например assets (любые файлы, включенные разработчиком, в данном случае — шрифты и база данных) и lib (нативные библиотеки, созданные с использованием Android NDK).

ИЗУЧАЕМ КОД

Само собой разумеется, просто разархивировать пакет недостаточно. Чтобы разобраться в работе приложения, необходимо декомпилировать файл classes.dex. Для этого мы воспользуемся jadx-gui. Запускаем, выбираем asap. apk и видим слева список пакетов Java, включенных в APK. В данном случае это пакеты android.support — официальная библиотека Google, реализующая поддержку функций новых версий Android в старых (например, чтобы получить Material Design в Android 4.1), com.google.android.gms — Google Mobile Services, com.nispok.snakbar — реализация GUI-элемента snakbar, а также несколько других.

Основной код приложения содержится в пакете com.citc.asap, именно такое имя носит и само приложение в Google Store и на устройстве. Открываем его и видим больше десятка каталогов и множество исходников Java. Наша задача — сделать приложение «оплаченным», не платя за него. Но как найти нужный файл, реализующий проверку на оплату? Скорее всего, он будет содержать в имени слово billing. Пробегаемся по исходникам в поисках нужного нам файла и натыкаемся на исходник BaseBillingFragment в подкаталоге (пакете) fragments:

Это очень простой класс Java, в котором есть интересный метод:

Все, что он делает, — просто возвращает значение поля mHasPrime, однако интересен он не этим, а своим именем. Дело в том, что платная (точнее, оплаченная) версия ASAP называется Prime, и очевидно, что метод hasPrime как раз и нужен для проверки оплаты приложения. Чтобы подтвердить свою догадку, сохраним декомпилированные исходники (File -> Save all) в каталог и попробуем найти в них вызовы hasPrime():

Совпадений немного, основной «пользователь» hasPrime() — это SettingsFragment, то есть исходник, отвечающий за формирование окна настроек. Учитывая, что Prime-версия отличается от бесплатной именно тем, что в ней разблокированы дополнительные поля настроек, уже сейчас мы можем быть на 90% уверены, что hasPrime() — нужный нам метод. Скорее всего, именно с его помощью приложение выясняет, куплена ли Prime-версия. Осталось только убедиться в этом окончательно, подменив код метода на свой.

ВНОСИМ ПРАВКИ

Метод hasPrime() очень прост, он возвращает значение поля mHasPrime, которое имеет тип boolean. Нетрудно предположить, что в случае, если приложение оплачено, hasPrime() вернет true, иначе вернет false. Наша задача — сделать так, чтобы метод всегда возвращал true и остальная часть приложения думала, что приложение оплачено, и разблокировала дополнительные опции в окне настроек.

К сожалению, сделать это с помощью прямой правки исходного кода не получится, приложение нельзя скомпилировать обратно. Однако никто не запрещает дизассемблировать код, внести правки и собрать его вновь. И как раз здесь нам понадобится apktool. Дизассемблируем APK:

В текущем каталоге появится подкаталог asap. Открываем файл *asap/smali/ com/citc/asap/fragments/BaseBillingFragment.smali* и находим hasPrime, декларация метода будет выглядеть так:

Это и есть дизассемблированный листинг, и, как ты видишь, он на порядок проще, чем дизассемблированный код нативных приложений. В целом здесь все тривиально:

  • .method protected hasPrime()Z — объявляет protected-метод, который возвращает значение типа boolean (Z);
  • .locals 1 — говорит виртуальной машине, что метод использует в своей работе один регистр (в данном случае он будет содержать возвращаемое значение);
  • .prologue и .line 167 — директивы, необходимые для отладки, на ход исполнения не влияют;
  • iget-boolean v0, p0. — получает значение поля типа boolean и записывает в регистр v0, регистр p0 — это нулевой параметр, он всегда равен имени класса (this);
  • return v0 — возвращает значение регистра v0;
  • .end method — закрывает тело метода.

Теперь мы должны изменить данный метод так, чтобы он возвращал true независимо от значения поля mHasPrime. Мы могли бы сделать это вручную, но проще написать новый метод на Java:

И пропустить его через компилятор и дизассемблер:

На выходе получаем следующий ассемблерный код:

Ты уже должен сам догадаться, что он объявляет константу v0 со значением 1 и возвращает ее (в Dalvik тип boolean — это int, который может иметь значение 1 — true или 0 — false). Осталось только вставить этот код вместо оригинального и собрать пакет обратно:

Пакет появится в каталоге asap/dist. Переименуем его, чтобы не запутаться:

И подпишем с помощью тестового ключа:

В результате в текущем каталоге появится файл asap-fake-hasPrime.s.apk. Остается только закинуть его на карту памяти и установить, удалив перед этим оригинальное приложение.

Настройки ASAP Launcher до и после манипуляций

ВЫВОДЫ

Взломать приложение для Android очень и очень просто. Да, я не спорю, нам попался удобный и простой пример для модификации, но опять же повторюсь — это весьма популярное приложение, о котором рассказывали на большинстве сайтов, посвященных Android.
Большинство других приложений вскрыть так же просто, однако есть достаточное количество экземпляров, пропущенных через обфускаторы и различные системы защиты. С ними все несколько сложнее, и таким приложениям будет посвящена третья статья цикла. Во второй статье мы рассмотрим, как тот же самый метод модификации использовать для внедрения собственного кода.

Меняем цветовые схемы

Цвета в приложении можно настроить несколькими способами:

  • использовать встроенные цвета, к примеру @android:color/white ;
  • создать палитру собственных цветов в файле colors.xml , которые затем используются в виде @color/text_primary ;
  • задать цвет шестнадцатеричным кодом, главное — не забудьте, что цвета в приложении записаны в формате #AARRGGBB — прозрачность на первом месте;
  • воспользоваться параметрами setTextColor , setBackgroundColor внутри кода Java или Kotlin.

Все эти способы жизнеспособны и постоянно используются.

colors.xml

Цветовая палитра приложения содержится в файле com.vk.admin/res/values/colors.xml . Структура файла выглядит так:

Каждый цвет, который в дальнейшем используется в статичных экранах приложения, записан здесь. Наша цель — изменить цвета, самый простой способ это сделать — инвертировать. Для записи цвета в формате hex можно отнять из 255 каждый компонент: R , G и B , то есть 255 — R , 255 — G , 255 — B . Параметры @android:color/white и @android:color/black можно изменить вручную.

styles.xml

В файле com.vk.admin/res/values/styles.xml заданы цвета, но только некоторые. Этот файл используется самими разработчиками, когда они хотят сделать несколько цветовых схем приложения. Если же этих схем нет, работать приходится нам с вами.

Некоторые цвета текста и фона заданы именно здесь, поэтому их нужно изменить аналогично с colors.xml .

Layout

В папке com.vk.admin/res/ находятся описания экранов приложения.

  • com.vk.admin/res/layout/ — универсальное хранилище экранов для всех смартфонов. Если нет каких-то специальных указаний, то будут использованы эти ресурсы;
  • com.vk.admin/res/layout-v«XX (где XX — версия SDK смартфона, зависит от версии Android на устройстве) используются для работы с самыми передовыми элементами UI;
  • остальные com.vk.admin/res/layout-. задают специфичные экраны приложения для ориентации устройства, разрешения и так далее.

Некоторые цвета приложения, чаще всего задний фон, можно найти здесь и изменить.

Но закончить мы пока не можем — есть некоторые экраны, цвет фона и текста которых задан не в файлах .xml, а прямо в исполняемом коде приложения. Туда нам и дорога.

В заключении посмотрим на внутренности нашего apk-файла. Сразу же отмечу, что apk-файл можно открыть zip-архиватором, например 7-Zip. Но многое останется недоступным. Лучше использовать анализатор apk-файлов от Android Studio. Далеко ходить не надо : необходимо выбрать пункт меню «Build → Analyze APK . » (см. самый верхний скриншот). В открывшемся диалоговом окне найти нужный пакет в файловой структуре, после чего в IDE будет открыта панель, как это представлено на следующем скриншоте.

Интерфейс панели анализатора разделен на 2 части. В верхней части Вы видите корневую структуру apk-файла. В нижней части можно просматривать структуру выделенного элемента верхней части.

Что сразу же бросается в глаза? Вспоминаем : в нашем примере/модуле была использована внешняя библиотека с OSGi-фреймворком Felix org.apache.felix.framework-6.0.3.jar, расположенная в поддиректории lib
В структуре созданного пакета поддиректория lib. Все файлы внешней jar-библиотеки размещаются в корне по пакетам. Можно предположить, что и дополнительное использование бандлов/модулей (а для чего использовать фреймворк, если не использовать бандлы) приведет к тому, что и их содержимое также будет интегрировано в общий пакет. Таким образом, мы лишаемся преимуществ использования OSGi-технологии при разработке приложений для android-устройств, поскольку любая доработка отдельного модуля/бандла будет связана с обновлением всей сборки (apk-пакета). Кроме этого, отсутствует возможность одновременного использования разноверсионных бандлов, а межмодульное взаимодействие посредством сервисов становится «слишком дорогим» (можно и напрямую постучаться к классам бандла, зачем нам посредник-активатор). На данном простом примере я не вижу преимуществ использования OSGi для создания многомодульного приложения.

Буду признателен всем, кто опровергнет данное предположение и предложит значимое использование OSGi-технологии в android-устройстве.

Что касается *.class’ов, то их также не будет в apk-файле. Им на смену пришли файлы *.dex .

Методы противодействия криминалистическому исследованию и способы борьбы с ними

Специалисты выделяют четыре наиболее распространенных способа противодействия криминалистическому исследованию предположительно вредоносных приложений в ОС Android: обфускация, шифрование символьных строк, противодействие декомпилятору и проверка окружения.

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

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

Для того чтобы извлечь байт-код (в .dex формате) из APK-файла, эксперт может воспользоваться, например, ApkTool. Для декомпиляции байт-кода в исходный код Java и последующего анализа может быть использована связка программных продуктов, состоящая, например, из Dex2Jar (декомпиляция) и JD-GUI (анализ). Полученный в результате декомпиляции исходный код Java нуждается в редактировании: может возникнуть необходимость удалить пустые классы, поправить ошибки, осуществить переименования методов, классов и их объектов и т. д.

Символьные строки, содержащиеся в предположительно вредоносной программе, являются важнейшим источником криминалистически значимой информации. Для реализации шифрования символьных строк разработчиками используются как сравнительно простые алгоритмы, такие как XOR, Base64 и ROT13 (включая его вариации, например, ROT15), так и продвинутые криптографические стандарты, например DES и AES.

Так, идентификация символьных строк, зашифрованных применением алгоритма XOR, может быть осуществлена экспертом посредством программного продукта XORSearch разработки Дидье Стивенса.

Необходимо отметить, что злоумышленниками применяются различные методы, позволяющие избежать детектирования рассматриваемого алгоритма. Например, шифрование с применением XOR осуществляется в два этапа: сначала с использованием одного значения, затем — другого.

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

ROT13 — наиболее простой алгоритм из трех рассматриваемых. Но существуют и его модификации, способные усложнить декодирование. Так разработчиками вредоносного программного обеспечения может использоваться модификация этого алгоритма, например ROT15, которая осуществляет сдвиг не на 13 позиций, а на 15.

Некоторые вредоносные программы написаны таким образом, что их функционирование возможно только на определенных типах мобильных устройств. Приложением осуществляется проверка как свойств системы, так и международного идентификатора мобильного абонента (IMSI). Таким образом, программа не выполняется, если устройство или эмулятор не проходит проверку, что затрудняет проведение динамического анализа.

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

В большинстве случаев декомпиляция приложения не вызывает особых проблем. Для каждой задачи, которую нужно проделать, написаны программы, работающие на любой платформе где можно установить Java Runtime. Итак, суть декомпиляции заключается в следующем: Вы можете либо просматривать декомпилированный код виртуальной машины Dalvik, а также все файлы ресурсов приложения (манифест, разметка и т.д.). А можете преобразовать код Dalvik в код Java. В первом случае программе передается путь к apk-файлу. Во втором из apk-файла (который по сути обычный архив) нужно вытащить файл. Этот файл содержит весь исполняемый код для машины Dalvik (да, весь код объединен в один файл). Специальная программа преобразует код Dalvik в код Java, который потом можно открыть любым java-декомпилятором. Казалось бы, второй способ предпочтительнее, но есть одна хитрость. И заключается она в том, что некоторые участки кода невозможно конвертировать, либо логика кода становится далека от того, как писал разработчик. Для простых программ этого конечно достаточно, но для понятия всего кода конечно обращать внимание стоит и на Java, и на Dalvik. Давайте же наконец поговорим о том, что конкретно нам нужно делать для декомпиляции Android приложений.

Прежде всего поговорим о полной декомпиляции приложения. То есть, вместе с распаковкой всех вложенных в apk xml-файлов. Для этого потребуется утилита apktool . Все что нужно — это запустить утилиту с правильными параметрами: java -jar apktool.jar d app.apk . Флаг d означает, что приложение будет декомпилировано. Последний параметр – путь к apk-файлу. Для удобства я создал bat-скрипт и положил его рядом с программой.

java -jar apktool.jar d app.apk pause

Ссылка на основную публикацию
Статьи c упоминанием слов:
Adblock
detector
jdgui . Они обе также бесплатные и с открытым кодом. Вам необходимо открыть apk-файл с помощью архиватора (7zip , например) и извлечь в папку с dex2jar файл classes.dex .

После чего запустить утилиту следующей командой. Это преобразует код машины Dalvik в код Java. Если преобразование завершилось успешно, Вы получить файл classes.jar . Этот файл открываем в jdgui.

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

Дело остается за малым: исследовать код программы. Если целью декомпиляции было внесение каких-либо изменений в программе, то после всех действий необходимо все файлы собрать в apk и подписать его. О том, как это сделать, читайте в продолжении.

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

Вот и у меня появилась задача модифицировать приложение имея всего лишь его apk. И те, кто занимался декомпиляцией приложений знают насколько тяжело его потом скомпилировать.

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

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

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

Переопределение классов

Таким способом можно отнаследоваться от Activity, Service, BroadcastReceiver и, возможно, некоторых других классов объявляемых в манифесте, так же в манифесте нужно будет указать новые имена классов, иначе они не будут использоваться.

Теперь можно переопределить виртуальные функции, но и только, тем более ключевое слово final не позволит это сделать и отнаследоваться тоже, поэтому идем дальше.

Замена классов

Не все так просто, для начала нужно скомпилировать проект. Чтобы использовать классы исходного приложения нужно его как-то присоединить к проекту, но при этом не экспортировать. Делается это просто: из папки libs Эклипс сам экспортирует библиотеки, поэтому перемещаем jar библиотеку в папку lib и подключаем к проекту, в Эклипсе это Project->Preferences->Java Build Path->Libraries->Add Jars… далее во вкладке Order and Export нужно убедиться, что не установлен чекбокс, потому что экспортировать библиотеку нам не нужно, все будет в class файлах.

Теперь берем какой-нибудь класс из декомпилированных исходников приложения, исправляем в нем ошибки компиляции, добавляем, например, показ диалога, чтоб убедиться, что используется именно новый класс. Далее очищаем проект, в Эклипсе это Project->Clean, копируем class файлы в папку bin/classes, собираем проект и все работает!

При следующих сборках проекта нет необходимости его очищать, так что использовать такой способ достаточно удобно. Для облегчения исправления ошибок после декомпиляции я использовал исходники полученные из JD-GUI и JAD, обычно этого было достаточно.

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

Заключение

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

StarForce C++ Obfuscator

Это решение также защищает только исходный код, написанный на С/С++. Такая защита необходима, когда в коде передается важная информация, которая ни в коем случае не должна попасть к третьим лицам.

StarForce C++ Obfuscator использует более 30 методов обфускации, среди которых можно назвать:

  • преобразование кода С++ в код виртуальной машины;
  • шифрование строк и массивов;
  • преобразование кода в цифровой автомат;
  • введение ложных связей;
  • объединение участков кода.

Решение работает на Windows и Linux, а защита обеспечивается для приложений, написанных под любые операционные системы. Функционал DRM не поддерживается.

Необходимые программы

Скачайте и установите следующий софт (смотри ссылки внизу статьи):

  • apktool
  • dex2jar
  • jd-gui
  • архиватор (например 7z)

Java — язык программирования, платформа необходимая для запуска JAR файлов.

Apktool — программа для извлечения ресурсов из приложений (напр.: бинарные XML преобразует в текстовый формат), а также дизассемблирует (переводит в формат, известный как smali) содержимое dex файлов (исполняемые файлы с кодом для виртуальной машины Delvik).

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

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

Dex2jar — набор утилит, c помощью которых, среди прочего, можно преобразовать содержимое DEX файла в JAR файл.

Jd-Gui — декомпилятор, который пытается “вытащить” исходный код на языке JAVA из файлов с расширением.class.

Архиватор — с помощью него можно извлечь файлы из APK файла. Все XML файлы будут иметь бинарный формат, а сам код программы будет находиться в DEX файле.

Что скажет вам, в какой встроенной библиотеке реализован метод. Когда статического анализа недостаточно, возможно, из-за того, что приложение запутано, или кодовая база просто слишком большая и сложная, чтобы быстро изолировать интересующие вас подпрограммы, вам нужно идти динамически.

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

Извлечение содержимого из APK файла таким способом полезно в случае, если вам надо посмотреть графические файлы, они не сжимаются и не шифруются.

Ломаем софт для Android

Ни один разговор о взломе и модификации приложений не обходится без упоминания дизассемблера, дебаггера, формата исполняемых файлов и вездесущей IDA Pro. Однако в случае с Android все намного проще, и здесь для вскрытия и даже внедрения кода в приложение совсем не обязательно использовать все эти инструменты. Код можно легко декомпилировать обратно в Java и модифицировать, используя пару простых инструментов и текстовый редактор.

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

Вторая статья будет целиком посвящена внедрению бэкдора/вируса в чужое приложение. Это уже не просто правка нескольких строк, а глубокая модификация.

Третья статья — методы обфускации и их обхода. Все больше разработчиков используют нетривиальную обфускацию, чтобы осложнить жизнь реверсерам. Мы распутаем их код и опять же внесем правки в приложение.

СНАРЯЖАЕМСЯ

Для выполнения описанных в статье действий понадобится ряд инструментов, и главный инструмент — это Linux. Да, многие из названных далее программ могут работать и в Windows, но в любых операциях, связанных с Android и его приложениями, лучше не полагаться на детище Билли. В Linux практически все сделать проще, командная строка здесь в разы удобнее (она нам ох как понадобится), а некоторые инструменты просто недоступны для других ОС.

После установки Linux в виртуалку или второй системой сразу устанавливаем средства разработки на Java и виртуальную машину. В Ubuntu это можно сделать с помощью одной команды:

Также нам нужны четыре инструмента для распаковки и декомпиляции приложений:

  • Apktool — швейцарский армейский нож для распаковки и запаковки приложений;
  • Jadx — декомпилятор байт-кода Dalvik в код на Java;
  • Backsmali — дизассемблер кода Dalvik (не пугайся, с настоящим ассемблером он имеет мало общего);
  • Sign — утилита для подписи пакетов.

Для удобства создадим в домашнем каталоге подкаталог Android и скачаем эти инструменты в него:

Добавим в конец файла

/.bashrc следующие строки:

Они нужны для того, чтобы вместо длинных и неудобных команд вроде java

/Android/sign.jar можно было набрать просто sign.

ВСКРЫВАЕМ ПОДОПЫТНОГО

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

Для начала пройдемся по APK без использования специальных инструментов. Для этого скачаем пакет при помощи сервиса APKPure : открываем страницу приложения в Play Store, копируем URL из адресной строки и вставляем в строку поиска на APKPure . Далее нажимаем кнопку Download APK и ждем окончания загрузки.

Для удобства переименуем пакет в asap.apk:

Разархивируем с помощью unzip:

Да, APK — это обычный архив ZIP, но тем не менее он имеет четкую структуру:

  • META-INF — каталог, содержащий файлы MF, CERT.MF и CERT. RSA. Первые два — список всех файлов пакета и их контрольных сумм, последний содержит открытый ключ разработчика и созданную с помощью закрытого ключа цифровую подпись файла CERT.MF. Эти данные нужны, чтобы при установке пакета система смогла выяснить, что пакет не был модифицирован и действительно создан его автором. Это важно, так как, поскольку нет возможности подделать цифровую подпись пакета (для этого нужен закрытый ключ), модифицированный пакет придется подписывать другим ключом;
  • res — ресурсы приложения. Здесь находятся иконка (mipmap), переводы строк (values), изображения (drawable), а также описания интерфейса приложения (layout). Все их можно модифицировать, чтобы изменить внешний вид приложения. Правда, файлы XML придется сначала «разжать» — для улучшения производительности они хранятся в бинарном формате;
  • dex — код приложения в форме байт-кода виртуальной машины Dalvik. Обычно приложения содержат только один такой файл, но, используя директиву multiDex, разработчик может заставить среду разработки разбить его на множество более мелких для улучшения производительности или преодоления ограничения на 65 536 методов в одном dex-файле;
  • xml — манифест приложения, описывающий его структуру, включая активности, сервисы, обработчики интентов и так далее. Опять же в формате бинарного XML.

Также пакет может содержать другие каталоги, например assets (любые файлы, включенные разработчиком, в данном случае — шрифты и база данных) и lib (нативные библиотеки, созданные с использованием Android NDK).

ИЗУЧАЕМ КОД

Само собой разумеется, просто разархивировать пакет недостаточно. Чтобы разобраться в работе приложения, необходимо декомпилировать файл classes.dex. Для этого мы воспользуемся jadx-gui. Запускаем, выбираем asap. apk и видим слева список пакетов Java, включенных в APK. В данном случае это пакеты android.support — официальная библиотека Google, реализующая поддержку функций новых версий Android в старых (например, чтобы получить Material Design в Android 4.1), com.google.android.gms — Google Mobile Services, com.nispok.snakbar — реализация GUI-элемента snakbar, а также несколько других.

Основной код приложения содержится в пакете com.citc.asap, именно такое имя носит и само приложение в Google Store и на устройстве. Открываем его и видим больше десятка каталогов и множество исходников Java. Наша задача — сделать приложение «оплаченным», не платя за него. Но как найти нужный файл, реализующий проверку на оплату? Скорее всего, он будет содержать в имени слово billing. Пробегаемся по исходникам в поисках нужного нам файла и натыкаемся на исходник BaseBillingFragment в подкаталоге (пакете) fragments:

Это очень простой класс Java, в котором есть интересный метод:

Все, что он делает, — просто возвращает значение поля mHasPrime, однако интересен он не этим, а своим именем. Дело в том, что платная (точнее, оплаченная) версия ASAP называется Prime, и очевидно, что метод hasPrime как раз и нужен для проверки оплаты приложения. Чтобы подтвердить свою догадку, сохраним декомпилированные исходники (File -> Save all) в каталог и попробуем найти в них вызовы hasPrime():

Совпадений немного, основной «пользователь» hasPrime() — это SettingsFragment, то есть исходник, отвечающий за формирование окна настроек. Учитывая, что Prime-версия отличается от бесплатной именно тем, что в ней разблокированы дополнительные поля настроек, уже сейчас мы можем быть на 90% уверены, что hasPrime() — нужный нам метод. Скорее всего, именно с его помощью приложение выясняет, куплена ли Prime-версия. Осталось только убедиться в этом окончательно, подменив код метода на свой.

ВНОСИМ ПРАВКИ

Метод hasPrime() очень прост, он возвращает значение поля mHasPrime, которое имеет тип boolean. Нетрудно предположить, что в случае, если приложение оплачено, hasPrime() вернет true, иначе вернет false. Наша задача — сделать так, чтобы метод всегда возвращал true и остальная часть приложения думала, что приложение оплачено, и разблокировала дополнительные опции в окне настроек.

К сожалению, сделать это с помощью прямой правки исходного кода не получится, приложение нельзя скомпилировать обратно. Однако никто не запрещает дизассемблировать код, внести правки и собрать его вновь. И как раз здесь нам понадобится apktool. Дизассемблируем APK:

В текущем каталоге появится подкаталог asap. Открываем файл *asap/smali/ com/citc/asap/fragments/BaseBillingFragment.smali* и находим hasPrime, декларация метода будет выглядеть так:

Это и есть дизассемблированный листинг, и, как ты видишь, он на порядок проще, чем дизассемблированный код нативных приложений. В целом здесь все тривиально:

  • .method protected hasPrime()Z — объявляет protected-метод, который возвращает значение типа boolean (Z);
  • .locals 1 — говорит виртуальной машине, что метод использует в своей работе один регистр (в данном случае он будет содержать возвращаемое значение);
  • .prologue и .line 167 — директивы, необходимые для отладки, на ход исполнения не влияют;
  • iget-boolean v0, p0. — получает значение поля типа boolean и записывает в регистр v0, регистр p0 — это нулевой параметр, он всегда равен имени класса (this);
  • return v0 — возвращает значение регистра v0;
  • .end method — закрывает тело метода.

Теперь мы должны изменить данный метод так, чтобы он возвращал true независимо от значения поля mHasPrime. Мы могли бы сделать это вручную, но проще написать новый метод на Java:

И пропустить его через компилятор и дизассемблер:

На выходе получаем следующий ассемблерный код:

Ты уже должен сам догадаться, что он объявляет константу v0 со значением 1 и возвращает ее (в Dalvik тип boolean — это int, который может иметь значение 1 — true или 0 — false). Осталось только вставить этот код вместо оригинального и собрать пакет обратно:

Пакет появится в каталоге asap/dist. Переименуем его, чтобы не запутаться:

И подпишем с помощью тестового ключа:

В результате в текущем каталоге появится файл asap-fake-hasPrime.s.apk. Остается только закинуть его на карту памяти и установить, удалив перед этим оригинальное приложение.

Настройки ASAP Launcher до и после манипуляций

ВЫВОДЫ

Взломать приложение для Android очень и очень просто. Да, я не спорю, нам попался удобный и простой пример для модификации, но опять же повторюсь — это весьма популярное приложение, о котором рассказывали на большинстве сайтов, посвященных Android.
Большинство других приложений вскрыть так же просто, однако есть достаточное количество экземпляров, пропущенных через обфускаторы и различные системы защиты. С ними все несколько сложнее, и таким приложениям будет посвящена третья статья цикла. Во второй статье мы рассмотрим, как тот же самый метод модификации использовать для внедрения собственного кода.