Принципиальная разница между app-debug и app-release android?
У меня есть приложение на андроид. Я его тестировал на разных эмуляторах, и так повелось что я постоянно генерировал app-debug, или как такое приложение принято называть дебаг-версия. Эту версию приложения я с легкостью ставил на много реальных устройств, но потом два устройства повели себя не просто странно, а вообще непонятно. Что именно произошло — приложение не грузило ресурсы, вообще никакие — текст картинки,и может что еще, я не видел. Работать с этим приложением на проблемном, как я думал телефоне было невозможно так-как приложение слетало, и указывало что ошибка в строковом ресурсе, который на остальных устройствах был нормальным. Более подробно можете увидеть информацию по поводу этих проблем в моих вопросах: Объясните ошибку android. Дальше я сделал релизную версию приложения, и моя программа работала на всех устройствах. Дальше я начал искать информацию по этому поводу и нашел такой вопрос: Разница между .apk и signed .apk. Ответ на этот вопрос частично ответил на мои некоторые вопросы, но мне все равно не очень понятно что-же так сильно меняется в приложении после нормального подписания, ведь после подписания приложение нашло все ресурсы и работало отлично. Я буду очень благодарен если мне объяснят отличия, на моем примере с моим приложением.
Отслеживать
задан 9 авг 2018 в 14:53
17.9k 11 11 золотых знаков 25 25 серебряных знаков 57 57 бронзовых знаков
1 ответ 1
Сортировка: Сброс на вариант по умолчанию
Первый — отлаживаемый, а второй — нет. Это означает, что первый из них выведет все ваши Log.d , а релизная версия — нет. Кроме того, по умолчанию debug-версии компилируются без ProGuard , тогда как release-сборки скомпилированы с использованием ProGuard по умолчанию.
Отслеживать
ответ дан 10 авг 2018 в 4:40
1,859 3 3 золотых знака 15 15 серебряных знаков 24 24 бронзовых знака
а что такое ProGuard ?
10 авг 2018 в 5:53
10 авг 2018 в 6:04
-
Важное на Мете
Связанные
Похожие
Подписаться на ленту
Лента вопроса
Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.
Дизайн сайта / логотип © 2024 Stack Exchange Inc; пользовательские материалы лицензированы в соответствии с CC BY-SA . rev 2024.1.3.2953
Нажимая «Принять все файлы cookie» вы соглашаетесь, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой в отношении файлов cookie.
Реверс-инжиниринг

Вы потеряли исходник своей программы и вам нужно восстановить код. Вы скачали программу с вирусом и хотите узнать, что он делает.
Программы под Android распространяются в архивах. Эти архивы имеют расширение «.apk». Такие файлы не шифруются и являются по сути файлами «zip». Можете переименовать apk-файл в zip, чтобы убедиться в этом.
Вам необходимо поковыряться в APK-файле и получить какие-то данные. Можно потренироваться на кошках. Возьмём свою программу «Hello Kitty», найдём его apk-файл в папке проекта app\build\outputs\apk и переместим в отдельную папку для опытов.
Вы можете также получить apk-файл с устройства и перенести его на компьютер при помощи команд ADB
Распаковав архив, вы можете увидеть структуру приложения и встретить знакомые файлы. И даже извлечь некоторые файлы для просмотра. К примеру, в папке res/drawable-hdpi-v4 я нашёл свою картинку pinkhellokitty.png. Казалось бы, вот оно — счастье. Но погодите радоваться. Если с изображениями проблем нет, то с чтением XML-файл вас ждёт облом. Какие-то строки вам видны, но в целом текст совершенно нечитаем. Поэтому сначала пойдём другим путём.
Так как пользовательские приложения для Android выполняются в java-машине, то APK-файлы наследуют все характерные черты JAR-файлов.
Содержимое архива обычно выглядит примерно так:

