пятница, 31 января 2014 г.

Android. Декомпиляция apk. Apk to Java decompilation

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

Алгоритм следующий:
1. Достать байт-код Java из apk;
2. Преобразовать байт-код в код на языке Java.

Для этого нам понадобятся:
1. Конвертер dex и apk файлов в jar;
2. Декомпилятор jar файлов;
3. Везение и боевой настрой =)

Последнюю версию конвертера можно скачать отсюда:
А отсюда можно скачать версию 0.0.9.15, если ссылка выше не работает:

Из перепробованных мной декомпиляторов самым удачным мне показался fernflower.
Качаем с интернета, или по этой ссылке:

И так, начнем:

1. Распаковываем архив с dex2jar, закидываем apk файл в папку с файлом dex2jar.sh и в командной строке, находясь в этой же директории, печатаем:

    ./dex2jar.sh имя_вашего_apk.apk

Нажимаем Enter.

Будет много текста, но вскоре в папке появится файл с названием "имя_вашего_apk_dex2jar.jar".

2. В этом файле уже содержатся java классы, но в нечитаемом двоичном виде. Для этого нужно декомпилировать их. Для этого применим fernflower.jar. При условии, что появившийся на первом шаге файл и fernflower.jar находятся в одной директории, набираем в командной строке:

    java -jar fernflower.jar имя_вашего_apk_dex2jar.jar имя_директории

Нажимаем Enter. Создастся папка с названием "имя_директории", в которой будет лежать файл с таким же именем, как и исходный. Но в этот раз все java файлы будут иметь читаемый вид. 

Пам парам, все готово) Можете изучать полученный код или восстанавливать потерянный.

Проблемы:

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

Вторая проблема - в полученном коде не будет комментариев. Причина такая же, как и в первой проблеме. Они удаляются при сборке apk.

Третья проблема, тоже не очень приятная. Код восстанавливается из бинарников с некоторой точностью, а не в первозданном виде. И эта точность зависит от декомпилятора. Fernflower самый точный, из проверенных мной. Например, один из декомпиляторов не умел восстанавливать switch, вместо него получался бесконечный цикл с кучей break и contunue.

Комментариев нет:

Отправить комментарий