Полная декомпиляция Android приложений | [Декомпиляция приложений в исходный Java код]



Реп: (152)
Полная декомпиляция Android приложений, декомпиляция приложений в исходный Java код

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

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

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

Инструкцию буду проводить для ОС Windows.
  1. Качаем dex2jar-0.0.9.8.zip (номер версии может изменяться) и извлекаем все файлы в желаемую папку, например D:\Decompile .
  2. Качаем Java Decompiler, я использовал JD-GUI и извлекаем файлы для удобства в ту же папку, куда и dex2jar.
  3. Качаем apktool и apktool-install-windows-r04-brut1.tar.bz2 и извлекаем файлы уже в системную папку. По умолчанию C:\Windows. (Не забываем скачать второй архив)
  4. Берем нужный apk файл и кладем в папку с dex2jar и Java Decompiler. В примере приведу декомпиляцию приложения Прикрепленный файлCalculator.zip ( 66.18 КБ )
    . (надо извлечь из архива).
  5. Открываем Командную строку (Обработчик команд Windows) в вышеупомянутой папке (В папке по пустому месте при зажатой кнопке Shift нажимаем правую кнопку мыши и выбираем Обработчик команд Windows).
  6. Вводим команду dex2jar Calculator.apk и если все прошло хорошо, в той же папке появится файл Calculator.apk.dex2jar.jar
  7. Запускаем jd-gui и открываем полученный на предыдущем шаге файл. (На Windows 7 открывать с правами администратора и с совместимостью Windows XP SP3)
  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), тогда положите содержимое этого архива(Прикрепленный файлEclipse.zip ( 1.44 КБ )
) в папку с проектом, предварительно изменив на третьей строке <name>PROJECT NAME</name> PROJECT NAME на желаемое название, в моем примере «Calculator» в файле .project
P.P.S. Если apk файл был пропущен при компиляции через обфускатор (proguard), тогда полученный код будет плохо читаем.
Источник: http://boomik.ru/polnaya-dekompilyaciya-android-prilozhenij

Сообщение отредактировал KEEPERekb - 09.06.15, 14:51
Причина редактирования: ссылка



Реп: (198)
dmitri.s.1976,
Вот как-то так.
Прикрепленный файлJBed_build_195487_hs_mod.zip ( 2.47 МБ )



Реп: (11)
лог
C:\Documents and Settings\Администратор>d2j-dex2jar.bat www.apk
dex2jar www.apk -> www-dex2jar.jar
java.io.FileNotFoundException: File 'www.apk' does not exist
at org.apache.commons.io.FileUtils.openInputStream(FileUtils.java:56)
at org.apache.commons.io.FileUtils.readFileToByteArray(FileUtils.java:40)
at com.googlecode.dex2jar.reader.DexFileReader.<init>(DexFileReader.java:247)
at com.googlecode.dex2jar.tools.Dex2jarCmd.doCommandLine(Dex2jarCmd.java:103)
at com.googlecode.dex2jar.tools.BaseCmd.doMain(BaseCmd.java:168)
at com.googlecode.dex2jar.tools.Dex2jarCmd.main(Dex2jarCmd.java:34)

C:\Documents and Settings\Администратор>dex2jar www.apk
this cmd is deprecated, use the d2j-dex2jar if possible
dex2jar version: translator-0.0.9.13
dex2jar www.apk -> www_dex2jar.jar
. while process file: [www.apk]
.. ROOT cause:
java.io.FileNotFoundException: File 'www.apk' does not exist
at org.apache.commons.io.FileUtils.openInputStream(FileUtils.java:56)
at org.apache.commons.io.FileUtils.readFileToByteArray(FileUtils.java:40)
at com.googlecode.dex2jar.reader.DexFileReader.readDex(DexFileReader.java:150)
at com.googlecode.dex2jar.v3.Main.doFile(Main.java:63)
at com.googlecode.dex2jar.v3.Main.main(Main.java:86)
Done.


Что это значит?



Реп: (182)
narttamerlan,
это значит что dex2jar не может найти файл www.apk



