понедельник, 25 января 2016 г.

Реверс Android приложений

Каждому кодеру знакома ситуация когда сделать брут, чекер и прочее для какого то сайта является проблемой. Далеко за примером ходить не надо: deliveryclub и instagram. На первом каптчу ввели, на втором вообще регистрация только через приложение. Как жить? Есть конечно же jdgui и apktool но как правило все приложения обфусцированы и эти программы помогают чуть меньше чем никак. В этой статье я расскажу как достать ключ подписи от приложения instagram.




Что нам потребуется для реверса ведройд приложений? Конечно же первым делом сам аппарат с ведройдом на борту! Я купил бомж версию oneplus one, выглядит это дело так:

Стоит такое ведро 350$. Можно купить мобилу дешевле но получиться ли получить на неё ROOT права никто не скажет, именно по этому мой выбор пал на самую популярную модель смартфона. Как получить на неё рут права можно нагуглить за минуту, для других моделей смартфонов есть приложение framaroot, kingroot. Гуглите, это не сложно.

Ну если вы рутанули телефон и он ещё подаёт признаки жизни - двигаемся дальше, а если ничего не выходит - проще купить другой телефон (например iPhone 6s) и забыть ведройд как страшный сон.

Настройка телефона 

 

Итак, нам надо поставить на порутанный смартфон GikDBG.art - это инструмент отладки приложений прямо на телефоне основанный на GNU Project debugger. Когда будете ставить gikdbg.apk - не забудьте наградить его root правами!

Следующим шагом будет включение отладки по USB, делается это так:



Настройки => Опции разработчика => Режим отладки => Ставим галочку => ОК

Анализ приложения Instagram


Лучше всего объяснять на примере инстаграма - это самое простое что может быть. Как обычно декомпилируем .apk файл при помощи dex2jar:


Полученный .jar файл загоняем в jdgui и наблюдаем такую картину:


Можно сделать вывод что ключ для подписи запросов зашифрован и расшифровывается он перед самой подписью запроса. Ладно, посмотрим как он расшифровывается:


Но не тут то было! Выделенная строка говорит нам о том, что для расшифровки строк используется нативная библиотека .so (в windows это называется .dll). Нативная библиотека уже скомпилирована и используется точно так же как и DLL файлы в windows.

Что бы достать эту библиотеку для последующего анализа открываем .apk файл в 7-zip'e:


Ну и достаём её из архива для того, что бы скормить тётушке IDA:


 
У меня нет никакого желания заниматься реверсом алгоритма доставания строки, по этому пойдём лёгким путём и загрузим приложение под отладчиком. Теперь нам будет проще т.к. функцию которая портит нам всю малину мы успешно нашли.

Подключение отладчика


Итак, подошли к самому главному моменту - отладке приложения! Для этого подключаем телефон к компутеру и запускаем gikdbg.art, затем жмём ART Debug => Server => ADB Device и если всё сделали правильно то появиться окошко с идентификатором вашего ведройда:


Кликаем по идентификатору 2 раза и если всё сделали правильно - появляется окошко с командами показанное на рисунке ниже:


Выбираем ART Debug => File => Attach как показано на рисунке выше и ищем в списке приложение инсты:



Кликаем по нему 2 раза и попадаем в основной поток, он нам не интересен, по этому жмём Alt + M и выбираем наш модуль strings.so в котором затем будем заниматься поиском функции интересующей нас функции:



Но на этом этапе у вас может возникнуть подобная ошибка (взято как пример):


Таких ошибок может быть куча. Что бы её устранить переименовываем libstrings.so (скорее всего именно с ним у вас возникнет проблема) как предложил отладчик и закидываем его в папку "Gikdbg\artapp\293BC20E45DB0001DB5F8F8A07A49312.libstrings.so", должно заработать.

Перехват ключа 

 

На самом деле поиск ключа не такая большая проблема если вы умеете пользоваться тётушкой IDA. Мы знаем что для подписи запроса используется функция getSignatureString, по этому давайте изучим её более подробней:



Как видим в начале достаётся строка по идентификатору, затем модуль проверяет длинну этой строки и уже потом инициализирует этой строкой алгоритм шифрования. Догадались где можно перехватить ключ для подписи? Если да, то мои поздравления!

Теперь осталось найти (Ctrl+F) функцию getSignatureString в отладчике (она почти в самом верху) и поставить бряк (F2) на strlen который расположен чуточку выше функции crypto_auth_hmacsha256_init:


Далее стартуем приложение на телефоне, пробуем войти и срабатывает бряк:


При этом отладчик говорит что работа происходит с регистром R0, а следовательно там должен быть ключ! Но как его достать? Всё просто: напротив регистра расположен его адрес, достаточно кликнуть ПКМ по адресу и нажать Follow in Dump, в результате чего мы перейдём на участок памяти где расположен ключ:


Ключ: c1c7d84501d2f0df05c378f5efb9120909ecfb39dff5494aa361ec0deadb509a
С каждой версией ключи меняются, у меня вроде бы версия 7.15.0

Теперь можно написать программу которая использует данный ключ в корыстных целях (для подписи запросов), но это уже совсем другая история...

© VANS   

10 комментариев:

  1. Забыл упомянуть что статья писалась пол года назад, но это ведро за 350 баксов приказало долго жить, по этому пришлось экономить на школьных завтраках и купить второй такой же, но и с ним было не всё гладко. В результате на написание данной статьи ушло 3 телефона, 2 из которых сейчас не работают.

    ОтветитьУдалить
  2. От куда в тебе столько знаний.. слежу за твоим сайтом давно и не перестаю удивляться. сам как то пробовал но видимо дурак

    ОтветитьУдалить
  3. А как быть, если нативного метода нет в экспорте либы, то есть он динамисеский экспорт делает при загрузке. Как найти куда ставить бряк ?

    ОтветитьУдалить
  4. Для декомпиляций/рекомпиляций/чтения исходников/редактирования Smali, рекомендую мощный комбайн - Android Killer. Сам пользуюсь, есть поиск по файлам декомпилированного проекта и много всего прочего. Скачать можно тут: http://4pda.ru/forum/index.php?showtopic=692968

    ОтветитьУдалить
    Ответы
    1. Благодарю за софтину, но сейчас я стараюсь реверсить обычные программы под Windows

      Удалить
  5. Как насчет того чтобы взломать приложения по накрутке соц сетей для вк,инсты...
    У меня это обычным лаки патчером выходит (иногда =) ))
    У тебя же может получиться взломать топ сервисы

    ОтветитьУдалить
    Ответы
    1. Как только прикроют одну темку - опубликую статью как накручивать баллы в одном популярном приложении. В принципе этот способ подойдёт для большинства приложений подобного типа, но... не буду пока палить тему ибо она приносит не плохой доход.

      Удалить
  6. Спасибо, полезная статья.

    ОтветитьУдалить