Physical Address
304 North Cardinal St.
Dorchester Center, MA 02124
Physical Address
304 North Cardinal St.
Dorchester Center, MA 02124
Бытует мнение, что защитные механизмы для Android-приложений слабы и легко обходятся, однако реальность оказывается гораздо сложнее. На рынке существует множество коммерческих протекторов, способных защитить код от взлома, и Baidu — один из них. Давай подробно разберем внутреннюю архитектуру и устройство этого навороченного мобильного протектора. warning
Статья написана в исследовательских целях, имеет ознакомительный характер и предназначена для специалистов по безопасности. Автор и редакция не несут ответственности за любой вред, причиненный с применением изложенной информации. Использование или распространение ПО без лицензии производителя может преследоваться по закону.
Если ты регулярно читаешь «Хакер», у тебя могло сложиться впечатление, будто всякие хитрые протекторы, использующие обфускацию с шифрованием кода, виртуализацию и прочие страшные антихакерские приемы, существуют только для десктопных защит (типа Themida, WMProtect и им подобных). А мобильные, в частности андроидовские, приложения практически беззащитны, в связи с чем ломаются легко и приятно, даже без помощи отладчика в статике.
Конечно же, это не так: под Android существует множество серьезных коммерческих решений, сложность и цена которых оправдывают сохранение приватности кода. Разумеется, спрос рождает предложение, и специально обученные люди (большей частью китайцы) успели напридумывать множество протекторов, защищающих код мобильных приложений от взлома и реверса. И конечно, тут же нашлись другие китайцы, которые исследуют подобные протекторы на предмет уязвимостей и клепают инструменты для взлома.
Например, лет десять назад простые студенты Гонконгского политехнического института провели собственное исследование наиболее популярных (китайских, как ты, наверное, догадался) протекторов Android-приложений и даже создали собственный пакет DexHunter, позволяющий более‑менее успешно их обходить. Желающие могут подробно ознакомиться с общими принципами построения таких протекторов и способами их обхода, так сказать, из первых рук. Мы же, как обычно, перейдем от теории к практике и разберем взлом одной из описанных авторами систем защиты — Baidu.
Выбранный мною пример будет полезен еще и тем, что прогресс не стоит на месте и защиты совершенствуются. В частности, актуальные версии Baidu уже не обойти при помощи DexHunter и прочих инструментов реверс‑инженера. А значит, за неимением однокнопочного решения приходится мастерить его собственной головой и руками, чем мы сегодня и займемся.
Итак, условие задачи. У нас имеется некое Android-приложение, работающее с экзотическим железом. Поддержка этого приложения прекращена, исходники недоступны. Требуется получить исходный код для последующего анализа. Если ты уже немного знаком с отладкой и реверсом Android-приложений, наверняка умеешь пользоваться таким полезным инструментом, как JEB. Загружаем в него наш .APK
и для начала попытаемся найти в коде ссылку на текстовую строку «Authentication Failed. Wrong password?», выскакивающую при неправильном вводе пароля.
Пока все нормально, строка успешно найдена в ресурсах: она присутствует там в явном виде, и даже идентификатор ее известен — authentication_failed_wrong_password
. А вот дальше все становится грустно: поиск этого идентификатора дает только варианты исходной строки на языках народов мира, а ссылок на код нет ни малейших.
Спасибо хотя бы на том, что нам теперь известен шестнадцатеричный идентификатор искомой строки — 0x7f0f009a
, по которому можно попробовать попытаться найти ее в откомпилированном smali-коде. Однако здесь нас тоже ждет разочарование — ни в одном из распакованных файлов проекта подобная комбинация не встречается.
Попутно мы обнаруживаем в разобранном проекте несколько интересных вещей. В нем, по сути, нет кода, как‑либо связанного с функциями приложения, — только вспомогательные библиотечные пакеты и ресурсы. Однако в коде присутствует странный, частично обфусцированный класс com.sagittarius
вот с таким содержимым.
Код явно ссылается на нативные библиотеки baiduprotect
, версии которых под различные архитектуры лежат в подкаталогах Assets
и Libraries
. Открыв для примера в дизассемблере IDA версию такой библиотеки под архитектуру x86, обнаруживаем, что внутри она состоит из криптованного и виртуализованного кода чуть менее, чем полностью, и версии под остальные архитектуры выглядят не лучше.
Это означает, что статическим анализом декомпилированного кода в нашем случае не обойтись, — придется каким‑то образом загружать программу в отладчик и исследовать работу защиты в динамике. Попробуем совместить приятное с полезным и решить еще одну сопутствующую задачу. Ты, вероятно, уже слышал, что серьезные исследования мобильных приложений проводятся на специально рутованных подопытных Android-устройствах, подключенных к компьютеру через отладочные интерфейсы. А мы люди жадные и небогатые, покупать телефон‑жертву специально для этой цели не будем.
Попробуем решить нашу задачу, не выходя за рамки Windows-компьютера, — будем использовать для этой цели Android-эмулятор. Для примера возьмем популярный условно‑бесплатный эмулятор BlueStacks. Я выбрал именно его по ряду соображений: во‑первых, как я сказал выше, он бесплатный, во‑вторых, прекрасно работает офлайн, а в‑третьих, поддерживает отладочный интерфейс ADB (не буду отвлекаться от повествования, объясняя, что это такое, — думаю, что ты все‑таки имеешь небольшой опыт реверса и отладки под Android и читал соответствующие статьи). И что самое главное, наше приложение прекрасно устанавливается и запускается на этом эмуляторе, хотя, как пишут в интернете, далеко не каждый эмулятор воспринимает Baidu, как родной. А раз так, то включаем в нашем BlueStacks доступ к отладочному интерфейсу ADB (напоминаю, для этого в настройках программы нужно установить флажок «Включить Android Debug Bridge (ADB)». Заодно обращаем внимание на адрес подключения 127.0.0.1:5555
.
Теперь загружаем и устанавливаем наше приложение в эмулятор (снова не буду подробно останавливаться на этом моменте: все подробно описано в интернете). После этого устанавливаем на свой компьютер Android Debug Bridge и пробуем по инструкции подключиться к эмулятору. Если ты все сделал правильно, то команда adb devices
покажет эмулятор в списке доступных устройств.
Теперь можно подключиться к нему, выполнив команду adb -s emulator-5554 shell
. Это необязательно получится с первого раза, но если ты аккуратно следовал инструкции, то рано или поздно подключение будет установлено. Выполнив команду ps
, можно убедиться, что исследуемое приложение запущено и находится в списке активных процессов.
Источник: xakep.ru