Каталог META-INF содержит:
CERT.RSA — сертификат приложения
CERT.SF — контрольные суммы файлов ресурсов (картинок, звуков и т.д.)
MANIFEST.MF — служебная информация, описывающая сам apk-файл
Каталог res содержит ресурсы — значки в нескольких разрешениях, описание размещения элементов на форме в xml-файле.
AndroidManifest.xml — служебная информация о приложении. В этом файле содержатся и так называемые «permission» — разрешения, которые требуются для работы приложения (например, доступ к сети или доступ к телефонной книге).
classes.dex — исполняемый код приложения. Именно этот файл интересует нас в первую очередь.
resources.arsc — таблица ресурсов. В этом файле собраны xml-описания всех ресурсов.
Вот и вся краткая информация, которую нужно знать, приступая к разбору вредоносных программ под Android.
Теперь рассмотрим популярные утилиты, используемые для изучения программ.
Apktool
Для начала скачиваем утилиту Apktool, который представляет собой jar-файл с номером версии. Для удобства переименовываем его в короткий вид apktool.jar, так как будем работать в командной строке. Подопытный файл разместите в той же папке с утилитой.
Запускаем в окне командной строки утилиту с флагом d:
>apktool d app-debug.apk

Появится отдельная папка, имя которой будет совпадать с именем вашего файла. Зайдите в неё и исследуйте файлы. Вы заметите, что XML-файлы теперь доступны для чтения в нормальном виде. Таким образом, мы можем открыть файл activity_main.xml и узнать разметку своей активности.
В папке вы также найдёте множество системных файлов, которые проект тянет с собой при создании приложения. На них не обращаем внимания. Вам нужно искать только те файлы, которые создавали программисты, хакеры, вы.
При изучении своей или чужой программы вам надо посмотреть на файл манифеста, чтобы узнать используемые разрешения, список активностей, сервисов и т.д. А в папке res изучить все ресурсы, относящиеся к программе.
Моя тестовая программа была слишком проста. В других примерах могут быть дополнительные папки, например, assets, которая может содержать файлы, картинки и т.д. Там могут находиться html-файлы с сценариями на Javascript, которые ведут на вредные страницы.
В папке smali находятся уже файлы классов с тем же расширением smali. Код выглядит как в ассемблере и при желании можно понять листинг, но очень неудобно. Оставив файлы пока в покое.
Первую часть задачи мы выполнили.
dex2jar
Вторая утилита dex2jar, позволяет преобразовать файлы dex в jar. Скачиваем последнюю версию и распаковываем архив утилиты. Утилита содержит множество файлов для различных ситуаций. Можете поизучать их на досуге.
Запускаем команду d2j-dex2jar.bat app-debug.apk и получаем на выходе файл app-debug-dex2jar.jar. Это стандартный тип файлов для Java, но для нас пока не слишком полезный. Тем не менее мы выполнили второй шаг и получили промежуточный файл.
JD-GUI
Утилита, которая поможет нам прочитать jar-файл, называется JD-GUI. На странице разработчика можно найти ссылки на плагины к средам разработки и даже онлайн-версию.
Скачиваем последнюю версию и распаковываем архив. Там всего два файла — исполняемый exe-файл и readme.txt
Запускаем программу и перетаскиваем на него jar-файл. И весь код на ладони.

