Как стать автором
Обновить

Комментарии 22

Интересная статья, а можете привести реальный пример, где этот способ может пригодиться?
Спасибо за ваш отзыв.

Этот способ интересен в основном для reverse engineers — например для вирусных аналитиков или хакеров. Иногда этот способ полезен в ситуации «есть приложение, а исходники и документацию потеряли, разрабы уволились — теперь надо хотя бы примерно понять как оно там внутри работает». Хотя такое редко бывает конечно.
В самом начале статьи:… reversing engineering приложений для Android
Осталось выбрать способ реализации. Так как я не имею не малейшего представления о разработке под андроид (да и вообще с Java не сильно знаком), да и писать свое приложение ради такой мелочи — это стрельба из пушки по воробьям, было решено модифицировать уже имеющийся будильник.


Вы уверены, что ваш способ не был «стрельбой из пушки по воробьям»)))
Круто-круто! А не знаете ли, есть способ без плясок с бубном: просто аттачится к приложению без пересборки пакета? Я так понимаю, пересборка нужна только чтобы отладчик на PC имел хоть какой-то исходный код?
Спасибо за позитивный отзыв.

Увы, пока что простого способа не нашел. Насколько я знаю, нельзя вот так просто взять и скомандовать по JDWP приложению: «А ну стой! Какую инструкцию виртуальной машины Dalvik сейчас выполняешь? Какие значения переменных? Сколько солдат в твоем отряде потоков в приложении?»

Поэтому приходится извращаться. Пересборка с опцией -d нужна
(1) для того что бы добавить отладочную информацию в пакет, соответствие «инструкция Smali — строка в исходном коде», ну и получить сам исходный код
(2) а также выставить android:debuggable=«true».

Без (1) и (2) этого отладка к сожалению «не заводится».
А как выглядит отладка? Минимальный шаг — одна инструкция Dalvik или 1 строка сорцов?
Отладчик выглядит странно. Мы имеем NetBeans что-то вроде

package ch.racic.android.marketenabler; class ExecReceiver {/*
а тут у нас инструкции Dalvik в формате ассемблера Smali
*/


Т.е. класс ExecReceiver фактически пустой с точки зрения языка Java, все инструкции Dalvik — внутри одного большого комментария. Но тем не менее NetBeans может выполнять эти инструкции внутри комментария одна за другой. Одна инструкция Dalvik за один шаг отладки. И после каждого шага можно просмотреть значение полей, локальных регистров и т.п.

Поначалу это смотрится немного странно, потом как-то привыкаешь.
А, кажется понимаю. При ребилде производится генерация новой отладочной информации, чтобы она соответствовала сгенеренным сорцам. Просто была идея сделать фейковые сорцы, благо в dex часто есть отладочная информация. Но, похоже, не выйдет :-(
Так оно и есть. Apk-tools генерируют новую отладочную информацию, ну а android:debuggable=true мы сами уже добавляем, руками. Метод конечно… как гланды удалять через не предназначенное для это отверстие ниже спины. Но более толкового способа сделать отладку без сорцов пока что не нашел. Если что-то знаете по этому поводу — пишите в комментарии, добавлю в конец статьи как альтернативу изложенному с статье методу.
Да я пока более «рабочего» чем у вас метода и сам не видел :-( А надо :-(
Ну у меня было пару идей, например:
(1) Прикрутить к Dalvik возможность по протоколу JDWP отзываться на вопросы вроде «Пауза! Какая инструкция выполнялась последней? Какое значение локально регистра v0?» Всё-таки исходники Dalvik открыты, можно поковыряться… Но времени нету, да и C++ программист из меня — как из говна пуля.
(2) Ещё была одна идея, которая заключалась в получении Smali кода (с помощью того же дизассемблера Smali), а потом патчинге этого самого кода так что бы его можно было потом отлаживать. Идея не очень изящная, такой себе мегакостыль…
Жаль, что на самом важном моменте вы так плохо все расписали( хотя в целом статья очень даже полезная ). Конкретно, пункт 11. «или какой там у вас порт» — у меня — 8600/8700, как, собственно, у всех. Так какой же порт указывать при присоединении дебаггера к Dalvik-процессу? Debugging происходит в Real-Time моде или пакет нужно каждый раз пересобирать?
Давненько меня тут не было, ну да все равно отвечу. Типа лучше поздно чем никогда.

По поводу «плохо расписал» — ну уж как смог так и расписал :)

По поводу порта — порт указываем тот который 86xx (вместо xx у вас каждый раз будут какие-то свои цифери естественно).

Про Real-Time вопроса не понял, извините.

Если есть вопросы по какой-то конкретной APK-шке — пишите в мыло, попробую помочь.
НЛО прилетело и опубликовало эту надпись здесь
Эти файлы, насколько знаю, лишь программный интерфейс к более низкому уровню программного стека Android. Испортив допустив ошибку в отладке и последующей успешной компиляции, все приложения( включая системные, конечно же ) полягут, что может привести к непредвиденному результату.
НЛО прилетело и опубликовало эту надпись здесь
Одним словом, ничего хорошего. Все зависит от того, какого рода приложение( приложения ) используют тот или иной компонент интерфейса.
Все может закончиться, например, тем, что перестанет работать Bluetooth( если производилась не успешная отладка модуля, отвечающего за этот функционал ), или же, например, рухнет вся система, если была ошибка при перекомпиляции core.jar.

Да и вообще, jar и apk — это совершенно разные форматы. Даже не знаю, почему вы вдруг решили, что jar и apk разбираются по-одинаковому.
Черт, вы же спрашивали про JAR… Я чего-то завтыкал и подумал что речь идёт о DEX. Извините, насчет JAR ничего не могу сказать.
Теоретически — да, на практике — я бы не стал (см. комментарий от Asen).
НЛО прилетело и опубликовало эту надпись здесь
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории