Модификация исходного кода android-приложения с использованием apk-файла
Так уж получилось, что приложение для чтения комиксов и манги, которое я использую на своем android-смартфоне, после обновления стало показывать рекламу в конце каждой главы комикса. Данное приложение пару лет назад было доступно на Google Play (платная версия которого и была мной куплена), но было удалено в силу «нарушения авторских прав», после чего ушло в подполье и стало распространятся через сайт разработчика. Увы, достойных альтернатив этому приложению на android и iOS я не нашел, но и смотреть рекламу особо не было желания, тем более я уже покупал версию без рекламы. Сам разработчик почему-то не сделал возможности отключить ее, а на просьбы добавить такую возможность не отозвался. Поэтому пришлось искать альтернативные методы ее отключения. Первое, что пришло в голову, это то, что android-приложения пишутся на java, а значит есть вероятность, что автор не обфусцировал свое приложение и его можно попытаться декомпилировать. Немного подумав, я приступил к работе.
Для начала был загружен сам apk-файл приложения. Затем недолгий поиск по интернету привел меня на сайт http://www.decompileandroid.com/. С его помощью можно было загрузить apk-файл с приложением и на выходе получить набор исходников. Увы, декомпиляция в java-классы происходит не совсем идеально и поэтому восстановить полностью сам проект приложения в IDE(Idea) у меня не получилось, но это позволило проанализировать саму структуру проекта и разобраться как он примерно работает. После проведения анализа, было найдено два перспективных метода в классе BaseReaderFragment.java – placeAdViewIfNeeded и removeAdViewIfNeeded.
Код метода placeAdViewIfNeeded:
if (adViewPlaced || adView == null) < return; >else
Самое простое, что пришло на ум после чтения кода, это убрать все лишнее, и оставить лишь вызов return;
Но, как уже было сказано, даже если бы я изменил в java-классе что-либо, я бы не смог в итоге скомпилировать приложение в IDE. Поэтому пришлось искать альтернативу. Оказалось, что smali-файлы, которые создаются в процессе декомпиляции, позволяют также после внесения нужных изменений, вновь собрать модифицированное приложение. Увы, сайт, что был приведен выше, позволял лишь получать исходники, но не собирать новые. Поэтому пришлось искать способы сделать это самостоятельно.
Была найдена утилита ApkTools, которая позволяла декомпилировать и компилировать apk-файлы. Кроме того, потребовалась утилита aapt.exe, которая была взята мной из стандартного SDK под андроид в папке android-sdk\build-tools\20.0.0.
Для удобства вызова утилиты из под windows был создан скрипт apktool.bat:
@echo off set PATH=%CD%;%PATH%; java -jar "%~dp0\apktool.jar" %1 %2 %3 %4 %5 %6 %7 %8 %9
Для декомпиляции приложения были выполнены команды:
apktool if .apk apktool d .apk
После чего, в полученных исходниках был найден файл BaseReaderFragment.smali и нужные нам методы были изменены следующим образом:
.method protected placeAdViewIfNeeded(Landroid/view/ViewGroup;)V .locals 3 .param p1, "layoutAds" # Landroid/view/ViewGroup; .prologue const/4 v2, -0x2 return-void .end method .method protected removeAdViewIfNeeded(Landroid/view/ViewGroup;)V .locals 1 .param p1, "layoutAds" # Landroid/view/ViewGroup; .prologue .line 149 const/16 v0, 0x8 return-void .end method
Далее пришла очередь сборки apk-файла из исходников.
Сделать это можно cледующей командой:
apktool b
Но это еще не все. Чтобы приложение можно было установить, его нужно было подписать цифровой подписью. Самый простой способ сделать это – это скачать архив в котором находится утилита для подписи приложений и цифровые сертификаты к ней.
Распаковываем архив, выполняем команду:
java -jar signapk.jar certificate.pem key.pk8 .apk .apk
Полученный apk-файл можно загружать на телефон, чтобы проверить наше модифицированное приложение. Однако в процессе тестирования изменений оказалось, что объявления больше не показываются, однако сама страница для их показа создается, что не очень приятно. Снова был проанализирован код приложения, найден класс BaseSeamlessReaderFragment, а в нем метод appendPages.
В нем было видно, что строчка:
addPage(new MangaPage(i - 1, null, chapteritem, true), false);
создает дополнительную страницу, помимо тех, что есть в главе манги, с параметром, отвечающим за показ объявлений. Было решено удалить эту строчку и посмотреть результат. Снова заглядываем в аналогичный smali-файл(BaseSeamlessReaderFragment$4) и удаляем строчку:
invoke-virtual , Lorg/mangawatcher/android/fragments/BaseSeamlessReaderFragment;->addPage(Lorg/mangawatcher/android/fragments/BaseSeamlessReaderFragment$MangaPage;Z)V
Снова проводим сборку apk-файла из исходников и подписываем наше приложение. После установки и тестирования приложения экран с рекламой окончательно исчез, что и было конечной целью.
Данный пример показывает, что в случае необходимости можно довольно просто и быстро модифицировать уже существующие android-приложения, чтобы добавить в них недостающий функционал или наоборот удалить некоторые нежелательные возможности в тех ситуациях, когда доступа к исходникам нет. Надеюсь он поможет людям, которые попали в похожую ситуацию и не хотят мирится с ней, найти решение проблемы.
- android
- декомпиляция
- разработка под android
- reverse engineering
- Информационная безопасность
- Разработка под Android
Как получить исходный код из .apk-файла?
Какого плана ответ Вы хотите получить? Полный процесс декомпиляции, думаю, никто описывать не будет, но Вы можете найти множество информации в интернете по запросу, например, «декомпиляция apk», а потом задать какой-то конкретный вопрос. Но вообще дело это непростое и не всегда результативное.
2 сен 2016 в 19:07
apk не содержит исходного кода, следовательно никак.
2 сен 2016 в 22:16
2 ответа 2
Сортировка: Сброс на вариант по умолчанию
apk содержит только байт-код (файлы .smali, а не исходники), который можно получить утилитой apktool (или другими на ее основе). Байт-код можно преобразовать в java-код утилитами dex2jar и в «исходники» утилитой jd gui (или другими на их основе).
Однако назвать полноценным исходником полученный результат можно с большой натяжкой, чаще всего из таких «исходников» невозможно вновь собрать рабочий apk, не проделав титанический труд.
Читаемость таких «исходников» тоже, мягко говоря, под вопросом. Результат примерно аналогичен машинному переводу: русский — английский — французкий — русский, то есть никакой.
Отслеживать
ответ дан 3 сен 2016 в 0:11
36.8k 6 6 золотых знаков 48 48 серебряных знаков 125 125 бронзовых знаков
Хорошее сравнение с машинным переводом.
23 сен 2016 в 3:50
Только с языками при этом лучше.)
4 дек 2019 в 16:15
Вы можете воспользоваться одним из apk декомпиляторов, например этим, или этим. В интернете можно найти много информации по декомпиляторам, так и гайдов/доков по ним.
Отслеживать
user177221
ответ дан 2 сен 2016 в 20:53
Rostyk Shevtsiv Rostyk Shevtsiv
406 2 2 серебряных знака 4 4 бронзовых знака
- java
- android
- дизассемблирование
-
Важное на Мете
Похожие
Подписаться на ленту
Лента вопроса
Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.
Дизайн сайта / логотип © 2024 Stack Exchange Inc; пользовательские материалы лицензированы в соответствии с CC BY-SA . rev 2024.1.3.2953
Нажимая «Принять все файлы cookie» вы соглашаетесь, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой в отношении файлов cookie.
Как извлечь ассеты и C# код из APK