Обратите внимание, что код немного будет отличаться. Например, код в студии:
mHelloTextView = (TextView) findViewById(R.id.textView);
Сравните с кодом в утилите.
this.mHelloTextView = ((TextView)findViewById(2131230784));
Иными словами, вместо констант из класса R подставляются их реальные значения. Вам придётся попотеть, чтобы сопоставить данные. Но вы справитесь, я в вас верю.
Burp Suite
Burp Suite позволит вам просматривать HTTP-траффик на эмуляторе. Скачайте последнюю версию.
Далее следует настроить прокси и другие параметры.
Разбор вредоносной программы
В качестве примера возьмем программу suspicious.apk, который детектируется разными антивирусами как вредоносная программа.
Чтобы лучше понять, что именно искать, нужно проанализировать файл «AndroidManifest.xml» — посмотреть, какие именно разрешения требуются анализируемому приложению. Данный файл бинарный, а не обычный текстовый xml. Для того, чтобы его прочитать нужно воспользоваться консольной утилитой «aapt» из комплекта Android SDK. Она находится в каталоге «platform-tools». Так как графического интерфейса нет, то команду нужно вводить в консоли. Например, для Windows:
C:\android-sdk-windows\platform-tools\aapt.exe l -a C:\incoming\suspicious.apk
Разумеется, вы должны подставить свои пути. В Linux команда будет такой же с очевидными отличиями (не будет букв дисков и расширения «exe» у утилиты). Для большего удобства вывод можно перенаправить в файл:
C:\android-sdk-windows\platform-tools\aapt.exe l -a C:\incoming\suspicious.apk>>C:\incoming\manifest.txt
В файле нужно найти секцию «Android manifest» и искать перечисление разрешений. В анализируемом файле это выглядит так:
"android.permission.READ_PHONE_STATE" (Raw: "android.permission.READ_PHONE_STATE") "android.permission.INTERNET" (Raw: "android.permission.INTERNET") "android.permission." (Raw: "android.permission.RECEIVE_SMS")
Из этой информации становится понятно, что программа может получать состояние телефона (сюда включаются, например «телефон в режиме вызова», «телефон в режиме принятия данных»). Это разрешение нужно и для получения номера телефона, на котором запущена программа, работать с сетью и мониторить приход СМС. На этих аспектах и нужно сосредоточить внимание при дальнейшем анализе.
Для того, чтобы получить доступ к коду нужно выполнить два шага — преобразовать apk-файл в jar-файл и декомпилировать полученный байткод в более понятный для человека вид.
Воспользуемся конвертером «dex2jar»:
C:\dex2jar\dex2jar.bat C:\incoming\suspicious.apk
Сконвертированный файл будет находится в том же каталоге, что и оригинальный файл. К его имени будет добавлено «.dex2jar.jar», то есть в данном примере это будет «suspicious.apk.dex2jar.jar».
Этот файл можно открыть декомпилятором. Иерархия пакета в окне декомпилятора выглядит так:

На этом подготовительные шаги заканчиваются — дальнейший успех зависит только от вашего знания Java и умения пользоваться поисковиком.
К счастью, экземпляр выбранный для примера имеет довольно скромные размеры — финальный jar всего 7,01 KB.
В программе всего шесть классов. Исключим те, которые не представляют интереса. Это класс R, в котором только перечислены идентификаторы всех ресурсов. Так же из рассмотрения можно исключить класс Config, в котором содержится конфигурация сборки.
Рассмотрим подробнее оставшиеся три класса.
Activation

Этот класс срабатывает по событию onCreate(), то есть сразу после старта приложения.
TelephonyManager localTelephonyManager = (TelephonyManager)getSystemService(«phone»); — создает localTelephonyManager, в которую помещает данные об устройстве.
str1 = localTelephonyManager.getDeviceId(); — выбирает из полученных данных идентификационный номер устройства и помещает его в строку str1
Дальше идет цикл, который делит DeviceId на кусочки по четыре цифры, вставляя между ними дефис «-«, то есть из XXXXXXXXXXXXXXXX получается XXXX-XXXX-XXXX-XXXX. Полученную строку цифр и дефисов передают в TextView с идентификатором 2131034112.
SmsReciever

Этот класс срабатывает при приходе СМС-сообщения, событие onReceive().
В задачу этого класса входит отслеживать входящие смс и в случае обнаружения запускать класс MainService, передавая ему указатель на новое пришедшее сообщение.
MainService
Этот класс довольно велик, поэтому не стану приводить его целиком. Сразу после вызова запускает субкласс «SmsBlockerThread», который блокирует уведомление о поступившем СМС, чтобы пользователь не был оповещен о новом входящем СМС.
Затем входящее СМС обрабатывается таким образом:

String str1 = localSmsMessage.getOriginatingAddress(); — номер телефона-получателя (то есть номер телефона, на котором установлен троянец) помещается в переменную str1.
String str2 = localSmsMessage.getMessageBody(); — тело сообщения помещается в переменную str2
Затем создаются связанные пары localBasicNameValuePair1 и localBasicNameValuePair2 в которые помещаются значения
f0= b0=
Эти пары сохраняют в массив localArrayList, в который позже добавляют пару localBasicNameValuePair3, представляющую собой устройства>

