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



Реп: (232)
было же...



Реп: (152)
Buzzzzer @ 12.03.2012, 14:49 *
было же...

Не видел... Было только декомпиляция в smali...
Если было, удалите :)))



Реп: (0)
Ага и в половине случаев JD-GUI вываливается - не может записать все файлы



Реп: (0)
Bool имеет значения 1 и 0. А true и false это всего лишь для удобства человеков.



Реп: (182)
chihchpok,
ну да, но для разработки используется как раз true и false, так что надо заменять..



Реп: (9)
xradas,
Привет, все сделал что хотел... А как эти файлы снова превратить в apk?



Реп: (182)
akbapuyc, Файлы *.class или *.smali? классы после такой декомпиляции уже в приложение не собрать, приины указаны выше, (ну только если это не приложение Hello World), smali файлы можно скомпилировать.



Реп: (9)
BOOM.vrn,
Декомпилировал swype по выше указаному способу. Нужен был файл colors.xml расположеный в папке values... Менял цвет шрифта слов которые swype выдает как варианты при вводе... Может есть какой ещё способ изменить шрифт чтобы (не разбирать так глубоко) не декомпилировать файлы?

Добавлено 27.03.2012, 20:58:

Цвет шрифта хочу поменять



Реп: (152)
akbapuyc @ 27.03.2012, 21:58 *
BOOM.vrn,
Декомпилировал swype по выше указаному способу. Нужен был файл colors.xml расположеный в папке values... Менял цвет шрифта слов которые swype выдает как варианты при вводе... Может есть какой ещё способ изменить шрифт чтобы (не разбирать так глубоко) не декомпилировать файлы?

Добавлено Сегодня, 21:58:

Цвет шрифта хочу поменять

Попробуйте сделать как написано здесь Новый способ изменения приложений (перевода)



Реп: (9)
xradas,
Только компилированый swype.apk после устоновки на телефон, отказывается работать... Даже когда делаю так - декомпилирую swype, ничего не изменяя компилирую обратно, ставлю на телефон и не работает... Пишет - Произошла неожиданная остановка приложения Swype (процесс com.swype.android.inputmethod. Повторите попытку)... Это от чего может быть? Компилируется неправильно?



Реп: (152)
akbapuyc @ 28.03.2012, 00:12 *
Только компилированый swype.apk после устоновки на телефон, отказывается работать... Даже когда делаю так - декомпилирую swype, ничего не изменяя компилирую обратно, ставлю на телефон и не работает... Пишет - Произошла неожиданная остановка приложения Swype (процесс com.swype.android.inputmethod. Повторите попытку)... Это от чего может быть? Компилируется неправильно?

Подписать не забыли?:)



Реп: (9)
xradas,
Думаю если бы он был не подписан, он бы не встал совсем... А ведь установился!!!!



Реп: (152)
akbapuyc @ 28.03.2012, 12:21 *
radas,
Думаю если бы он был не подписан, он бы не встал совсем... А ведь установился!!!!

Странно... Скиньте мне это приложение, я попробую)



Реп: (6)
Кто знает? При команде - apktool d приложение.apk папка(у меня 12) (разумеется папка и приложение мое в командной строке имена поменял) Выходит такое сообщение -
Destination directory (D:\Decompile\12) already exists. Use -f switch if you wan
t to overwrite it.



Реп: (182)
vladik865, пишет что такая парка уже есть, попробуй в команде дописать -f



Реп: (339)
dex2jar-0.0.9.8
jd-gui 0.3.3

Как декомпилируются выражения switch/case?, когда нарушается порядок следования инструкций:
switch (paramInt)
{
default:
localObject = Integer.valueOf(-1);
case 16777217:

case 16789525:
case 16789526:
}
while (true)
{
return localObject;
localObject = Boolean.valueOf(this.mbBusy);
continue;
localObject = Integer.valueOf(this.mCurrentMode);
continue;
........

Другое нарушение порядка и так же наличие while(true)
public String getTempCaptureThumbnailPath()
{
String str;
if (isIntentMode())
str = null;
while (true)
{
return str;
if (this.mMemoryCard == 0)
{
str = ArcGlobalDef.LAST_INTERNALSDCARD_IMAGE_THUMB_PATH;
continue;
}
str = ArcGlobalDef.LAST_EXTERNALSDCARD_IMAGE_THUMB_PATH;
}
}

public boolean isFront(int paramInt)
{
int i = 1;
if (paramInt == i);
while (true)
{
return i;
i = 0;
}
}

Странное использование for:
public boolean isFront()
{
if (this.mSwapCamera == 1);
for (int i = 1;; i = 0)
return i;
}

Я не проверял как компилируется такой "кривой" код, но он точно местами не понятен



Реп: (124)
vladik865 @ 30.03.2012, 09:27 *
Кто знает? При команде - apktool d приложение.apk папка(у меня 12) (разумеется папка и приложение мое в командной строке имена поменял) Выходит такое сообщение - Destination directory (D:\Decompile\12) already exists. Use -f switch if you want to overwrite it.

То же самое. С опцией -f (force) ничего не меняется. Папка пустая. Для теста создал пустой проект apk. Попробовал декомпилить с apktool. Тоже самое.



Реп: (182)
byostaff @ 30.04.2012, 17:46 *
Destination directory (D:\Decompile\12) already exists. Use -f switch if you want to overwrite it.

Если перевести то можно понять что указанная директория (папка) уже существует.. Попробуйте указать другую. Ключ -f должен перезаписать содержимое папки.



Реп: (0)
:rolleyes: По первых, хочу поблагодарить всех, кто поддерживает этот замечательный сайт!

Я новичок в программировании андроида, по этому хочу попросить подробней рассказать с 13 поста, куда и как:



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



Реп: (0)
Спасибки тебе большое, за то что ответил на мое сообщение.
Я все сделал как ты описал :

10.Помещаем полученную папку в папку src (надо предварительно создать).(Что бы получилась примерно такая структура D:\Decompile\Calculator\src\com\android)
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", изменил в строкем "<name>PROJECT NAME</name>" PROJECT NAME на желаемое название.

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

Как я понимаю в папку с проектом в самом "Eclipse"?
А как потом сделать импорт в самом ECLIPSE и какую именно папку указать в Eclipse, ведь в дириктории "android" у меня их две?

Если можно по подробней, пожалуйста.

Сообщение отредактировал oskarlaik22 - 05.05.12, 23:37


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

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

Сейчас: 28.03.24, 12:31