Skip to content
KitploitKITPLOIT
ИнструментыЭксплойтыБлог
Log in
Отправить
ИнструментыЭксплойтыБлог
Отправить

Инструменты для хакинга, пентеста и кибербезопасности — ваш арсенал защиты!

Kitploit — это каталог инструментов для хакинга, кибербезопасности и пентестинга. Находите последние обновления проектов для поиска уязвимостей, анализа систем, автоматизации тестирования и усиления вашей безопасности.

··Ленты·Контакты·Конфиденциальность·© 2026 Kitploit

Каталог инструментов

Категории

Все категории
Loading categories
fpicker — Набор инструментов для внутрипроцессного фаззинга на основе Frida с прокси AFL++, отдельными активным/пассивным режимами и обменом через разделяемую память для высокопроизводительного поиска уязвимостей с управлением покрытием на различных платформах. | Kitploit
Инструменты/GitHubGitHub/ttdennis/fpicker
Динамический анализ (песочница)Анализ уязвимостейЭксплуатацияФаззингАнализ Бинарных Файлов
GitHubttdennis/fpicker

fpicker

Набор инструментов для внутрипроцессного фаззинга на основе Frida с прокси AFL++, отдельными активным/пассивным режимами и обменом через разделяемую память для высокопроизводительного поиска уязвимостей с управлением покрытием на различных платформах.

Репозиторий
29634221 год назадПроверено Kitploit

Популярное

Смотреть все →

Откройте для себя самые используемые инструменты нашего сообщества.

Изучить все инструменты

Просмотрите нашу коллекцию инструментов

Смотреть все инструменты →
Поделиться

fpicker

Логотип Fpicker

fpicker — это набор инструментов для фаззинга на основе Frida, который предлагает различные режимы фаззинга для внутрипроцессного фаззинга, такие как режим AFL++ или пассивный режим трассировки. Он должен работать на всех платформах, поддерживаемых Frida.

  • Инструкция по установке
  • Сборка и запуск
  • Создание обвязки для фаззинга
  • Режимы и конфигурация

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

Fpicker основан на предыдущих разработках ToothPicker, созданных в ходе моей магистерской диссертации. Большая часть fpicker была разработана в рабочее время у моего работодателя (ERNW).

Требования и установка

Необходимо для запуска fpicker:

  • frida_compile для компиляции скрипта обвязки в один JS-файл
  • frida-core-devkit для соответствующей платформы, доступный в релизах Frida на GitHub.
    • В зависимости от целевой платформы сохраните библиотеку как libfrida-core-ios.a, libfrida-core-macos.a или libfrida-core-linux.a.
    • То же самое касается заголовочных файлов (frida-core.h). Сохраните их как frida-core-linux.h или frida-core-ios.h в зависимости от платформы.
    • Makefile был сделан таким образом, чтобы вы могли собирать для разных систем на одной системе (например, вашей хост-системе и телефоне).
    • Если вы предпочитаете использовать конкретную версию, отредактируйте Makefile соответствующим образом.
    • Чтобы обновиться до последней версии, просто выполните update_frida_version.sh перед сборкой.

Требуется только при работе в режиме AFL++:

  • AFL++
    • на macOS:
      • Соберите с CFLAGS="-DUSEMMAP=1".
    • на iOS:
      • Соберите с CFLAGS="-DUSEMMAP=1 -DTARGET_OS_IOS".

Сборка и запуск

Fpicker можно собрать для macOS, iOS или Linux. Makefile в настоящее время поддерживает сборку только для iOS на macOS, но вполне возможно собрать fpicker с использованием инструментария iOS на Linux.

В зависимости от желаемой цели выполните:

make fpicker-macos
make fpicker-ios
make fpicker-linux

для сборки fpicker.

После сборки fpicker необходимо также собрать обвязку для фаззинга:

Примеры различных вариантов фаззинга см. в папке examples. Общий подход следующий:

  • Создайте пользовательскую обвязку для цели (например, examples/test/test.js) (см. здесь для получения дополнительной информации об обвязках)
  • Скомпилируйте пользовательскую обвязку с помощью frida-compile: frida-compile test.js -o harness.js

Теперь fpicker может начать фаззинг. Точная команда сильно зависит от конфигурации и настройки. Ниже приведено несколько примеров. Они в основном соответствуют примерам из папки examples.

  • Запуск fpicker в качестве прокси AFL++, подключающегося к целевому процессу для фаззинга определённой функции в процессе:
