Русские Блоги
Фрида учебник
Frida — это фреймворк на основе python + javascript, подходящий для таких платформ, как android / ios / linux / win / osx. Функция динамического выполнения кода Фриды в основном реализована на языке C в его ядре Gum.
режим внедрения: в большинстве случаев мы присоединяемся к процессу, который уже был запущен, или перехватываем при запуске программы, а затем запускаем логику кода в целевом процессе. . Этот метод — наиболее часто используемый метод Фриды. Общая идея режима внедрения заключается в следующем. Ядро Frida с GumJS упаковывается в библиотеку динамической компоновки, а затем библиотека динамической компоновки вводится в целевой процесс, и в то же время предоставляется двусторонний канал связи, так что контрольный конец может быть Он взаимодействует с внедренным модулем. Когда он не нужен, внедренный модуль можно удалить в целевом процессе.
Встроенный режим: для устройств, которые не были рутированы, Frida предоставляет компонент библиотеки динамической компоновки frida-gadget, который можно интегрировать в программу для использования функции динамического выполнения Frida. После интеграции гаджета вы можете взаимодействовать с программой с помощью Frida.
Режим предварительной загрузки: автоматическая загрузка файлов Js.
Устройство с двумя корневыми каталогами для сборки
1. Скачать FRIDA
2. Скачайте frida-server
frida-server — это процесс-демон, который взаимодействует с ядром Frida через TCP. Порт прослушивания по умолчанию — 27042.
Адрес:https://github.com/frida/frida/releases
Примечание. Соответствие версии и типа, корпуса и устройства.
3. Подключите устройство и подтвердите подключение.
4. Разархивируйте сжатый пакет frida-server и вставьте его на устройство.
5. Запустите frida-server.
6. Проверьте, нормально ли
перенаправить TCP-порт Android на локальный
-U означает USB, и пусть Фрида проверит настоящее USB-устройство, это успешно, как показано на рисунке.
Три часто используемых API
1.JAVA
(1)Java.perform(fn)
frida’s main, примечание: здесь должны быть размещены все скрипты, например:
(2)Java.use(className)
динамически получить объект класса, чтобы изменить реализацию метода объекта в будущем, или использовать n e w ( ) 实 例 化 对 象 , » role=»presentation» style=»position: relative;»> n e w ( ) настоящий пример Преобразовать Верный подобно , dispose () уничтожает объект, например:
(3)Java.enumerateLoadedClasses(callbacks)
Перечислить загруженные в данный момент классы и обработать их с помощью функции обратного вызова
функция обратного вызова onMatch: function (className) <>
вызывается при нахождении каждого загруженного класса, параметр — это имя класса, этот параметр можно передать в java.use () для получения пакета класса js
функция обратного вызова onComplete: function ()
вызывается после перечисления всех классов
2.JavaScript
(1)Interceptor.attach(target, callbacks)
Выполняет перехват вызова функции в местоположении, указанном target, target — это параметр NativePointer, используемый для указания адреса функции, которую вы хотите перехватить. Параметр callbacks — это объект:
onEnter: function (args): обратный вызов перед вызовом перехваченной функции. Параметры исходной функции представлены массивом args (массив объектов NativePointer), и здесь можно изменить параметры вызова функции.
onLeave: function (retval): обратный вызов после вызова перехваченной функцией, где retval представляет возвращаемое значение исходной функции, а retval наследуется от NativePointer и представляет собой инкапсуляцию исходного возвращаемого значения. Вы можете использовать вызов retval.replace (1337), чтобы изменить содержимое возвращаемого значения. Примечание: объект retval действителен только в рамках функции onLeave, поэтому, если вы хотите сохранить этот объект для будущего использования, вы должны использовать глубокую копию для сохранения объекта, например: ptr (retval.toString ())
Пример:
Кроме того, этот объект содержит некоторые дополнительные полезные свойства:
(2)Interceptor.detachAll()
Отменить все предыдущие вызовы перехвата
(3)Interceptor.replace(target, replacement):
замена кода реализации функции, обратите внимание: этот случай в основном используется для полной замены исходной реализации функции. Параметр замены реализуется с помощью NativeCallback в форме JavaScript. Если вы хотите Чтобы отменить этот эффект замены, вы можете использовать вызов Interceptor.revert для достижения
Четыре инструмента
(1)frida-ps
используется для перечисления процессов
(2)frida-trace
Динамическое отслеживание
Пример:
Запустите браузер Chrome на телефоне.
Вы можете увидеть в терминале:
frida-trace сгенерирует файл javascript, а затем Фрида внедрит его в процесс и отслеживает определенные вызовы. Сгенерированный скрипт open.js перехватит функцию open в libc.so и параметры вывода.
open.js:
Вы можете изменить open.js для работы в реальном времени, и вывод терминала показан на рисунке.
(3) привязка Python
Пример:
вставить скрипт chrome.js из Python
Примечание. При загрузке сценария из командной строки и последующем создании командного процесса Frida легко дает сбой. Итак, сначала сгенерируйте процесс, а затем позвольте Фриде внедрить сценарий
Пять использовать
(1) Подключите функцию к libc.so
Запустите FRIDA и приложение и введите код FRIDA до того, как приложение запустит основной процесс. —Без паузы не прерывает работу приложения и оставляет задачу сгенерированного процесса FRIDA, которая откроет оболочку, в которой можно писать команды для Фриды с использованием Javascript API.
Например: перепишите функцию onResume, как показано на рисунке, после вызова onResume () будет получен следующий результат.
(2) Функция крючка
FRIDA может динамически изменять поведение приложений Android, например, может обходить функцию, которая определяет, имеет ли устройство Android root-права. Для приложений, работающих в среде ART (Android Runtime, Android Runtime), вы можете использовать Java.perform для подключения функций.
Нужны инструменты:
dex2jar: откройте apk с помощью инструмента сжатия и поместите предлагаемые классы classes.dex в папку dex2jar, добавьте разрешения на выполнение для d2j_invoke.sh и d2j-dex2jar.sh и выполните sh d2j-dex2jar.sh classes.dex получить classes-dex2jar.jar.
JD-GUI: чтение classes-dex2jar.jar
(3) Собственная функция перехвата
Используйте функцию Interceptor в Frida, чтобы углубиться в базовую память устройства и подключить определенную библиотеку или адрес памяти.
могут потребоваться инструменты:
Radare2 (или другие инструменты дизассемблирования): вы можете использовать r2frida для подключения Radare2 к Frida, а затем выполнить статический анализ и дизассемблирование памяти процесса. Используйте программу управления пакетами Radare2 для установки r2frida, обратите внимание на то, чтобы сначала установить Radare2.
Синтаксис для доступа к процессу и разрешения r2frida выполнить операцию внедрения следующий:
Шесть встроенных устройств с режимом извлечения рута
Необходимые инструменты:
адрес загрузки apktool:https://bitbucket.org/iBotPeaches/apktool/downloads/
1. Загрузите frida-Gadget.
2. Приложение для декодирования
3. Скопируйте соответствующий frida-Gadget в targetappFolder / lib / или targetappFolder / lib / armeabi и обратите внимание на соответствующую версию.
4. Откройте manifest.xml, чтобы найти MainActivity, поскольку мы хотим внедрить frida-Gadget перед выполнением любого другого кода, поэтому скопируйте следующий код smali в метод onCreate () MainActivity.
5. Если в manifest.xml нет разрешения на доступ в Интернет, добавьте его.
6. Перепаковать apk
7. Подпись
Создайте хранилище ключей (если оно еще не доступно)
zipalign (в build-tools sdk обратите внимание на путь)
8. Установите apk
Семь фрида-гаджет использования
APK, который был переупакован в разделе 6, перейдет на страницу ожидания при запуске. В настоящее время используйте frida-ps -U для отображения только одного процесса гаджета и используйте frida -U Gadget для подключения (все еще в порядке Используйте frida-trace и другие инструменты).
Мы можем работать с% load script.js (сценарий по-прежнему нужно обернуть в Java.perform ()).
8. Некоторые существующие методы обнаружения FRIDA.
(1) Метод: frida-server взаимодействует с frida извне через TCP, Java просматривает список запущенных процессов, чтобы проверить, запущен ли frida-server
Действие: переименовать frida-server
(2) Метод: TCP-порт по умолчанию для frida-server — 27047, проверьте, открыт ли порт.
Меры: укажите параметры в командной строке, чтобы изменить порт прослушивания frida-server
(3) Метод: frida-server использует протокол D-Bus для связи и отправляет сообщения аутентификации D-Bus для каждого открытого порта, а порт ответа — frida-server.
Меры: Frida предоставляет режим, не требующий запуска frida-server
(4) Метод: используйте библиотеку, сопоставленную с памятью во время выполнения frida, для непосредственной проверки загруженных библиотек одну за другой. Сканируйте функции библиотеки Фриды «гаджеты» в памяти. Например: строка «LIBFRIDA», которая присутствует во всех версиях frida-gadget и frida-agent.
Меры: исправление, перестройка и подпись измененного apk (например: apktool)
Источник
Android
In this tutorial we show how to do function tracing on your Android device.
Setting up your Android device
Before you start, you will need to root your device in case you haven’t done so already. It is technically also possible to use Frida without rooting your device, for example by repackaging the app to include frida-gadget, or using a debugger to accomplish the same. But, for this introduction we’re going to focus on the simplest case: a rooted device.
Also note that most of our recent testing has been taking place on a Pixel 3 running Android 9. Older ROMs may work too, but if you’re running into basic issues like Frida crashing the system when launching an app, this is due to ROM-specific quirks. We cannot test on all possible devices, so we count on your help to improve on this. However if you’re just starting out with Frida it is strongly recommended to go for a Pixel or Nexus device running the latest official software, or a device whose software is as close to AOSP as possible. Another option is using an emulator, ideally with a Google-provided Android 9 emulator image for arm or arm64. (x86 may work too but has gone through significantly less testing.)
You will also need the adb tool from the Android SDK.
First off, download the latest frida-server for Android from our releases page and uncompress it.
Now, let’s get it running on your device:
For the last step, make sure you start frida-server as root, i.e. if you are doing this on a rooted device, you might need to su and run it from that shell.
adb on a production build
If you get adbd cannot run as root in production builds after running adb root
you need to prefix each shell command with su -c . For example: adb shell «su -c chmod 755 /data/local/tmp/frida-server»
Next, make sure adb can see your device:
This will also ensure that the adb daemon is running on your desktop, which allows Frida to discover and communicate with your device regardless of whether you’ve got it hooked up through USB or WiFi.
A quick smoke-test
Now, on your desktop it’s time to make sure the basics are working. Run:
This should give you a process list along the lines of:
Great, we’re good to go then!
Tracing open() calls in Chrome
Alright, let’s have some fun. Fire up the Chrome app on your device and return to your desktop and run:
Now just play around with the Chrome app and you should start seeing open() calls flying in:
You can now live-edit the aforementioned JavaScript files as you read man open , and start diving deeper and deeper into your Android apps.
Источник
Внедрение кода в чужое приложение с помощью Frida
Когда речь идет о взломе и модификации чужого приложения, то на ум приходит использование декомпилятора, дизассемблера и отладчика. Но есть софтина, которая работает по другому. Знакомьтесь — Frida, тулкит, который позволяет внедриться в какой-нибудь процесс и переписать его части на языке JavaScript.
Внедрение кода в чужое приложение
Представьте, что вам в руки попал семпл какого-нибудь вредоноса. Вы запускаете его в эмуляторе и пытаетесь проанализировать поведение. Но оказывается, что в эмуляторе он работает совсем не так, как на реальном устройстве, и никакой подозрительной активности не проявляет: вредонос умеет определять, что находится в эмулируемой среде.
Вы об этом догадываетесь и поэтому решаете запустить вредонос под дебаггером (предварительно распаковав малварь и добавив строчку android:debuggable=»true» в AndroidManifest.xml), чтобы определить, как именно вредонос производит проверку на эмулятор. И снова проблема: она умеет определять, что работает под отладчиком, и просто не запускается при запуске. Следующий шаг: статический анализ кода с помощью декомпилятора и дизассемблера, правка с целью вырезать куски, проверяющие наличие отладчика и эмулируемой среды, снова правка кода по причине ошибки и все в таком духе.
А теперь представьте, что у вас есть инструмент, позволяющий прямо во время работы приложения отключить все эти проверки, просто переписав проверочные функции на JavaScript. Никаких дизассемблерных листингов smali, никаких правок низкоуровневого кода, никаких пересборок приложения; вы просто подключаетесь к работающему приложению, находите нужную функцию и переписываете ее тело. Не плохо звучит, не так ли?
Внедрение кода в чужое приложение с помощью Frida
Frida — это так называемый Dinamic Instrumentation Toolkit, то есть набор инструментов, позволяющих на лету внедрять собственный код в другие приложения. Ближайшие аналоги Frida — это знаменитый Cydia Substrate для iOS и Xposed Framework для Android, те самые фреймворки, благодаря которым появились твики. Frida отличается от них тем, что нацелена на быструю правку кода в режиме реального времени. Отсюда и язык JavaScript вместо Objective-C или Java, и отсутствие необходимости упаковывать «твики» в настоящие приложения. Вы просто подключаетесь к процессу и меняете его поведение, используя интерактивную JS-консоль (ну или отдаете команду на загрузку ранее написанного скрипта).
Frida умеет работать с приложениями, написанными для всех популярных ОС, включая Windows, Linux, macOS, iOS и даже QNX. Мы же будем использовать ее для модификации приложений под Android.
Итак, что нам потребуется:
- Машина под управлением Linux. Можно и Windows, но, когда занимаешься пентестом приложений для Android, лучше использовать Linux.
- Установленный adb. В Ubuntu/Debian/Mint устанавливается командой sudo apt-get install adb.
- Рутованный смартфон или эмулятор на базе Android 4.2 и выше. Frida умеет работать и на нерутованном, но для этого вам придется модифицировать APK подопытного приложения. Это просто неудобно.
Источник