При этом, как видите, DeviceId получается заново, а не используется то, что было получено в классе Activation. Заканчивается тем, что вызывается метод postRequest() из последнего класса ServerSession:
В качестве параметра передается тот самый массив пар, в котором номер телефона, содержимое СМС и идентификатор устройства.
ServerSession
Этот класс имеет два метода: initUrl(), который возвращает часть ссылки «(http://softthrifty.com/security.jsp)»:
public static String initUrl() < return "http://softthrifty.com/security.jsp"; >
и большой метод postRequest(), который вызывался из класса MainService. Несмотря на размер, задача postRequest() проста — отправить на сервер по ссылке, возвращаемой методом initUrl(), данные, добавив пары из массива, собранного в MainService. То есть всего лишь обратиться по ссылке:
(http://softthrifty.com/security.jsp?f0=&b0=&id=)
Итог
Итак, данный троянец перехватывает СМС и отправляет на сервер запрос, в котором передает номер зараженного телефона, содержимое СМС и идентификатор зараженного телефона. Такое поведение может быть признаком банковского троянца, атакующего двухфакторную авторизацию. Для успешной атаки требуется выполнение таких условий:
1) злоумышленник должен заразить компьютер жертвы, чтобы перехватить данные для он-лайн банкинга;
2) злоумышленник должен заразить телефон жертвы для перехвата СМС с кодом подтверждения от банка;
3) злоумышленник должен каким-то образом связать пользователя зараженного компьютера и зараженного телефона, чтобы знать, от каких учетных данных он-лайн банкинга данный код подтверждения;
В силу своих размеров и очевидности производимой деятельности такой образец хорошо подходит для демонстрации базовых приемов разбора вредоносных программ под Андроид.
Общая информация об отладке в Android Studio
Студия позволяет отлаживать приложения на эмуляторе и на реальных устройствах. Вы можете просматривать системный журнал логов, устанавливать точки останова, проверять значения переменных и вычислять выражения во время работы, делать скриншоты и видеозаписи.
Когда вы разрабатываете приложение, то студия собирает отладочную версию программы, соединяется с устройством/эмулятором, устанавливает и запускает её.

Обычно для запуска приложения вы используете значок с зелёным треугольником Run (Shift+F10) на панели инструментов. Для отладки следует нажимать соседнюю кнопку Debug (Shift+F9) с изображением жучка .
Остальные действия будут идентичными — вам надо выбрать устройство, на котором будет происходить отладка.
Android Studio откроет окно Debug. Можно открыть его вручную через кнопку 5: Debug в нижней части среды разработки. Окно показывает потоки и переменные в вкладке Debugger, статус устройства в вкладке Console и системные логи в вкладке Logcat.

Если приложение уже запущено, то необязательно его перезапускать для работы в отладочном режиме. Вы можете нажать на кнопку Attach debugger to Android proccess , которая идёт сразу после кнопку с жучком.
В вкладке Logcat вы видите системные сообщения, включая сообщения от вашей программы, если вы использовали их своём коде. Для записи логов используется класс Log. Подробнее о нём в отдельной статье.

Логи можно просматривать также через панель Android DDMS (Dalvik Debug Monitor Server) — запускается через кнопку 5: Android в нижней части студии. В Android DDMS вы можете просматривать логи только нужного процесса, если нажмёте на кнопку Only Show Logcat from Selected Process .
Точки останова (Breakpoints)
Точки останова позволяет приостановить выполнение программы на нужной строчке кода, проверить значение переменных, запустить выражение и продолжать выполнение кода строчка за строчкой. Позволяет выявить ошибки, которые не удаётся вычислить простым просмотром кода.
Откройте свой исходник, определите строку кода, в которой хотите поставить точку останова и щёлкните по ней. Строка окрасится в жёлтый цвет. Щёлкните в левой части редактора кода в серой области. В этом месте появится красный кружок (повторный щелчок уберёт его), а строка примет розовый цвет. Точку останова можно ставить не только для исполняемого оператора, но и на комментарии.
Запустите приложение в отладочном режиме. Когда выполнение программы дойдёт до установленной точки останова, то студия прекратит дальнейшее выполнение приложения, кружок станет ещё более красным и строка будет выделена. И затем вы можете попытаться выявить причину ошибки.


