пятница, 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.

воскресенье, 19 января 2014 г.

AngularJS + Turbolinks. Bootstrapping. Ручное подключение приложений.

AngularJS автоматически инициализирует и настраивает приложение, найденное с помощью директивы ng-app.

Бывают случаи, что автоматических подключения и настройки Angular приложения не хватает. Например, при использовании AngularJS совместно с Ruby On Rails Turbolinks при переходе на новую ссылку приложение необходимо перенастроить, что не происходит автоматически.

Для этого:

1) Уберите директиву ng-app из верстки вашего приложения:

<div ng-app="app"></div>

2)  Вместо ng-app обозначим наше приложение обыкновенным id:

<div id="app">Контент</div>

3) Инициализация приложения:
Инициализация приложения занимает всего одну строчку кода. Можно было бы сделать ее в $(document).ready(), но в случае с Turbolinks такой фокус не прокатит, так как событие ready срабатывает только при первом посещении приложения. Для этого предусмотрено специальное событие page:load:

    $(document).on('ready page:load', function()
    {
        angular.bootstrap(document.getElementById('app'), ['App']);
    });

4) Все готово. Можно обратиться к приложению в коде:

    var app = angular.module("App", []);

С наилучшими пожеланиями, Ваш покорный слуга, Петюнчик)