Реверс-инжиниринг android приложений
В этой статье я постараюсь рассказать про реверс-инжиниринг приложений для android. Этот процесс несколько отличается от оного для win-приложений: здесь нет отладчика и нет ассемблера, вместо них выступают LogCat и байт-код. Как вы уже догадались, мы будем исследовать приложение с целью его взлома, или, проще говоря, «крякать».
БРИФИНГ
В качестве подопытного кролика я выбрал программу «Multi Mount SD-Card». Ее суть заключается в монтировании flash-накопителя девайса с одновременным доступом к нему системы и пользователя. Дело в том, что по умолчанию android не имеет доступа к смонтированному в данный момент накопителю.
Для пользователей Eclair это не так критично, но вот пользователи Froyo+ писают кипятком не радуются, когда установленные на карту программы вылетают при ее монтировании. Собственно для решения этой проблемы была и написана эта программа. Ах да, программе нужны root права.
Как посмотреть исходный код android приложения? Декомпиляция .apk файла (реверс инжиниринг)
Для начала нам нужен дистрибутив программы, чтобы было что ломать. Но где же его взять? Ведь для этого надо ее купить. Ну, или выпросить у уже купившего человека. Таким человеком стал creage с форума 4pda, который любезно расшарил купленный apk.
Итак, у нас есть дистрибутив, мы уже установили программу, запускаем… И тут бац! Видим окошко с предложением купить лицензию. Отсюда вытекает, что проверка идет через интернет, пробуем отключить — не помогает. Покупателю приложения не дают никаких ключей и логинов, что говорит нам о привязке к чему-то вроде hardware_id или google-аккаунта.
Следовательно у нас есть несколько вариантов взлома: либо захардкодить в программу заведомо правильную проверяемую информацию, либо вырезать из кода все участки, проверяющие валидность лицензии. Я выбрал второй вариант, ибо он мне больше нравится.
Инструментарий
- Apk Manager
- dex2jar
- jd-gui
Введение
Прежде чем приступать, я немного объясню структуру android приложений. Каждое приложение есть файл с расширением apk, упакованный zip’ом. В нем содержатся ресурсы приложения, AndroidManifest.xml и classes.dex. Что же из себя представляет последний? Это байт-код программы, скомпилированный специально для виртуальной машины dalvik.
Получить из него чистый исходный код на java нельзя, но можно получить dalvik opcodes — набор команд для виртуально машины, грубо говоря, это местный ассемблер. А еще можно превратить dex файл в jar, после чего декомпилировать его и получить более-менее читаемый код на java. Чем мы и будем сейчас заниматься.
Декомпиляция
- Копируем multimount.apk в папку apk_managerplace-apk-here-for-modding и запускаем Script.bat. Если все хорошо, то появится консоль с зелеными надписями.
- Необходимо декомпилировать apk. Выбираем одноименный пункт 9. Консоль после этого не закрываем.
- Открываем multimount.apk архиватором и копируем файл classes.dex в папку dex2jar, после чего перетаскиваем его на dex2jar.bat. В Total Commander перетаскивание не работает.
- Появившийся classes.dex.dex2jar.jar открываем с помощью jd-gui. Окно пока не закрываем, оно понадобится позже.
Начало анализа
Как ВЗЛОМАТЬ приложение и получить ИСХОДНЫЙ КОД программы? [Reverse engineering, JetBrains dotPeek]
Для получения начальной информации о приложении посмотрим на его манифест. Из него можно понять, что главным активити являются настройки. Значит код, предлагающий купить приложение, находится где-то там. Еще можно заметить странную строчку в самом низу:
Что же это? Как подсказывает гугл, эта строчка намекает на то, что в приложении используется LVL, то есть менеджер лицензий android. Ну что ж, это даже хорошо, ведь у нас есть документация. Почитав которую, пожно понять, что этот LVL не только управляет лицензиями, но и подвергает код обфускации, что существенно усложнит нам работу.
Ну да ладно, приступим непосредственно к анализу кода. Переключаемся на jd-gui, разворачиваем дерево, и видим три пространства имен: первое — что-то связано с рекламой, второе — набор классов LVL, третье — то, что нам надо.
Заходим в него и видим последствия обфускации. Открываем MultiMountSDCardConfigure, бегло просматриваем код. В глаза сразу бросается длинная строчка с каким-то хэшем. Это base64 public key. А вокруг него находятся и остальные строчки, проверяющие лицензию.
Их нам необходимо выпилить.
- com. android . vending . licensing . h localh = new com. android . vending . licensing . h ( arrayOfByte, str4, str3 ) ;
- v localv = new v ( this , localh ) ;
- m localm1 = new m ( this , localv, «MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAg1. » ) ;
- f = localm1 ;
- m localm2 = f ;
- j localj = e ;
- localm2. a ( localj ) ;
Открываем apk_managerprojectsmultimount.apksmalicomrafoidmultimountsdcardwidgetMultiMountSDCardConfigure.smali и видим байт-код. Прежде чем читать дальше, советую сначала просмотреть список команд. Нам необходимо найти те самые строчки и закоментить их. Вот они:
- .
- #iput-object v1, p0, Lcom/rafoid/multimountsdcard/widget/MultiMountSDCardConfigure;->e:Lcom/android/vending/licensing/j;
- #new-instance v1, Lcom/android/vending/licensing/m;
- #new-instance v2, Lcom/android/vending/licensing/v;
- #new-instance v3, Lcom/android/vending/licensing/h;
- #sget-object v4, Lcom/rafoid/multimountsdcard/widget/MultiMountSDCardConfigure;->d:[B
- #invoke-virtual , Lcom/rafoid/multimountsdcard/widget/MultiMountSDCardConfigure;->getPackageName()Ljava/lang/String;
- #move-result-object v5
- #invoke-direct , Lcom/android/vending/licensing/h;->([BLjava/lang/String;Ljava/lang/String;)V
- #invoke-direct , Lcom/android/vending/licensing/v;->(Landroid/content/Context;Lcom/android/vending/licensing/n;)V
- #const-string v0, «MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCg. «
- #invoke-direct , Lcom/android/vending/licensing/m;->(Landroid/content/Context;Lcom/android/vending/licensing/k;Ljava/lang/String;)V
- #iput-object v1, p0, Lcom/rafoid/multimountsdcard/widget/MultiMountSDCardConfigure;->f:Lcom/android/vending/licensing/m;
- #iget-object v0, p0, Lcom/rafoid/multimountsdcard/widget/MultiMountSDCardConfigure;->f:Lcom/android/vending/licensing/m;
- #iget-object v1, p0, Lcom/rafoid/multimountsdcard/widget/MultiMountSDCardConfigure;->e:Lcom/android/vending/licensing/j;
- #invoke-virtual , Lcom/android/vending/licensing/m;->a(Lcom/android/vending/licensing/j;)V
- .
Закоменчиваем, сохраняем. Вроде как, все, можно пользоваться. Осталось только скомпилить и установить.
Компиляция и установка
- Если вы ещё не закрыли окно консоли, переключаемся на него и выбираем пункт 14. Скрипт сам скомпилит, подпишет и установит apk на девайс.
- Запускаем приложение и видим, что теперь нам не предлагают ничего покупать, но окошко с процессом проверки висит и не закрывается.
Опять анализ
Теперь нам необходимо обнаружить и удалить код, показывающий ненужный нам диалог. Переключаемся на jd-gui и находим чуть выше следующие строчки:
- rogressDialog localProgressDialog = ProgressDialog.show(this, str1, str2, 1, 0);
- b = localProgressDialog;
Теперь надо найти их в MultiMountSDCardConfigure.smali. Вот они:
- .
- #invoke-static , Landroid/app/ProgressDialog;->show(Landroid/content/Context;Ljava/lang/CharSequence;Ljava/lang/CharSequence;ZZ)Landroid/app/ProgressDialog;
- #move-result-object v0
- #iput-object v0, p0, Lcom/rafoid/multimountsdcard/widget/MultiMountSDCardConfigure;->b:Landroid/app/ProgressDialog;
- .
Закоменчиваем, сохраняем, компилим, устанавливаем, запускаем. Ура! Все работает. Но после непродолжительного тестирования мы понимаем что работает не совсем все, а именно функция авто-монтирования. Переключаемся на jd-gui, открываем MultiMountSDCardWidget$UpdateService и видим следующий кривой код:
- if (MultiMountSDCardWidget.b.booleanValue());
- int j;
- for (int i = 0; ; j = 1)
- Boolean localBoolean = Boolean.valueOf(i);
- RemoteViews localRemoteViews = MultiMountSDCardWidget.a(this, localBoolean);
- Class localClass = MultiMountSDCardWidget.a;
- ComponentName localComponentName = new ComponentName(this, localClass);
- AppWidgetManager.getInstance(this).updateAppWidget(localComponentName, localRemoteViews);
- return;
- >
Именно этот сервис отвечает за авто-монтирование. В самом начале мы видим какую-то проверку, в результате которой выполняется это самое монтирование. Код проверяет переменную b из главного активити, ту самую переменную, объявление которой мы закоментили, удаляя диалог. Так же мы поступим и с этой проверкой — закоментим ее к черту.
На сей раз открываем MultiMountSDCardWidget$UpdateService.smali и закоменчиваем следующие строчки:
- .
- .method public onStart(Landroid/content/Intent;I)V
- .locals 3
- #sget-object v0, Lcom/rafoid/multimountsdcard/widget/MultiMountSDCardWidget;->b:Ljava/lang/Boolean;
- #invoke-virtual , Ljava/lang/Boolean;->booleanValue()Z
- #move-result v0
- #if-eqz v0, :cond_0
- const/4 v0, 0x0
- :goto_0
- invoke-static , Ljava/lang/Boolean;->valueOf(Z)Ljava/lang/Boolean;
- move-result-object v0
- invoke-static , Lcom/rafoid/multimountsdcard/widget/MultiMountSDCardWidget;->a(Landroid/content/Context;Ljava/lang/Boolean;)Landroid/widget/RemoteViews;
- move-result-object v0
- new-instance v1, Landroid/content/ComponentName;
- sget-object v2, Lcom/rafoid/multimountsdcard/widget/MultiMountSDCardWidget;->a:Ljava/lang/Class;
- invoke-direct , Landroid/content/ComponentName;->(Landroid/content/Context;Ljava/lang/Class;)V
- invoke-static , Landroid/appwidget/AppWidgetManager;->getInstance(Landroid/content/Context;)Landroid/appwidget/AppWidgetManager;
- move-result-object v2
- invoke-virtual , Landroid/appwidget/AppWidgetManager;->updateAppWidget(Landroid/content/ComponentName;Landroid/widget/RemoteViews;)V
- return-void
- #:cond_0
- const/4 v0, 0x1
- goto :goto_0
- .end method
- .
Запускаем и радуемся, что сэкономили целых 30 рублей на покупке этой полезнейшей программы.
Примечания
Процесс описан целиком для Windows, но легко может быть повторен и на Linux, так как все необходимые библиотеки кроссплатформенны.
Уже после написания статьи я наткнулся на на вот этот способ взлома, но, насколько я понимаю, он актуален для ранних версий LVL.
Вся информация представлена исключительно в ознакомительных целях. А так же для разработчиков, с целью улучшения программной защиты.
Источник: habr.com
Есть ли способ получить исходный код из файла APK?
Жесткий диск моего ноутбука только что вышел из строя, и я потерял весь исходный код приложения, над которым я работал последние два месяца. Все, что у меня есть, это файл APK, который хранится в моем письме, когда я отправил его другу.
Есть ли способ извлечь мой исходный код из этого файла APK?
user426041 29 авг ’10 в 03:40 2010-08-29 03:40
2010-08-29 03:40
32 ответа
Простой способ: используйте онлайн-инструмент http://www.javadecompilers.com/apk, загрузите apk и получите исходный код.
Процедура декодирования.apk файлов, пошаговый метод:
Шаг 1:
- Создайте новую папку и скопируйте файл.apk, который вы хотите декодировать.
- Теперь переименуйте расширение этого файла.apk в.zip (например, переименуйте из filename.apk в filename.zip) и сохраните его. Теперь вы можете получить доступ к файлам classes.dex и т. Д. На этом этапе вы можете видеть графические объекты, но не файлы XML и Java, поэтому продолжайте.
Шаг 2:
- Теперь распакуйте этот ZIP-файл в ту же папку (или НОВУЮ ПАПКУ).
- Скачайте dex2jar и распакуйте его в ту же папку (или в NEW FOLDER).
- Переместите файл classes.dex в папку dex2jar.
Шаг 3:
Теперь откройте еще одну новую папку
- Поместите в файл.apk, который вы хотите декодировать
- Загрузите последнюю версию apktool и окно установки apktool (обе можно скачать по одной и той же ссылке) и поместите их в одну папку
- Откройте командное окно
- Теперь запустите команду как apktool if framework-res.apk и следующий
- apktool d myApp.apk (где myApp.apk обозначает имя файла, который вы хотите декодировать)
теперь вы получаете папку с файлами в этой папке и можете легко читать xml-файлы apk.
Шаг 4:
Это не какой-либо шаг, просто скопируйте содержимое обеих папок (в данном случае обе новые папки) в одну
и наслаждайтесь исходным кодом.
user763908 21 май ’11 в 11:20 2011-05-21 11:20
2011-05-21 11:20
Это альтернативное описание — на случай, если кто-то застрянет с описанием выше. Следуйте шагам:
- скачать apktool.bat (или же apktool для Linux) и apktool_.jar от http://ibotpeaches.github.io/Apktool/install/
- переименуйте файл jar сверху в apktool.jar и поместите оба файла в одну папку
- откройте дос дос ( cmd.exe ) и перейдите в эту папку; убедитесь, что установлена среда Java (для Linux также проверьте примечания относительно необходимых библиотек)
- Начните: apktool decode [apk file] Промежуточный результат: файлы ресурсов, AndroidManifest.xml
- распакуйте APK файл с распаковщиком на ваш выбор Промежуточный результат: classes.dex
- скачать и извлечь dex2jar-0.0.9.15.zip со http://code.google.com/p/dex2jar/downloads/detail?name=dex2jar-0.0.9.15.zipq=
- перетащить classes.dex на dex2jar.bat (или введите dex2jar.bat classes.dex в коробке DOS; для использования Linux dex2jar.sh ) Промежуточный результат: classes_dex2jar.jar
- распаковывать classes_dex2jar.jar (может быть необязательным в зависимости от используемого декомпилятора)
- декомпилируйте ваши файлы классов (например, с помощью JD-GUI или DJ Decompiler) Результат: исходный код
Примечание: нельзя декомпилировать сторонние пакеты; это руководство предназначено для восстановления личного исходного кода только из файла APK; наконец, результирующий код, скорее всего, будет запутан
user2092587 13 мар ’13 в 20:09 2013-03-13 20:09
2013-03-13 20:09
Хотя вы можете декомпилировать APK файл, вы, вероятно, столкнетесь с одной большой проблемой:
он не вернет код, который вы написали. Вместо этого он будет возвращать все, что встроено компилятором, с переменными с произвольными именами, а с функциями с произвольными именами. Может потребоваться значительно больше времени, чтобы попытаться декомпилировать и восстановить его в код, который вы имели, чем это будет начинаться заново.
К сожалению, такие вещи убили много проектов.
В будущем я настоятельно рекомендую изучить систему контроля версий, такую как CVS, SVN, git и т. Д.
и как это поддержать.
user432542 29 авг ’10 в 03:58 2010-08-29 03:58
2010-08-29 03:58
В Play Store также есть новое приложение, с помощью которого можно декомпилировать apk (системные приложения тоже) и просматривать исходный код прямо на вашем смартфоне. Он сохраняет файлы на вашей SD-карте, чтобы вы могли просматривать их и на своем компьютере. Не требует рута или чего-то еще.
Просто установите и получайте удовольствие. Я думаю, что это самый простой способ декомпилировать приложение.
user2047987 11 янв ’14 в 12:49 2014-01-11 12:49
2014-01-11 12:49
apktool — лучшая вещь, которую вы можете попробовать. Я сохранил некоторые XML с ним, но, честно говоря, я не знаю, как это будет работать с кодом.java.
Я бы порекомендовал вам иметь хранилище кода, даже если вы единственный кодер. Я использую Project Locker для своих собственных проектов. Это дает вам бесплатные репозитории SVN и GIT.
user119895 29 авг ’10 в 12:17 2010-08-29 12:17
2010-08-29 12:17
Эти две статьи описывают, как сочетать использование apktool а также dex2jar взять APK файл и создать проект Eclipse, который может собрать и запустить его.
- использование apktool получить файлы ресурсов из apk
- использование dex2jar чтобы получить файл jar, содержащий классы в формате, который понравится Eclipse.
- Создайте проект Eclipse, наведите его на файлы ресурсов и новый файл jar
- Откройте файл jar утилитой zip и удалите существующие ресурсы
- Откройте файл JAR с JDGui просмотреть исходный код
- Возьмите любой исходный код, который вам нужен JDGui вставьте его в класс внутри Eclipse и измените его
- Удалите этот класс из файла jar (чтобы один и тот же класс не определялся несколько раз)
- Запустить его.
user6839 06 дек ’12 в 01:38 2012-12-06 01:38
2012-12-06 01:38
apktool будет работать. Вам даже не нужно знать хранилище ключей для извлечения исходного кода (что немного страшно). Основным недостатком является то, что источник представлен в формате Smali вместо Java. Другие файлы, такие как icon и main.xml, проходят отлично, хотя, возможно, стоит хотя бы восстановить их. В конечном итоге вам, скорее всего, придется переписывать код Java с нуля.
Вы можете найти apktool здесь. Просто скачайте apktool и соответствующий помощник (для Windows, Linux или Mac OS). Я рекомендую использовать такой инструмент, как 7-zip, чтобы распаковать их.
user330204 29 авг ’10 в 04:02 2010-08-29 04:02
2010-08-29 04:02
Есть несколько способов сделать это:
- Используйте функцию «Профиль или Отладка APK» в Android Studio 3.0. Это позволяет открывать и изучать APK в Android Studio. Классы декомпилированы в smali. Ресурсы не извлекаются, а такие вещи, как «Перейти к определению», «Найти все ссылки» и отладка, не работают без исходного кода (android studio 3.0 canary 9). Некоторые дополнительные функции smali могут работать с smallidea.
- Используйте jadx. Jadx декомпилирует код в данном APK в исходные файлы Java.
- Используйте apktool. Apktool — это инструмент командной строки, который извлекает ресурсы и декомпилирует код в smali для данного apk. Вы также можете перекомпилировать, используя apktool. Вот пример этого в действии:
$ apktool d test.apk I: Using Apktool 2.2.4 on test.apk I: Loading resource table. I: Decoding AndroidManifest.xml with resources. I: Loading resource table from file: 1.apk I: Regular manifest package. I: Decoding file-resources. I: Decoding values */* XMLs. I: Baksmaling classes.dex.
I: Copying assets and libs. I: Copying unknown files. I: Copying original files. $ apktool b test I: Using Apktool 2.2.4 on test I: Checking whether sources has changed. I: Smaling smali folder into classes.dex. I: Checking whether resources has changed. I: Building resources. I: Building apk file.
I: Copying unknown files/dir.
user2456263 11 авг ’17 в 03:27 2017-08-11 03:27
2017-08-11 03:27
Может быть, легко увидеть источник:
В Android Studio 2.3 Build -> Analyze APK -> Select the apk that you want to decompile ,
Вы увидите его исходный код.
user1584121 25 май ’17 в 14:06 2017-05-25 14:06
2017-05-25 14:06
Я покажу вам другой способ декомпиляции файлов .apk.
Вы можете выполнить первые 2 шага из «Пранкуль Гарг». Так что у вас есть другие возможности:
Шаг 3′:
Загрузите «JD-GUI», это легко найти. Откройте файл .jar в «jd-gui.exe». (Файл> Открыть файл> «нашел ваш .jar файл»). После этой процедуры вы можете сохранить все ресурсы в файле .zip.
1-й — Вы должны переименовать файл .apk в .zip
2-й — Вы должны декодировать файл .dex (если хотите, декодируйте файл .apk в dex2jar, это возможно)
3-й — Вы должны декодировать файл .jar с помощью JD-GUI.
user1082015 25 фев ’13 в 12:22 2013-02-25 12:22
2013-02-25 12:22
В зависимости от вашего состояния, если ваш Android APK:
Условие 1: НЕ затвердевать (от Tencent Legu/Qihoo 360/. )
Выбор1: с помощью онлайн-сервиса
используя www.javadecompilers.com
- http://www.javadecompilers.com/apk
- Примечание: внутренне используя Jadx
автоматически декодировать из АПК в исходный код Java
upload apk file + click Run + подождите некоторое время + нажмите Download чтобы получить zip + unzip ->
ваш ожидаемый исходный код Java
Choice2: декомпилировать / взломать самостоятельно
Используйте соответствующий инструмент для декомпиляции / взлома самостоятельно:
использование jadx / jadx-gui перерабатывать apk в java sourcecode
скачайте jadx-0.9.0.zip, затем распакуйте, чтобы получить bin/jadx , затем:
- режим командной строки:
- в терминальном прогоне: jadx-0.9.0/bin/jadx -o output_folder /path_to_your_apk/your_apk_file.apk
- output_folder покажет расшифрованный sources а также resources
- sources/com// ваше ожидание java sourcecode
- двойной щелчок для запуска jadx-0.9.0/bin/jadx-gui (В Linux jadx-gui.sh / Windows jadx-gui.bat )
- открыть apk файл
- это будет автоматическое декодирование -> увидеть ожидаемый исходный код Java
- save all или же save as Gradle project
Условие 2: закалка (Tencent Legu/Qihoo 360/. )
основной метод 3 steps :
- apk/app to dex
- dex to jar
- jar to java src
Шаг 1: apk/app to dex
использовать инструмент ( FDex2 /DumpDex) dump / hook (один или несколько) dex файл из запущенного приложения
подготовить среду
- root Эд андроид
- настоящий телефон
- или эмулятор
- здесь, используя китайскийNox App Player夜 夜 安卓模拟器


сбросить из dex из запущенного приложения
- бежать FDex2 затем нажмите на свое имя apk, чтобы позже включить / захватить dex

Шаг 2: dex to jar
использовать инструмент ( dex2jar ) конвертировать (конкретную, содержащую логику приложения) dex подать в jar файл
скачать dex2jar получил dex-tools-2.1-SNAPSHOT.zip, распаковать получил dex-tools-2.1-SNAPSHOT/d2j-dex2jar.sh , затем
sh dex-tools-2.1-SNAPSHOT/d2j-dex2jar.sh -f your_dex_name.dex
dex-tools-2.1-SNAPSHOT/d2j-dex2jar.sh -f com.xxx.yyy8825612.dex dex2jar com.xxx.yyy8825612.dex -> ./com.xxx.yyy8825612-dex2jar.jar
Шаг 3: jar to java src
используйте один из инструментов:
перерабатывать jar в java src
для преобразования из jar в java src:
Jadx > Procyon > CRF >> JD-GUI
поэтому рекомендуем использовать: Jadx / jadx-gui
- двойной щелчок для запуска jadx-gui
- открыть dex файл
- File -> save all
экспортированный источник Java:
Более подробное объяснение можно посмотреть в моей онлайн-книге китайского учебника:
- 安卓应用的安全和破解
- Исходный код учебника на github: https://github.com/crifan/android_app_security_crack
Источник: stackru.com