Полная декомпиляция 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
Причина редактирования: ссылка



Реп: (142)
* Azathtot, да, понимаю, что нужно редактировать только smali и что код запутан .. но почему в коде не находит ни имени картинки, ни текста?? .. я думал, что оно ищет по id, находит название переменной ресурса, тоесть button_name, а дале по этому названию берет значение с соответствующей папки, в зависимости от языка системы .. или этот id тоже закодирован??



Реп: (1607)
* 5ORBEX,
А почему они должны быть в коде начнем с того?
Зачем искать "по имени", когда aapt уже все имена превратил в идентификаторы? А их уже java/dx в константы



Реп: (833)
5ORBEX @ 31.12.20, 12:53 *
но почему в коде не находит ни имени картинки, ни текста??

Скорее всего не там ищите..имя картинки может быть прописано в одном файле..
Текст в другом..
А уже действие кнопки где то в смали..
Это так в двух словах..
Помню переводил как то настройки.. я так и не смог найти один пункт меню..хотя перелопатил все..



Реп: (142)
* Azathtot, если я смотрю java код, там есть класс string, у него публичное поле public const int button_name = 1948285829, например. и если это число перевести с DEC в HEX, то оно будет равно значению того id в ресурсах .. то это и есть та константа, о которой Вы говорите? просто если поискать потом по коду, где еще юзается эта константа, то оно не находит ее больше нигде.

Добавлено 31.12.2020, 14:13:

* upiter707, ну вот конкретно имя картинки вообще нигде не нашел, не понимаю почему.



Реп: (833)
5ORBEX @ 31.12.20, 14:12 *
не понимаю почему

Покурите эту тему на конкретных примерах можно немного разобраться..что где прописано и как работает..



Реп: (0)
Очень давно занимался реверсингом программ на винде (ХР или даже МЕ, в общем очень давно))). Сейчас есть необходимость автоматизировать получение данных из игры (рейтинг команд) и вывод их в отдельный файл для последующего анализа. С помощью GG нашел в памяти массивы, где хранятся имена команд и их рейтинги. Но явной связи между ними не видно. Скажем так - тупик. Поэтому возникает необходимость более глубокого анализа.
Раньше я бы запустил программу, подключился к процессу отладчиком (тогда это был OllyDbg), поставил брэкпоинты на доступ к найденным уже участкам памяти и уже от этого бы начинал плясать.
Можно ли что-то подобное сделать для программы на Андройде? Или по какому пути мне двигаться?
Буду очень благодарен за помощь.



Реп: (0)
А dex2jar есть на андроид?



Реп: (1607)
* ivan-chel,
Так же как и приложение написанное на java. Kotlin герерит java-байткод



Реп: (1607)
* ivan-chel,
Значит остальное попряталось в нативах



Реп: (2)
Менял smali. Cобраный через smali.jar classes.dex совпал по размеру с размером исходного classes.dex от портируемой прошивки. Но собранный через dex2jar jar не совпадает по размеру с исходным. Утилитой JD-GUI я открыл jar, собраный в dex2jar. Оказалось, они не только не совпадают по размеру. Я менял ril*-файлы в папке com/android/internal/telephony на стоковые. JD-GUI показал, что dex2jar названия этих папок объединил в одну общую
https://ibb.co/YbFjwjy
Есть ли другая нормальная альтернатива утилите dex2jar для сборки jar файла из исходников?

Сообщение отредактировал sns - 22.06.21, 20:10



Реп: (1)
А сразу в котлин возможно декомпилировать? или сначала надо в Java, а потом уже внутренними средствами Android Studio переводить ?



Реп: (1607)
moondi @ 30.09.21, 09:31 *
А сразу в котлин возможно декомпилировать?

Нельзя. Котлин и java порождают один и тот же Java-байткод, который потом транслируется в dalvik opcode (smali)
Так что "выражать свои мысли" удобнее на "нативном" языке, а не тот который накрутили над ним.
По сути - котлин это синтаксический сахар для Java

Сообщение отредактировал Azathtot - 30.09.21, 20:08



Реп: (-2)
Подскажите пожалуйста, а как посмотреть исходный код APK файла написанного на c#?



Реп: (1607)
kipzshady @ 09.02.22, 15:51 *
а как посмотреть исходный код APK файла написанного на c#?

Использовать C# декомпиляторы естественно. Тот же dotPeek



Реп: (29)
Добрый день.

Подскажите, где почитать (какой софт - Win) про обратную операцию - компиляция код java в classes.dex



Реп: (1607)
ColonelTY @ 01.05.22, 06:04 *
компиляция код java в classes.dex

javac и dx/d8 из состава Android SDK
Использование
dx --dex --output=file.dex путь к .class файлам

Сообщение отредактировал Azathtot - 01.05.22, 15:03



Реп: (0)
Здравствуйте, подскажите пожалуйста как декомпилировать файл 39285EFA.dex, я не могу декомпилировать выдаёт ошибку при декомпиляции

Прикрепленные изображения
Прикрепленное изображение


Сообщение отредактировал VMOS Pro - 27.06.22, 20:47



Реп: (1607)
* VMOS Pro,
А никак. Это не "чистый" dex файл. Возможно зашифрованный, возможно это просто данные. Да что угодно. Нужно анализировать код и сам файл

Сообщение отредактировал Azathtot - 27.06.22, 21:25



Реп: (0)
* Azathtot, где можно анализировать файл?



Реп: (1607)
* VMOS Pro,
На вашем компьютере, с помощью лучшего анализатора - человеческого мозга.


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

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

Сейчас: 28.03.24, 19:20