Бы­тует мне­ние, что защит­ные механиз­мы для 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».

Присоединяйся к сообществу «Xakep.ru»!

Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее

  • Подпишись на наc в Telegram!

    Только важные новости и лучшие статьи

    Подписаться

  • Подписаться
    Уведомить о
    0 комментариев
    Межтекстовые Отзывы
    Посмотреть все комментарии