Каждому кодеру знакома ситуация когда сделать брут, чекер и прочее для какого то сайта является проблемой. Далеко за примером ходить не надо: deliveryclub и instagram. На первом каптчу ввели, на втором вообще регистрация только через приложение. Как жить? Есть конечно же jdgui и apktool но как правило все приложения обфусцированы и эти программы помогают чуть меньше чем никак. В этой статье я расскажу как достать ключ подписи от приложения instagram.
Что нам потребуется для реверса ведройд приложений? Конечно же первым делом сам аппарат с ведройдом на борту! Я купил бомж версию oneplus one, выглядит это дело так:
Стоит такое ведро 350$. Можно купить мобилу дешевле но получиться ли получить на неё ROOT права никто не скажет, именно по этому мой выбор пал на самую популярную модель смартфона. Как получить на неё рут права можно нагуглить за минуту, для других моделей смартфонов есть приложение framaroot, kingroot. Гуглите, это не сложно.
Ну если вы рутанули телефон и он ещё подаёт признаки жизни - двигаемся дальше, а если ничего не выходит - проще купить другой телефон (например iPhone 6s) и забыть ведройд как страшный сон.
Следующим шагом будет включение отладки по USB, делается это так:
Настройки => Опции разработчика => Режим отладки => Ставим галочку => ОК
Лучше всего объяснять на примере инстаграма - это самое простое что может быть. Как обычно декомпилируем .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", должно заработать.
Как видим в начале достаётся строка по идентификатору, затем модуль проверяет длинну этой строки и уже потом инициализирует этой строкой алгоритм шифрования. Догадались где можно перехватить ключ для подписи? Если да, то мои поздравления!
Теперь осталось найти (Ctrl+F) функцию getSignatureString в отладчике (она почти в самом верху) и поставить бряк (F2) на strlen который расположен чуточку выше функции crypto_auth_hmacsha256_init:
Далее стартуем приложение на телефоне, пробуем войти и срабатывает бряк:
При этом отладчик говорит что работа происходит с регистром R0, а следовательно там должен быть ключ! Но как его достать? Всё просто: напротив регистра расположен его адрес, достаточно кликнуть ПКМ по адресу и нажать Follow in Dump, в результате чего мы перейдём на участок памяти где расположен ключ:
Ключ: c1c7d84501d2f0df05c378f5efb9120909ecfb39dff5494aa361ec0deadb509a
С каждой версией ключи меняются, у меня вроде бы версия 7.15.0
Теперь можно написать программу которая использует данный ключ в корыстных целях (для подписи запросов), но это уже совсем другая история...
Что нам потребуется для реверса ведройд приложений? Конечно же первым делом сам аппарат с ведройдом на борту! Я купил бомж версию 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 в котором затем будем заниматься поиском функции интересующей нас функции:
Но на этом этапе у вас может возникнуть подобная ошибка (взято как пример):
Перехват ключа
На самом деле поиск ключа не такая большая проблема если вы умеете пользоваться тётушкой IDA. Мы знаем что для подписи запроса используется функция getSignatureString, по этому давайте изучим её более подробней:
Как видим в начале достаётся строка по идентификатору, затем модуль проверяет длинну этой строки и уже потом инициализирует этой строкой алгоритм шифрования. Догадались где можно перехватить ключ для подписи? Если да, то мои поздравления!
Теперь осталось найти (Ctrl+F) функцию getSignatureString в отладчике (она почти в самом верху) и поставить бряк (F2) на strlen который расположен чуточку выше функции crypto_auth_hmacsha256_init:
Далее стартуем приложение на телефоне, пробуем войти и срабатывает бряк:
При этом отладчик говорит что работа происходит с регистром R0, а следовательно там должен быть ключ! Но как его достать? Всё просто: напротив регистра расположен его адрес, достаточно кликнуть ПКМ по адресу и нажать Follow in Dump, в результате чего мы перейдём на участок памяти где расположен ключ:
Ключ: c1c7d84501d2f0df05c378f5efb9120909ecfb39dff5494aa361ec0deadb509a
С каждой версией ключи меняются, у меня вроде бы версия 7.15.0
Теперь можно написать программу которая использует данный ключ в корыстных целях (для подписи запросов), но это уже совсем другая история...
© VANS
Забыл упомянуть что статья писалась пол года назад, но это ведро за 350 баксов приказало долго жить, по этому пришлось экономить на школьных завтраках и купить второй такой же, но и с ним было не всё гладко. В результате на написание данной статьи ушло 3 телефона, 2 из которых сейчас не работают.
ОтветитьУдалитьна "школьных завтраках" проорал...
УдалитьОт куда в тебе столько знаний.. слежу за твоим сайтом давно и не перестаю удивляться. сам как то пробовал но видимо дурак
ОтветитьУдалитьА как быть, если нативного метода нет в экспорте либы, то есть он динамисеский экспорт делает при загрузке. Как найти куда ставить бряк ?
ОтветитьУдалитьЧто за приложение?
УдалитьДля декомпиляций/рекомпиляций/чтения исходников/редактирования Smali, рекомендую мощный комбайн - Android Killer. Сам пользуюсь, есть поиск по файлам декомпилированного проекта и много всего прочего. Скачать можно тут: http://4pda.ru/forum/index.php?showtopic=692968
ОтветитьУдалитьБлагодарю за софтину, но сейчас я стараюсь реверсить обычные программы под Windows
УдалитьКак насчет того чтобы взломать приложения по накрутке соц сетей для вк,инсты...
ОтветитьУдалитьУ меня это обычным лаки патчером выходит (иногда =) ))
У тебя же может получиться взломать топ сервисы
Как только прикроют одну темку - опубликую статью как накручивать баллы в одном популярном приложении. В принципе этот способ подойдёт для большинства приложений подобного типа, но... не буду пока палить тему ибо она приносит не плохой доход.
УдалитьСпасибо, полезная статья.
ОтветитьУдалить