Мы уже неоднократно рассказывали о взломе приложений для 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

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

Вариант 1. Оформи подписку на «Хакер», чтобы читать все материалы на сайте

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

Вариант 2. Купи один материал

Заинтересовала информация, но нет возможности оплатить подписку? Тогда этот вариант для тебя! Обрати внимание: этот способ покупки доступен только для материалов, опубликованных более двух месяцев назад.


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

  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 по умолчанию

  7. worldown

    30.10.2018 at 18:06

    не получается импортировать smali, выдает «Fail to load plugin descriptor from file smali-2.2.5.jar»

  8. worldown

    30.10.2018 at 18:11

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

Check Also

Kickidler. Тестируем современное средство удаленного наблюдения и перехвата

Содержание статьиЭволюция средств наблюденияТайм-трекеры и их продвинутые аналогиДоверяем,…