Реп: (176)
narttamerlan, пробелы и кириллицу убирайте в путях :)



Реп: (11)
BOOM.vrn @ 03.04.2013, 22:10 *
это значит что dex2jar не может найти файл www.apk

видит! При этом он создает папку 1.апк а в ней папка smali, то есть декомпилирует но не до конца! (а распаковывает нормально)

Nfc666 @ 03.04.2013, 22:18 *
пробелы и кириллицу убирайте в путях

нет там ни того ни другого!

*апк репак тоже доконца декомпилировать его не может, и хмл в нем (если просто распаковать) зашифрованные какие-то

то есть вообще ниче не пойму :sveta:



Реп: (81)
xradas @ 11.03.2012, 18:45 *
11. Опять же в командной строке вводим команду apktool d Calculator.apk Calculator, где Calculator.apk-имя пакета, Calculator-папка для декомпиляции
Что-то я запутался. Из какой папки cmd запускать?



Реп: (176)
zackary, из той, где apktool лежит.



Реп: (14)
После dex2jar и jd-gui в одном из файлов обнаружен код вида
if(getS()) str="";
do
{
return str;
//тут много полезного кода который как бы как раз и должен выполняться и возвращать данные
}
Это такая защита от декомпиляции, какой-то косяк или мы что-то в java не до конца понимаем?

При чем параллельно по коду полно еще ситуаций вплоть до
while (true)
{
return false;
//куча полезного кода который как бы как раз и должен выполняться.

Сообщение отредактировал edogs - 14.04.13, 02:55



Реп: (176)
edogs, да нет, это не защита.
Если вы когда-нибудь играли в испорченный телефон, то это как раз подобная ситуация: ява - компилятор опкод - декомпиль - ява . )))
Такая уж вынужденная интерпретация кода у декомпилятора . Загляните в smali код, чтобы понять, почему декомпилятор выдает такие сложные и абсурдные к восприятию конструкции.

Сообщение отредактировал Nfc666 - 14.04.13, 12:16



Реп: (14)
Nfc666 @ 14.04.2013, 13:12 *
Загляните в smali код, чтобы понять, почему декомпилятор выдает такие сложные и абсурдные к восприятию конструкции.
Спасибо, стало понятнее где копать.
А не подскажите нормальный мануал по smalli ? Нагуглить что-то вразумительное не удалось сразу.
А конструкции там какие-то странные.
line 11 идет после line 15, в smalli 3 строки с iput-object но при это jdgui говорит только о 2 присвоениях.

Да и идущие подряд конструкции
move-object/from16 v17, v0
move-object/from16 v0, v17
больше ассоциируются с "кручу верчу запутать хочу".
Ассемблер вроде для pc в свое время изучали, но это было 15 лет назад, поэтому есть ощущение что знания слегка устарели:)
Помогите в общем ссылкой на грамотный мануал пожалуйста.

p.s.: судя по всему do { return true; конструкции появляются когда в smalli идет опережающий goto далеко вперед по коду, при чем в jdgui goto вообще нигде нет - вопрос - jd gui вообще goto не понимает?

p.p.s.: если jdgui так криво декомилирует, как же мы потом apk будем собирать после правок?

Сообщение отредактировал edogs - 14.04.13, 18:08



Реп: (14)
Как-то непонятно с нумерацией строк.
Почему идет 148, 200, 151 ? Какой смысл в этих line пометках?

if-ge v0, v1, :cond_1

.line 148
const-string v12, ""

.line 200
:cond_0
:goto_0
return-object v12

.line 151
:cond_1


Сообщение отредактировал edogs - 14.04.13, 20:31
Причина редактирования: поняли ошибку, уточнили вопрос



Реп: (176)
edogs,
А не подскажите
нормальный мануал по
smalli ? Нагуглить что-то
вразумительное не удалось
сразу.

http://pallergabor.uw.hu/androidblog/dalvik_opcodes.html

http://habrahabr.ru/post/127637/


Объэктно-ориентированный ассемблер, что ж вы хотели:)
В опкоде нет циклов, поэтому они реализуются с помощью goto , if и меток. Отсюда и сложности интерпретации.))

