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

В статье мы работали только с дизассемблированным кодом приложения, однако если в большие приложения вносить более серьезные изменения, разобраться в коде smali будет гораздо сложнее. К счастью, мы можем декомпилировать код dex в Java-код, который будет хоть и не оригинальным и не компилируемым обратно, но гораздо более легким для чтения и понимания логики работы приложения. Чтобы сделать это, нам понадобятся два инструмента:
dex2jar - транслятор байт-кода Dalvik в байт-код JVM, на основе которого мы сможем получить код на языке Java (code, google. com/p/dex2jar);
jd-gui - сам декомпилятор, позволяющий получить из байт-кода JVM читаемый код Java (java.decompiler.free.fr). В качестве альтернативы можно использовать Jad Iwww. varaneckas.com/jadl; хоть он и довольно старый, но в некоторых случаях генерирует более читаемый код, нежели Jd-gui. Если для вас является данный вопрос сложным, то не стоит делать эти изменения самостоятельно. Пригласите компьютерного мастера, ведь такие специалисты не только мастера в «железе», но и в программном обеспечении компьютера. За скорой компьютерной помощью можно обратиться на web-ресурс http://komputernaya-pomosh-moscow.ru/. Здесь осуществляется диагностика проблем и консультирование.
Декомпилировать код следует так. Сначала запускаем dex2jar, указывая в качестве аргумента путь до арк-пакета:
% dex2jar.sh mail.apk
В результате предыдущей операции в текущем каталоге появится Java-пакет mail.jar, который уже можно открыть в jd-gui для просмотра Java-кода.
ПРОСМОТР И МОДИФИКАЦИЯ
Допустим, ты нашел интересующий тебя пакет, скачал, распаковал... и при попытке просмотра какого-нибудь XML-файла с удивлением обнаружил, что файл не текстовый. Чем же его декомпилировать и как вообще работать с пакетами? Неужели необходимо ставить SDK? Нет, SDK ставить вовсе не обязательно. На самом деле для всех шагов по распаковке, модификации и упаковке пакетов АРК нужны следующие инструменты:
•архиватор ZIP для распаковки и запаковки;
•smali - ассемблер/дизассемблер байт-кода виртуальной машины Dalviklcode.goggle. com/p/smalil:
•aapt - инструмент для запаковки ресурсов (по умолчанию ресурсы хранятся в бинарном виде для оптимизации производительности приложения). Входит в состав Android SDK, но может быть получен и отдельно;
•signer - инструмент для цифровой подписи модифицированного пакета IbiUy/RmrvuMl.
Использовать все эти инструменты можно и по отдельности, но это неудобно, поэтому лучше воспользоваться более высокоуровневым софтом, построенным на их основе. Если ты работаешь в Linux или Mac OS X, то тут есть инструмент под названием apktool (bit.ly/ aettaZ). Он позволяет распаковывать ресурсы в оригинальный вид (в том числе бинарные XML- и arsc-файлы), пересобирать пакет с измененными ресурсами, но не умеет подписывать пакеты, так что запускать утилиту signer придется вручную. Несмотря на то, что утилита написана на Java, ее установка достаточно нестандартна. Сначала следует получить сам jar-файл:
$ cd /tmp
$ wget http://bit.ly/WC30Cz
$ tar - xjf apktooll.5.1.tar.bz2
Далее нам понадобится скрипт-обвязка для запуска apktool (он, кстати, доступен и для Windows), включающий в себя еще и утилиту aapt, которая понадобится для запаковки пакета:
$ wget http://bit.ly/WRjEc7
$ tar - xjf apktool - install - linux - r05 - ibot.tar.bz2
Далее просто сваливаем содержимое обоих архивов в каталог/bin и добавляем его в $РАТН:
$ mv apktool.jar ~/bin
$ mv apktool - install - linux - r05 - ibot/
~/bin
$ export PATH=~/bin:$PATH
Если же ты работаешь в Windows, то для нее есть превосходный инструмент под названием Virtuous Ten Studio (bit.ly/UvkYlj). Который также аккумулирует в себе все эти инструменты (включая сам apktool), но вместо CLI-интерфейса предоставляет пользователю интуитивно понятный графический интерфейс, с помощью которого можно выполнять операции по распаковке, дизассемблированию и декомпиляции в несколько кликов. Инструмент этот Donation-ware, то есть иногда появляются окошки с предложением получить лицензию, но это, в конце концов, можно и потерпеть. Описывать его не имеет никакого смысла, потому что разобраться в интерфейсе можно за несколько минут. А вот apktool, вследствие его консольной природы, следует обсудить подробнее.
Рассмотрим опции apktool. Если вкратце, то имеются три основные команды: d (decode), b (build) и if (install framework). Если с первыми двумя командами все понятно, то что делает третья, условный оператор? Она распаковывает указанный Ul-фреймворк, который необходим в тех случаях, когда ты препарируешь какой-либо системный пакет.
Рассмотрим наиболее интересные опции первой команды:
- не дизассемблировать файлы dex;
- не распаковывать ресурсы;
- не вставлять отладочную информацию в результаты дизассемблирования файла dex;
- frame-path - использовать указанный Ul-фреймворк вместо встроенного в apktool.
Теперь рассмотрим пару опций для команды b:
•f - форсированная сборка без проверки изменений;
•а - указываем путь к aapt (средство для сборки АРК-архива), если ты по какой-то причине хочешь использовать его из другого источника.
Пользоваться apktool очень просто, для этого достаточно указать одну из команд и путь до АРК, например:
$ apktool d mail.apk
После этого в каталоге mail появятся все извлеченные и дизассемблированные файлы пакета.