afl-fuzz -i examples/test-network/in -o ./examples/test-network/out -- \\
    ./fpicker --fuzzer-mode afl -e attach -p test-network -f ./examples/test-network/harness.js
  • Запуск fpicker в автономном режиме, подключающегося к серверу и запускающего клиентскую программу для отправки входных данных фаззинга:
./fpicker --fuzzer-mode standalone -e attach -p server-process -f harness.js --input-mode cmd \\
    --command "./client-send @@" -i indir -o outdir
  • Запуск fpicker в автономном режиме, подключающегося к серверу, фаззинг внутри процесса с пользовательской командой мутатора:
./fpicker --fuzzer-mode active --communication-mode shm -e attach -p server-process -f harness.js \\
    -i indir -o outdir --standalone-mutator cmd --mutator-command "radamsa"
  • Запуск fpicker в пассивном режиме, подключающегося к серверу, сбор покрытия и полезных нагрузок:
./fpicker --fuzzer-mode passive --communication-mode send -e attach -p server-process -o outdir -f harness.js
  • Запуск fpicker в автономном режиме, подключающегося к запущенному процессу на удалённом устройстве, фаззинг внутри процесса с пользовательской командой мутатора:
./fpicker --fuzzer-mode active -e attach -p test -D remote -o examples/test/out/ -i examples/test/in/ \\
    -f fuzzer-agent.js --standalone-mutator cmd --mutator-command "radamsa"

Создание обвязки для фаззинга

Каждая цель требует собственной обвязки для фаззинга. Самая важная часть этой обвязки — определение точки входа для Stalker от Frida, которая фактически определяет, в каком месте вставляется инструментация. В режиме in-process это просто. Функция обычно является той, которая вызывается на каждой итерации фаззинга. Однако это может быть и другая функция.

Минималистичная реализация обвязки (в режиме command) может выглядеть так:

// Import the fuzzer base class
const Fuzzer = require("harness/fuzzer.js");

// The custom fuzzer needs to subclass the Fuzzer class to work properly
class TestFuzzer extends Fuzzer.Fuzzer {
    constructor() {
        // The constructor needs to specify the address of the targeted function and a NativeFunction
        // object that can later be called by the fuzzer.

        const FUZZ_FUNCTION_ADDR = Module.getExportByName(null, "FUZZ_FUNCTION");
        const FUZZ_FUNCTION = new NativeFunction(
            FUZZ_FUNCTION_ADDR,
            "void", ["pointer", "int64"], {
        });

        super("test", FUZZ_FUNCTION_ADDR, FUZZ_FUNCTION);
    }
}

const f = new TestFuzzer();
exports.fuzzer = f;

Эта обвязка настраивает инструментацию на отслеживание функции FUZZ_FUNCTION. Инструментация начинается при входе в эту функцию и завершается при её возврате. Эту функцию следует выбирать тщательно, так как она ресурсоёмка, и чем больше (потенциально неважных) частей процесса инструментировано, тем медленнее становится фаззер. Конечно, это компромисс между скоростью и желаемым покрытием. Кроме того, в настоящее время фаззер поддерживает только функции, которые вызываются только один раз за одну итерацию фаззинга, т.е. функция не должна вызываться более одного раза в течение одного тестового случая, иначе информация о покрытии может стать ненадёжной.

При использовании режима in-process в скрипте фаззера требуется ещё одна функция: метод fuzz. Он будет вызываться на каждой итерации. Он будет вызван с двумя параметрами: указателем на буфер и длиной буфера. Наша примерная целевая функция принимает два параметра: указатель на буфер и его длину. Таким образом, мы можем просто передать параметры, которые получаем в методе fuzz.

fuzz(payload, len) {
    this.target_function(payload, parseInt(len));
}

В пассивном режиме необходимо указать обратный вызов, который обрабатывает требуемые данные. Фаззер ожидает получить буфер полезной нагрузки и его длину. В зависимости от целевой функции, которую фаззят, эти данные необходимо извлечь. В следующем примере у нас снова есть функция с двумя параметрами: указатель на буфер и его длина. Параметр args содержит все потенциальные параметры, которые получает целевая функция, поэтому параметр длины (в нашем случае второй) можно получить через args[1]. Затем мы считываем буфер как Uint8Array и отправляем его обратно фаззеру с помощью метода sendPassiveCorpus.

passiveCallback(args) {
    const len = args[1];
    const data = new Uint8Array(Memory.readByteArray(args[0], parseInt(len)));
Скачать инструмент