если jdgui так криво
декомилирует, как же мы
потом apk будем собирать
после правок?

А никто его и не использует для этих целей на чем-то сложнее, чем "Хелоу, Ворд!" . Код нерабочий в абсолютном большинстве случаев. Нет, не то чтобы это нереально - реально, просто много времени отнимет исправление ошибок декомпилятора, и чем больше, сложнее код, тем астрономичние объем работ. Используйте как средство просмотра, а правка и перекомпиляция - смали.
Вобще, все зависит от задачи. Для внесения не очень больших изменений в код , смали хорошо подходит. Если-же изменения носят глобальный характер, типа переписать пол объемного класса и т.п. , то тут использование jdgui для последующего импорта в Эклипс оч даже может быть оправдано.

Нумерация строк используется при отладке, её можно безболезненно удалять(но не советую) или добавлять от себя. Если код падает, то в логах увидите этот номер , на котором произошло падение.
По-моему, jdgui также использует нумерацию для восстановления "линейности" кода.



Реп: (0)
Не могу понять пункты 10 и 11.
После 9 пункта у меня 4 папки- com, org, android az. az- название apk файла.
Эти файлы я закинул в F:\Decompile\az\src
Далее в командной строке пишу:
F:\Decomplite>apktool d az.apk az
Error: Unnable to access jarfile F:\Decomplite\\apktool.jar

Как правильно надо сделать?



Реп: (0)
всем привет! в общем по гуглу, эта тема самая близкая к моему вопросу, оочень надеюсь на конструктивный ответ. а проблема вот в чем: есть прога на дройде tTorrent pro, и в ней есть функция смены порта, задать можно в диапазоне с 1024 до 65к с хвостиком. тоесть если захочу поставить порт 500 то скидывает за 1024. Очень надо убрать это досадное ограничение. посоветуйте пожалуйста как сделать это грамотно без лишних манипуляций.



Реп: (545)
AlphaSwarm @ 19.4.2013, 2:16 *
всем привет! в общем по гуглу, эта тема самая близкая к моему вопросу, оочень надеюсь на конструктивный ответ. а проблема вот в чем: есть прога на дройде tTorrent pro, и в ней есть функция смены порта, задать можно в диапазоне с 1024 до 65к с хвостиком. тоесть если захочу поставить порт 500 то скидывает за 1024. Очень надо убрать это досадное ограничение. посоветуйте пожалуйста как сделать это грамотно без лишних манипуляций.
Это в тему apktool пиши. Тут ты разобрать приложение сможешь в java, а собрать не сможешь, поэтому тебе нужно smali.

Добавлено 21.04.2013, 03:37:

А еще лучше зайди в тему tTorrent тут (на 4pda) и посмотри, наверняка уже есть решение/лечение этой фичи.



Реп: (0)
Помогите пожалуйста декомпилировать.

Прикрепленные файлы

Прикрепленный файлcom.wysie.wydialer.apk ( 172.74 КБ )



Реп: (545)
01guest @ 25.4.2013, 19:49 *
Помогите пожалуйста декомпилировать.
Возможно вы очень удивитесь, но в шапке есть инструкция.



Реп: (176)
Никита Pro Android, может компа у него нет )))

01guest, вот неплохая прога появилась , попробуйте JaDX - Android decompiler :)



Реп: (0)
Никита Pro Android, спасибо за идеи, но пока некого не нашел. :/ а у вас андроид с рут правами? если да то можете проверить в tTorrent поставить порт допустим 700, зафиксирует он его или нет. в любом случае спасибо за участие.



Реп: (545)
AlphaSwarm @ 5.5.2013, 2:56 *
Никита Pro Android, спасибо за идеи, но пока некого не нашел. :/ а у вас андроид с рут правами? если да то можете проверить в tTorrent поставить порт допустим 700, зафиксирует он его или нет. в любом случае спасибо за участие.
Нет, у меня рута пока нет (1 месяц до конца гарантии).


Полная версия   Текстовая версия

Помощь   Правила

Сейчас: 28.03.24, 17:54