Полная декомпиляция Android приложений в Java код.



Порой при разработке не понимаешь как ведет реализовать определенную функцию, которую видел в чужом приложении, или просто изучить стороннее приложение охота, для этого существует декомпиляция приложений.
В данной статье я покажу как декомпилировать Андроид приложения из *.apk файла в исходный код.
Android

И так, нам потребуется:
dex2jar
Java Decompiler
ApkTool

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

Инструкцию буду проводить для ОС Windows.

  1. Качаем dex2jar-0.0.7.10-SNAPSHOT.zip (номер версии может изменяться) и извлекаем все файлы в желаемую папку, например D:\Decompile .
  2. Качаем Java Decompiler, я использовал JD-GUI и извлекаем для удобства в ту же папку, куда и dex2jar.
  3. Качаем apktool1.4.1.tar.bz2 и apktool-install-windows-r04-brut1.tar.bz2 и извлекаем уже в системную папку. По умолчанию C:\Windows .
  4. Берем нужный apk файл и кладем в папку с dex2jar и Java Decompiler. В примере приведу декомпиляцию приложения Калькулятор из стандартной поставки Android. (надо извлечь из архива).
  5. Открываем Командную строку (Обработчик команд Windows) в вышеупомянутой папке. (например открыв apk файл с помощью C:\Windows\System32\cmd.exe).
  6. Вводим команду dex2jar Calculator.apk и если все прошло хорошо, в той же папке появится файл Calculator.apk.dex2jar.jar
  7. Запускаем jd-gui и открываем полученный на предыдущем шаге файл.
  8. Выбираем пункт меню File-Save All Sources и сохраняем.
  9. Извлекаем полученный zip архив.
  10. Помещаем полученную папку в папку src (надо предварительно создать).(Что бы получилась примерно такая структура D:\Decompile\Calculator\src\com\android)
  11. Опять же в командной строке вводим команду apktool d Calculator.apk Calculator, где Calculator.apk-имя пакета, Calculator-папка для декомпиляции
  12. Если все хорошо, тогда в указанной папке будут исходники в двух форматах (java и smali), ресурсы и файлы AndroidManifest.xml, apktool.yml
  13. Все готово, исходники получены. Правда после декомпиляции в коде есть, можно сказать, ошибки, я заметил пока только что вместо true и false стоят 1 и 0 соответственно.

P.S. Если хочется импортировать полученный код в IDE Eclipse (File-Import), тогда положите содержимоеэтого архива в папку с проектом, предварительно изменив на третьей строке <name>PROJECT NAME</name> PROJECT NAME на желаемое название, в моем примере «Calculator» в файле .project
P.P.S. Если apk файл был пропущен при компиляции через обфускатор (proguard), тогда полученный код будет плохо читаем.

2leep.com
Понравился пост? Подпишитесь на мой RSS канал!
Вы так же можете зафолловить меня в Твиттере.