Для просмотра всех точек останова и их настроек щёлкните на кнопке View Breakpoints в левой части панели Debug . Появится отдельное диалоговое окно.


После того, как вы установили точки останова, щёлкните кнопку Rerun для повторного запуска программы. Когда выполнение кода дойдёт до установленной точки останова, студия выполнит паузу и подсветить строку кода. Панель Debug позволит проверить переменную и выполнить код шаг за шагом.

Для проверки переменных раскройте список в панели Variables. Если панель не видна, то щёлкните кнопку Restore Variables

Для вычисления выражения в текущей точки щёлкните кнопку Evaluate Expression

Для перехода на следующую строку кода без выполнения щёлкните кнопку Step Over .

Для перехода на первую строку кода внутри метода щёлкните кнопку Step Into .

Для перехода на следующую строку за пределами текущего метода щёлкните кнопку Step Out .

Чтобы продолжить работу приложения в нормальном режиме, нажмите кнопку Resume Program .
Отслеживание потребления памяти
Студия позволяет также отслеживать потребления памяти объектами и показывает, какие классы и потоки используют объекты.
Запустите студия в отладочном режиме, щёлкните 6: Android, чтобы открыть панель Android DDMS. Выберите вкладку Devices | logcat, выберите ваше устройство из выпадающего списка, выберите вашу программу по имени пакета из списка запущенных программ.

Щёлкните кнопку Start Allocation Tracking . Начинайте пользоваться программой.
Повторно нажмите на предыдущую кнопку Stop Allocation Tracking. Студия покажет объекты, выделенные системой для работы.
Android Device Monitor

Для анализа потребления памяти, сетевого трафика, поведения приложения при входящих звонках можно использовать графический инструмент Android Device Monitor. Щёлкните кнопку Monitor на панели инструментов. Android Device Monitor откроется в новом окне. Опытные программисты увидят знакомое окно, когда работали с Eclipse.
Скриншоты и видео
Вы можете делать скриншоты и видео работающего приложения.

Запустите приложение и откройте панель 6: Android. Щёлкните кнопку Screen Capture в левой части панели.

По такому же принципу можно сделать видеозапись через кнопку
Отладка на Android
- Подготовьте бандл, установив параметр android.debuggable в game.project

- Поместите бандл приложения в режиме отладки в папку по выбору.

- Запустите Android Studio
- Выберите Profile or debug APK

- Выберите только что созданный apk бандл

- Выберите основной файл .so и убедитесь, что в нем есть отладочные символы

- Если их нет в файле, загрузите не урезанный файл с отладочными символами с расширением .so . (размер около 20 МБ)
- Сопоставления путей помогают переназначить отдельные пути, из которых был создан исполняемый файл (в облаке), в реальную папку на вашем локальном диске.
- Выберите .so файл, затем добавьте сопоставление на вашем локальном диске


- Если у вас есть доступ к исходным кодам движка, добавьте сопоставление пути и для него
* не забудьте сверить версию, которую вы сейчас отлаживаете defold $ git checkout 1.2.148



Примечани
Директория задач нативного расширения
В настоящее время рабочий процесс немного сложен для разработки. Это потому, что имя директории с задачами является случайным для каждой сборки, что делает сопоставление пути недействительным для каждой новой сборки.
Однако он отлично работает для единичного сеанса отладки.
Сопоставления путей хранятся в файле
.iml в проекте Android Studio.
Можно получить директорию с задачами из исполняемого файла
$ arm-linux-androideabi-readelf --string-dump=.debug_str build/armv7-android/libdmengine.so | grep /job
Папка задачи называется так job1298751322870374150 , каждый раз это название с уникальным случайным номером.
- English
- 中文 (Chinese)
- Español (Spanish)
- Français (French)
- Νεοελληνική γλώσσα (Greek)
- Język polski (Polish)
- Português (Portuguese)
- Русский (Russian)
Did you spot an error or do you have a suggestion? Please let us know on GitHub!