Две небольшие статьи одного автора, про то, как извлечь ассеты из APK файл Unity проекта и как получить C# код от туда же. Конечно он будет не в идеальном виде, но всё же.
Иногда интересно (и полезно) узнать, как устроены некоторые моменты в игре, таким образом можно расковырять его и поискать. Извлекать ассеты (картинки, звуки, модели) и использовать их в своих проектах, конечно не рекомендуется 🙂
Если хотите хоть как-то усложнить жизнь таким «хакерам» и защитить свой проект, можно использовать обфускаторы кода, такие есть на Github и в Unity Asset Store.
Как достать код скрипта из собранного apk файла (il2cpp)?
Такая беда, нигде не могу найти исходник своего старого проекта, но уж понадобился один C# скрипт из того проекта.
Может есть какие-то способы получить его?
Пробовал AssetRipper последней версии, он скрипты находит, но их содержимое пустое.
Ilspy, DnSpy не знаю как использовать на сборках il2cpp
- Вопрос задан 13 апр. 2023
- 155 просмотров
Комментировать
Решения вопроса 0
Ответы на вопрос 2

Токсичный шарпист
Никак. В этом и суть il2cpp, что с ним не работает ilspy и прочие.
Ответ написан 13 апр. 2023
Комментировать
Нравится Комментировать
Охотник на пиратов и сборщик монолитов
При сборке il2cpp точный исходный вид обратно восстановить уже 100% не получится, как минимум потому что теряются исходные наименования (да, я в курсе про global-metadata.dat и дампы ошибок, но их может не быть, а если и есть — это гемор для избранных). Да и задачка там сводится, по сути, к обратному преобразованию из низкоуровневого кода.
Мне думается, что проще заново написать.. но если вам не влом, можете полазить по гитхабу, там китайцы несколько проектов ведут. Типа такого (не проверял) — https://github.com/Perfare/Il2CppDumper
Ответ написан 14 апр. 2023
Комментировать
Нравится Комментировать
Ваш ответ на вопрос
Войдите, чтобы написать ответ

- C#
- +1 ещё
Как проверять столкновение префаба и UI панели в Unity?
- 1 подписчик
- 2 часа назад
- 13 просмотров