Запись опубликована в рубрике Android, Инструкции с метками , , , , , , , , , . Добавьте в закладки постоянную ссылку.
  • User

    Твоя хрена-тен ни хрена не работает!

    • http://boomik.ru BOOM

      Что именно не работает?

  • Sablinsfamily

    не получилось, файлы не появляются

    • http://boomik.ru BOOMik

      На каком этапе не появляются?

      • Sablinsfamily

        все получилось? а почему не открывается дизайн?

        • http://boomik.ru BOOMik

          dex2jar выдает только код, apktool код в smali формате и ресурсы.

          • oskarlaik22

            Спасибки тебе большое, за то что ответил на мое сообщение на http://4pda.ru.
            Я все сделал как ты описал :

            Цитата
            10.Помещаем полученную папку в папку src (надо предварительно создать).(Что бы получилась примерно такая структура D:DecompileCalculatorsrccomandroid)11.Опять же в командной строке вводим команду apktool d Calculator.apk Calculator, где Calculator.apk-имя пакета, Calculator-папка для декомпиляции12.Если все хорошо, тогда в указанной папке будут исходники в двух форматах (java и smali), ресурсы и файлы AndroidManifest.xml, apktool.yml

            Теперь я имею в созданной мной «android» директории две папки, одну «Calculator.apk.dex2jar.srs» с папками и файлами «.java», а другую «Calculator» с папками и файлами (.smali,AndroidManifest.xml,apktool.yml). Дальше скачал и распакавал архив «Eclipse.zip», изменил в строкем «PROJECT NAME» PROJECT NAME на желаемое название.

            Ты писал что надо зделать так:
            Цитата
            .S. Если хочется импортировать полученный код в IDE Eclipse (File-Import), тогда положите содержимое этого архива(Eclipse.zip) в папку с проектом,

            Как я понимаю в папку с проектом в самом «Eclipse»?
            А как потом сделать импорт в самом ECLIPSE и какую именно папку указать в Eclipse, ведь в дириктории «android» у меня их две?
            Если можно, пожалуйста напиши по подробней если можно в картинках, здесь или у себя в блоге. Я буду очень тебе благодарен, это очень важная тема для новичков.

          • http://boomik.ru BOOMik

            Все просто-объедени содержимое этих двух папок в одной  

          • oskarlaik22

            Ты имеешь в виду так:

          • oskarlaik22

            Или объеденить содержимое этих двух папок в одной папке (SRC)?

          • http://boomik.ru BOOMik

            В конечной папке должны быть папки res, src и файл AndroidManifest.xml
            ну еще может папка smali (это исходники в другом формате, которые можно
            исправить и скомпилировать)

          • oskarlaik22

            Спасибо, сейчас буду тестить…

          • вадим

            BOOMik скажи пожалуйста !!! мне не совсем понятно что подписывать в этом zip архиве где какая третья строка ??? те файлы воще не открываютя!!! разжуй плиз очень надо… и ещё по этому способу можно имя и версию пакета изменить а потом упаковать

          • http://boomik.ru BOOMik

            Где вычитал про третью строку? Какие файлы не открываются?
            Про версию и имя пакета ответить не могу, в принципе думаю возможно.

  • D-link13

    а можно с 4 по 6 пункт максимально подробно?
    как открыть .apk с командной строки? и где писать dex2jar Calculator.apk?поясните пожалуйста, а то что то не выходит по вашей инструкции

    • http://boomik.ru BOOMik

      Командную строку открыть просто, достаточно в папке зажать клавину Shift и в свободном месте кликнуть правой кнопкой мыши и выбрать пункт «Открыть окно команд»
      В открывшемся окне и вводить команды из пункта 6

  • Alun

    Зачем вызывать через командную строку, только усложнять себе путь?По *.apk правой кнопкой мыши >открыть с помощью>dex2jar и все нет ни каких проблем.

    • http://boomik.ru BOOMik

      В принципе действительно так можно, делал как нашел в инструкции, и тут опубликовал, так точно работает.

  • 2470747

    как найти запускаемый класс?

    • http://boomik.ru BOOMik

      Через файл — манифест.

  • ender

    я на 11 застрял

  • Mef1k

    у меня на 12 этапе нет файла java

  • Gfs

    Из арк делаем jar
    Из jar делаем zip
    Из zip извлекаем файлы
    Зачем нужна эта мастурбация если все файлы из арк извлекаются ТК в несколько кликлв ?

    • http://boomik.ru BOOMik

       картинки извлекаются. а xml файлы становятся нечитаемыми.

  • Pingback: Ежедневник kvarkson'a | 18 Декабря / Салют Верблюду

  • Евгений

    При декомпиляции не появляется папка src с файлами. У меня одного такая проблема?

    • http://boomik.ru BOOMik

      У всех так. при декомпиляции apktool код лежит в папке smali

  • Максим Малый

    Как при помощи такова метода можно поменять стиль проги.

    • http://boomik.ru BOOMik

      декомпилировать, изменить ресурсы, скомпилировать

  • Сергей

    Доброго времени суток. Пытаюсь декомпилировать стандартную андроидовскую звонилку… на этапе извлечения ресурсов вываливается следующее:
    C:Decompiler>apktool d SemcPhone.apk SemcPhone
    I: Baksmaling…
    I: Loading resource table…
    I: Loaded.
    I: Decoding AndroidManifest.xml with resources…
    I: Loading resource table from file: C:apktoolframework1.apk
    I: Loaded.
    W: Could not decode attr value, using undecoded value instead: ns=android, name=
    theme, value=0x0209006f
    I: Regular manifest package…
    I: Decoding file-resources…
    W: Could not decode attr value, using undecoded value instead: ns=android, name=
    textAppearance, value=0×02090042
    W: Could not decode attr value, using undecoded value instead: ns=android, name=
    textAppearance, value=0×02090046

    W: Could not decode attr value, using undecoded value instead: ns=android, name=
    background, value=0×01080640
    I: Decoding values */* XMLs…
    Can’t find framework resources for package of id: 2. You must install proper fra
    mework files, see project website for more info.

    Как это решить?

    • http://boomik.ru BOOMik

      Без понятия. можно попытаться скачать новую версию apktool

  • www.gor.uz

    BOOMik. Спасибо тебе большое. Отличный поста.
    Я пропбовал декомпилировать разные СМС БОКСЫ, но выдает кучу ошибок.
    В чем может быть проблема? Или можно декомпилировать только некторые приложения?

  • Sardor

    11

  • Guest

    BOOMik. Спасибо большое, отличный пост.
    Вот только проблема, при декомпиляции SMS BOX’a (попробовал несколько их). После импорта в Eclipse выдает кучу ошибок. Все делал как описано выше. В чем может быть проблема? Или можно декомпилировать только некторые приложения??

    • http://boomik.ru BOOMik

      Это нормальное явление.Декомпилированный java код не подлежит дальнейшей компиляции, его можно только для изучения алгоритмов использовать. Снова скомпилировать можео smali код.

      • Mikhail Gerasimov

        Подскажите как скомпилировать smali код?

  • David

    Зачем импортировать полученный код в IDE Eclipse если его нельзя скомпилировать, и как это сделать, smali формат непонятно как переделывать

  • rab

    завис на 8 пункте. не сохраняется выдает ошибку и закрывается прога….ну и конечно далее дело не идет(( подскажи что делать?

  • 6pda

    На этапе 11 в командной строке появляется надпись «»apktool» не является внутренней или внешней командой, исполняемой программой или пакетным файлом.» Что делать

    • Svetlana Fadeeva

      тоже самое! что делать с этим?

      • dimvolk

        У меня получилось так: перенес apktool (обе которые в системную бросили) в эту же самую папку, где и все. Далее выходит другое сообщение, что такое уже есть добавьте f (примерно). чтоб такого не было нужно всего лишь переименовать ту первую полученную папку. И все

  • Andrey

    Сможете вынуть исходник одного апк приложения?за оплату разумеется??

  • Andrey

    писать мне на мыло Andruxa.33@mail.ru

  • Sashka777888

    Скажите пожалуйста, а как работать с этими «smali»? Код получается нечитаемым в этих файлах…

  • Сер

    «java» не является внутренней или внешней командой, исполняемой программой или пакетным файлом… помойму это не ок

    • naXa!

      У вас не установлена Java. Или не прописаны пути к ней в системной переменной Path.

  • Эльнур

    У меня JD-GUI вообще ничего не редактирует

    • http://boomik.ru BOOMik

      Он для просмотра

  • maks

    раньше всё декомпилировалось без проблем, теперь вылазит это:

    • http://boomik.ru BOOMik

      Проверяйте путь до apk файла

  • Zero

    народ, помогите!! мне ошибку выдает «Error: Could not find or load main class…» вот скрин http://prntscr.com/2t2kyi . как тсправить эту ошибку? кто знает напиши пожалуйста)

  • Павел Круглей

    Приложения собираются через Microsoft Visual Studio?
    Или как? Что ещё нужно?

    • http://boomik.ru BOOMik

      Стандартно через, например Android Studio, а декомпилированные через apktool

      • Павел Круглей

        спасибо!

      • Павел Круглей

        Что-то он после компиляции не работает(
        Как подключить файлы к приложению?

        • http://boomik.ru BOOMik

          В смысле не работает?
          Не устанавливается или не запускается7

          • Павел Круглей

            Просто чёрный экран, а потом надпись приложение установлено!

  • Алексей

    На 11 пункте не появляются папки. Что не так?

  • Lusser

    На этапе 6 в командной строке появляется надпись «»java» не является внутренней или внешней командой, исполняемой программой или пакетным файлом.»