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

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

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

Так что в целом алгоритм твоих действий будет выглядеть так:

  1. Достаем подопытное приложение из устройства.
  2. Дизассемблируем его, выставляем флаг отладки.
  3. Собираем обратно и устанавливаем на устройство.
  4. Импортируем декомпилированный или дизассемблированный код в Android Studio.
  5. Запускаем отладку, будто это наше приложение.

WARNING

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

 

Флаг отладки

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

Поэтому первое, что мы должны сделать, — это разобрать приложение, выставить флаг отладки в значение true и собрать обратно. Проще всего это сделать с помощью утилиты apktool. Просто натравливаем ее на подопытное приложение, и готово:

$ java -jar apktool.jar d app.apk

В текущем каталоге появится подкаталог app (ну или как назывался пакет с приложением).

Далее переходим в него и видим несколько файлов и каталогов. Нам они еще пригодятся, а пока открываем файл AndroidManifest.xml в текстовом редакторе и находим строку, начинающуюся с <application. Это тег application, который описывает приложение в целом. Именно к нему мы должны добавить атрибут android:debuggable="true". Просто вставь его сразу после application:

<application android:debuggable="true" ...

Теперь приложение необходимо запаковать и подписать:

$ java -jar apktool.jar b app
$ java -jar sign.jar app.apk

Утилиту sign можно найти на GitHub.

После этого приложение можно установить на устройство.

 

Декомпиляция и дизассемблирование

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

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

Скачиваем Jadx, запускаем, выбираем apk-файл приложения. Откроется главное окно приложения. Слева будут пакеты, справа исходники. Лучше сразу проверить их корректность (действительно ли получился читаемый Java-код), а затем можно экспортировать их с помощью меню File → Save as gradle project.

Декомпиляция приложения в Jadx
Декомпиляция приложения в Jadx

Продолжение доступно только подписчикам

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

Подпишись на «Хакер» по выгодной цене!

Подписка позволит тебе в течение указанного срока читать ВСЕ платные материалы сайта. Мы принимаем оплату банковскими картами, электронными деньгами и переводами со счетов мобильных операторов. Подробнее о подписке

7 комментариев

  1. petrovichtim

    23.07.2018 at 12:58

    Jadx не всегда может нормально сделать java код

  2. and7ey

    23.07.2018 at 23:32

    Нужно указать версии используемых приложений. Кнопку «Attach debugger to Android process» так и не нашел.

    • and7ey

      23.07.2018 at 23:44

      Выяснил. Наличие этой кнопки зависит от того, что получилось в результате декомпиляции. С Java-кодом кнопки у меня нет, со smali — есть. Но выбрать в ней что-либо нельзя. Устройство отображается, а вот кнопка Ок — недоступна для нажатия.

  3. and7ey

    24.07.2018 at 22:59

    java -jar apktool.jar b app

    — тут лучше указать выходной файл с помощью параметра -o, например,

    java -jar apktool.jar b app -o app.debuggable.apk

  4. AseN

    25.07.2018 at 12:07

    Важно сказать, что универсальным вариантом отладки приложений все же является импорт проекта со smali-кодом, потому что восстановленный java-код нередко запутывает еще больше. Также практика показывает, что от метода перепаковки APK(для ручной установки debuggable-флага) все большее число вендоров научилось защищаться простой проверкой отпечатка подписи APK(порой очень изощренными способами).

  5. and7ey

    25.07.2018 at 19:04

    Как быть, если отладчик не останавливается на нужном коде? (на строках другого файла этого же проекта — останавливается)

    Читал, что такое может быть, если функция выполняется при старте приложения (например, в onCreate в main activity), но тут вроде не этот случай — функция преобразует строку на лету.

  6. AseN

    10.08.2018 at 23:22

    Еще одно замечание касается флага отладки: имея запущенный с рутом adb, все приложения становятся debuggable по умолчанию

Оставить мнение

Check Also

Миллионы Android-приложений уязвимы перед проблемой Man-in-the-Disk

Эксперты Check Point описали новый вектор атак на Android-устройства — Man-in-the-Disk (Mi…