1. eznoob26.08.2019 в 00:56от
Загрузка...

Android reversing

Тема в разделе "Социальные сети", создана пользователем kemp44, 29.01.2019.

  1. kemp44

    kemp44

    Статус:
    Оффлайн
    Регистрация:
    29.01.19
    Сообщения:
    4
    Репутация:
    -3 +/-
    Это копипаст,надеюсь грач меня простит,букв много,для заинтересованной аудитории сойдёт,все ссылки в оригинале,за ваши действия ответственности не несу,публикация с целью ознакомления.Для КФ,если не правильно разместил,прошу аккуратно перенести в нужный раздел.
    [​IMG]


    Перехватываем HTTP/s трафик Android.

    Звучит просто, но так ли это на самом деле ?

    Глава 0. Инструмент
    • Fiddler - отладочный прокси сервер
    • Apk Easy Tool - при помощи нее мы сможем декомпилировать, компилировать и подписывать apk приложения для Android. (как скачать: screen)
    • JavaDecompilers.com - онлайн декомпилятор apk приложений в java source code.
    • XYplorer - файловый менеджер Windows с удобным поиском содержимого в файлах.
    • Notepad++ - просто удобный текстовый редактор.
    • Memu emulator - Android эмулятор основанный на виртуальной машине HyperV
    Глава 1. Перехватываем трафик не защищенных приложений.*

    Fiddler нам понадобится для того что бы перехватывать трафик при помощи технологии MitM

    Устанавливаем Fiddler и настраиваем его:
    Tools -> Options (screen)
    • HTTPS (screen правильных настроек)
      • HTTPS CONNECTs: перехват https подключений (потребуется установка сертификата - устанавливаем)
        • Decrypt HTTPS traffic: расшифровка шифрованного https трафика
        • Ignore server certificate errors (unsafe): игнорирование ошибок
    • Connections (screen правильных настроек)
      • Port: выбираем более удобный для вас, я оставляю по умолчанию "8888"
      • Allow remote computers to connect: разрешаем другим устройствам удаленно цепляться к вашему отладочному Proxy (в роли удаленного устройства у нас будет выступать anroid эмулятор/реальное устройство в вашей WiFi сети)
    Rules (screen настройки описанные здесь не обязательны, но я считаю что если вы будите использовать именно их вам будет более удобно и проще работать с Fiddler)
    • Hide image requests - скрываем из списка все подключения связанные с картинками
    • Hide connects request - скрываем подключения к тоннелям и так далее
    • Remove encodings - в процессе перехвата трафика мы будем получать его в чистом виде, благодаря тому что эта функция автоматически удаляет все кодировки, распаковывает GZIP.
    После всех настроек нужно перезапустить Fiddler, а так же узнать свой локальный IP адрес, в Fiddler для этого отделено небольшое пространство - screen.
    В моем случае адрес Proxy будет таков: 192.168.100.4:8888 - вам нужно запомнить это!

    Установка эмулятора Android и его настройка:

    Эмулятор потребуется нам для запуска на нем Android приложений что бы отлавливать трафик с приложений, если вы не хотите использовать эмулятор вы можете настроить свое Android устройство по этой же инструкции.
    Во время настройки устройства Fiddler должен быть настроен и запущен.

    • Настройка Proxy WiFi
      • Открываем настройки Android и выбираем пункт настроек WiFi (screen)
      • Подключаемся к WiFi сети в которой находится ваш ПК, нажимаем по подключенной сети и удерживаем (1. screen 2.screen), в появившемся окне выбираем пункт "Изменить сеть"
      • Устанавливаем галочку "Расширенные настройки"(screen) -> установка прокси сервера вручную (screen) -> устанавливаем адрес прокси и port которые получили ранее и сохраняем настройки (screen)
    • Установка сертификата Fiddler в доверенные на устройстве
      • Открываем браузер и вводим в адресной строке адрес нашего прокси сервера
      • Скачиваем файл сертификата и устанавливаем его (1.screen 2. screen)
    Настройка устройства окончена. Можем открыть https://google.com для проверки: screen. В Fiddler мы можем наблюдать отловленный http и https трафик в расшифрованном виде.
    В большинства приложениях мы можем отловить HTTP/s трафик по инструкции описанной выше без каких либо проблем, но все чаще разработчики приложений используют "SSL Pinning" что бы никто кроме них и их сервера не мог анализировать HTTP/s трафик с приложения, в этом случае обычной MitM атакой мы на обойдемся - нам потребуется сделать патч функций которые проверяют подлинность сертификата, об этом ниже и пойдет речь.
    Приложение над которым мы будем работать: Kohls, в данном приложение имеется алгоритм проверки подлинности установленных сертификатов на устройстве, в случае обнаружение поддельного сертификата приложение обрубает связь, наша цель найти функцию/и которая проверяет подлинность, модифицировать алгоритм работы так что бы она всегда возвращала положительный результат.

    Глава 3. Decompiling Android application

    Так как наша цель это изменения кода программы для последующий сборки и использования нам потребуется 2 вида исходного кода приложения:
    1. Java source - "оригинальный" код на котором было написано приложение, декомпилятор ".apk" имеет такой алгоритм: apk->smali->java. Исходный код Java нам потребуется для удобного чтения кода приложения, его компилировать и изменять мы не будем.
    2. Smali source - android приложение изначально пишется на Java, но dalvik (виртуальная машина Android) компилирует Java код в машинный код Smali, таким образом для того что бы изменить приложение и собрать его обратно нам нужно редактировать именно Smali что бы потом собрать его обратно.
    Для начала нам требуется скачать целевое приложение, в нашем случае как было сказано выше это Kohls.
    Давайте создадим директорию под именем Kohls Decompiling (советую поместить эту папку в путь который не будет содержать латиницы во избежании конфликтов кодировок), и в этой папке создадим такие директории:
    • smali
      • original smali - в этой директории мы будем хранить не измененный Smali код для того что бы откатится назад в случае краха :)
      • modificate smali - тут мы будем хранить модифицированный Smali код
    • java - в эту папку поместим Java исходник приложения
    • new apk - здесь будут измененные apk
    В эту же папку поместим скачанный ранее apk файл приложения и дадим ему название "kohls.apk". Что получилось у меня: screen, конечно вы можете не делать этого, но для удобства в будущем я советую поступить именно так.

    Decompiling Android application -> Java souce code:
    1. Открываем сайт JavaDecompilers.com, справа в меню выбираем раздел APK Decompiler (screen), далее выбираем файл исходный код которого мы хотим получить и жмем кнопку Upload and Decompile (screen), дожидаемся загрузки файла на их сервер и окончания процесса, по итогу вам нужно скачать архив с java source кодом приложения (screen)
    2. Полученный архив распаковываем в ранее созданную папку Kohls Decompiling -> java (screen)
    Decompiling Android application -> Smali souce code:
    Для получения машинного кода Android из приложения нам потребуется Apk Easy Tool - данная программа является графической оболочкой APKTool, скачиваем программу по ссылке в начале статьи.
    Я создал отдельную папку в ранее созданной директории, и получил такой путь к Apk Easy Tool - Kohls Decompiling -> ApkEasyTool (screen).
    Теперь давайте запустим программу (в случае если у вас Windows x64 любой из двух, в ином случае файл под названием apkeasytool.exe), приступим к настройкам:
    • Если после запуска появилось окно с предложением автоматической установки папок - отказываемся, мы будем настраивать все сами (screen):
      • Указываем настройки как на screenshot
    • Далее нам нужно указать APKTool которым будет управлять ApkEasyTool, скачиваем последнюю версию (screen). Закрываем ApkEasyTool, заходим в папку Kohls Decompiling -> ApkEasyTool -> Apktool - удаляем все что там находится и закидываем в нее файл скачанный пунктом ранее. Вновь открываем ApkEasyTool и выбираем в настройках версию APKTool (screen).
    • Указываем CMD mode - Normal (Default, screen)
    • В вкладке ApkTool указываем настройки как на screenshot - в исходный код не будем записывать информацию о процессе отладки, а так же отказываемся от декомпиляции ресурсов (могут быть проблемы при их компиляции), устанавливаем настройку в компиляторе которая позволит в дальнейшем если потребуется производить отладку приложения.
    • В вкладке Sign устанавливаем автоматическую подпись файла после его компиляции (screen)
    Настройка ApkEasyTool окончена, возвращаемся на основную вкладку и загружаем apk для декомпиляции (screen), нажимаем кнопку Decompile(screen) и ожидаем (screen), в среднем декомпиляция приложения занимает в районе 2-3 минут, по окончанию работы вы увидите уведомление (screen). Мы можем открыть папку с smali source кодом нашего приложения нажатием на кнопку "Decompiled APK directory", или открыв руками путь к созданной ранее директории Kohls Decompiling -> smali -> modificate smali, скопируем созданную папку "kohls" в Kohls Decompiling -> smali -> original smali тем самым создав backup оригинального smali кода.
    По итогу мы имеем такое древо папок:
    [​IMG]
    Сразу уточню, что редактировать smali код мы будем тот который находится в папке Kohls Decompiling -> smali -> modificate smali, потому что именно из нее ApkEasyTool компилирует новый APK.
    Глава 4. Ищем функцию, изменяем ее и собираем приложение обратно

    Как и говорилось ранее искать функции которые проверяют подлинность сертификата и изучать их мы будем в Java source code приложения - таким образом мы будем лицезреть более читаемый и понятный код, а изменять и собирать обратно мы будем smali source code приложения.

    Поиск функции которая проверяет подлинность сертификата в Java Source Code:
    В данной статье я опишу 1 из методов поиска функций/и которые проверяют подлинность сертификатов установленных на устройстве (SSL Pinning), этот способ действует в 60-70 % случаев.
    С различными методами реализации SSLPinning вы можете ознакомится в этой статье.
    Мы будем искать ключевые слова:
    pinning
    certificate pinning
    по всем классам и файлам в исходном коде приложения, для удобного и быстрого поиска мы будем использовать программу XYplorer, открываем директорию с Java исходником в программе, и открываем вкладку Contens, в поле ввода пишем интересующий нас ключ для поиска (я выбрал "pinning" - он более универсален) и ищем файлы (screen).
    В результате поиска можем видеть такую картину: screen
    Теперь нам нужно открыть каждый файл и поискать в нем функцию которая проверяет подлинность сертификатов, к примеру такие классы мы можем сразу отбрасывать, наша цель найти функцию где есть текст с ошибкой о проблеме с сертификатом, к примеру что то такое: Certificate pinning failure!, зачастую ошибки в Java Code формируются таким образом что сначала создается String переменная куда потом будет помещен текст ошибки, к примеру:
    Код:
    StringBuilder append = new StringBuilder().append("Certificate pinning failure!").append("\n Peer certificate chain:");
    или через обертку "throw/catch":
    Код:
    throw new IllegalArgumentException("Certificate pinning requires X509 certificates");
    На основе этой информации нам нужно найти максимально подходящие функции, по итогу я нашел единственный подходящий класс: C6565k.java (имена могут отличаться от версии к версии самого android приложения), так же при поисках я учитывал местоположение класса, найденный мною класс по ключу находится в директории source\okhttp3 - okhttp3 это сетевая библиотека, и скорее всего именно этот класс находящийся в ее директории отвечает за проверку подлинности сертификатов, давайте взглянем что под капотом? Исходный код из найденного мною файла.
    В нем я нашел функции: m22766a и m22761a в этих функциях я нашел вывод ошибок о поддельном сертификате (screen), но функция m22761aвызывается в функции m22766a (screen), зная это мы не будем рассматривать редактирование функции m22761a, а будем сразу работать над функций m22766a (отдельно сама функция), кратко опишу алгоритм ее работы:
    функция получает список установленных пользователем сертификатов, и проверяет каждый на подлинность, в случае обнаружения хотя бы 1 поддельного сертификата мы получим ошибку.
    Все что нам нужно сделать это преждевременно до получения сертификатов и их проверки завершить функцию, к примеру так, таким образом функция не успеет получить список сертификатов установленных пользователем и соответственно выдать нам ошибку :) Осталось изменить функцию в Smali Source и собрать приложение!
    Поиск найденное ранее функции в Smali Source Code и ее модификация:
    Smali это машинный язык для виртуальной машины dalvik, и его код сильно отличается от Java, список opcodes (команд, и так далее) вы можете найти здесь.
    Давайте откроем наш Smali source в XYplorer Kohls Decompiling -> smali -> modificate smali -> kohls
    Попробуем найти класс по тексту ошибки в найденной ранее функции "Certificate pinning failure!", по итогу мы нашли всего 1 класс, который находится в той же директории что и класс в Java source: screen
    Давайте откроем его(код всего класса) и найдем нашу функцию (функция). Теперь нам нужно найти в списке opcodes команду которая вернет функцию без определенного значения, в нашем случае это return-void, пропатчим smali функцию точно так же как и патчили ранее Java функцию (запатченная функция).
    Сохраняем измененный класс. Теперь нам остается скомпилировать приложение, об этом ниже:
    Компилируем модифицированное приложение:
    Возвращаемся в ApkEasyTool, и даем приложению новое название (добавляем в конец версию), нажимаем кнопку Compile (после компиляции ApkEasyTool автоматически подпишет приложение так как мы установили такие настроек ранее), компилированный файл окажется в папке созданной нами ранее Kohls Decompiling -> new apk.
    Глава 5. Устанавливаем приложение и тестируем его

    Устанавливаем новое приложение на эмулятор который мы ранее настроили, открываем так же ранее настроенный Fiddler и пробуем словить траффик :)
    Видео моих тестов: https://www.pornhub.com/view_video.php?viewkey=ph5c058b48cbe16 или тут https://www.xvideos.com/video42305855/android_porn(кроме как туда я не нашел место для такого ролика :D )
    В окончание...
    Так же хочу прикрепить список блогов и подобного что можем помочь вам:
     
  2. kemp44

    kemp44

    Статус:
    Оффлайн
    Регистрация:
    29.01.19
    Сообщения:
    4
    Репутация:
    -3 +/-
    просьба перекинуть в соответствующею тему