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

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

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

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

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

Категории

Все категории
Loading categories
FindFunc — Плагин для IDA Pro для фильтрации функций по шаблонам ассемблера, последовательностям байт, ссылкам на строки/имена и ограничениям по размеру, с поиском на основе правил и расширенным копированием бинарных данных. | Kitploit
Инструменты/GitHubGitHub/felixber/findfunc
Статический анализАнализ КодаОбратная инженерияОтладчикиАнализ Бинарных Файлов
GitHubfelixber/findfunc

FindFunc

Плагин для IDA Pro для фильтрации функций по шаблонам ассемблера, последовательностям байт, ссылкам на строки/имена и ограничениям по размеру, с поиском на основе правил и расширенным копированием бинарных данных.

Репозиторий
362369 месяцев назадПроверено Kitploit

Популярное

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

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

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

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

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

FindFunc: Расширенная фильтрация/поиск функций в IDA Pro

FindFunc — это плагин для IDA Pro, предназначенный для поиска функций, содержащих определённый ассемблерный или байтовый паттерн, ссылающихся на заданное имя или строку, или соответствующих другим ограничениям.

FindFunc занял третье место в конкурсе плагинов IDA Pro HexRays 2022 года!

ffmain

Фильтрация с помощью правил

Основная функциональность FindFunc заключается в том, что пользователь задаёт набор «Правил» (ограничений), которым должна удовлетворять функция в IDA Pro. FF находит и отображает все функции, удовлетворяющие ВСЕМ правилам (все правила соединяются логическим «И»). Исключение: правила могут быть «инвертированы» для отрицательного совпадения, что соответствует «И НЕ».

FF будет планировать выполнение правил в оптимальном порядке для минимизации времени обработки.

Обзор возможностей:

  • В настоящее время доступно 6 правил (см. ниже)
  • Учитывает фрагменты функций (function chunks)
  • Умное планирование правил для производительности
  • Сохранение/загрузка правил в/из файла в простом текстовом формате
  • Несколько независимых вкладок для экспериментов
  • Копирование правил между вкладками через буфер обмена (тот же формат, что и для файлов)
  • Сохранение всей сессии (всех вкладок) в файл
  • Расширенное копирование байтов команд (все, только коды операций, все кроме непосредственных значений и т.д.)
  • Клонирование вкладок для быстрых экспериментов с уточнением результатов
  • Сопоставление кода учитывает префиксы размера адреса и размера операнда

Кнопка «Find Functions» очищает предыдущие результаты и начинает новый поиск, «Refine Results» учитывает только результаты предыдущего поиска.

Расширенное копирование двоичных данных

Дополнительная функция FF — копирование двоичного представления инструкций со следующими опциями:

  • copy all — копирует все байты в буфер обмена
  • copy without immediates — заменяет непосредственные значения в байтах инструкции на ?? (например, AA ?? BB)
  • opcode only — заменяет всё, кроме фактических кодов операций (и префиксов)
  • ...

Подробнее см. раздел «Расширенное копирование» ниже. Эта функция отлично дополняет правило «Байтовый паттерн»!

Сборка и установка

FindFunc — это плагин для IDA Pro на Python, не имеющий внешних зависимостей. Его можно установить, скачав репозиторий и скопировав файл findfuncmain.py и папку findfunc в каталог плагинов IDA Pro. Для IDA 9.0+ репозиторий также можно клонировать непосредственно в каталог плагинов. В любом случае сборка не требуется.

Требования: IDA Pro 8.x (8.3+) с окружением python3. FindFunc предназначен только для архитектуры x86/x64. Протестировано с IDA 8.3 – 9.2, python 3.11 на Windows 10 и 11.

Доступные правила

В настоящее время доступно шесть правил. Они отсортированы от самых тяжёлых к самым лёгким по влиянию на производительность. Для больших баз данных рекомендуется сначала сократить количество кандидатов с помощью лёгкого правила, прежде чем выполнять тяжёлое сопоставление, например, с помощью правила «Код». FF автоматически планирует правила оптимальным образом.

Паттерн кода

Правило для фильтрации функций по наличию заданного фрагмента ассемблерного кода. Это НЕ текстовый поиск по дизассемблированному представлению IDA, а расширенное сопоставление базовой инструкции. Фрагмент может содержать несколько последовательных инструкций, по одной на строку. Поддерживаются фрагменты функций. Помимо буквального ассемблера поддерживаются специальные шаблоны:

  • «pass» — соответствует любой инструкции с любыми операндами
  • «mov* any,any» — соответствует инструкциям с мнемоникой «mov*» (например, mov, movzx, …) и любыми двумя аргументами.
  • «mov eax, r32» — соответствует инструкции с мнемоникой «mov», первым операндом-регистром eax и вторым операндом — любым 32-битным регистром.
    • Аналогично: r — любой регистр, r8/r16/r32/r64 — регистр определённой ширины, «imm» — любое непосредственное значение
  • «mov r64, imm» — соответствует любому перемещению константы в 64-битный регистр
  • «any r64,r64» — соответствует любой операции между двумя 64-битными регистрами
  • mov — соответствует любой инструкции с мнемоникой mov

Больше примеров:

root@kitploit:~
mov r64, [r32 * 8 + 0x100]
mov r, [r * 8 - 0x100]
mov r64, [r32 * 8 + imm]
pass
mov r, word [eax + r32 * 8 - 0x100]
any r64, r64
push imm
push any

Важно: Будьте осторожны при копировании ассемблера из IDA. IDA вставляет в инструкцию имена локальных переменных и другую информацию, что приводит к неудачному сопоставлению. Также не поддерживаются метки («call sub_123456»).

Обратите внимание, что «Паттерн кода» — самое затратное правило; если присутствуют только правила кода, FF не остаётся ничего, кроме как дизассемблировать всю базу данных. Для очень больших двоичных файлов это может занять до нескольких минут. См. примечания по производительности ниже.

Непосредственное значение (константа)

Функция должна содержать заданное непосредственное значение хотя бы один раз в любой позиции. Непосредственное значение — это значение, фиксированное в двоичном представлении инструкции. Примеры инструкций, соответствующих непосредственному значению 0x100:

root@kitploit:~
mov eax, 0x100
mov eax, [0x100]
and al, [eax + ebx*8 + 0x100]
push 0x100

Непосредственные значения можно вставлять из буфера обмена прямо в список правил. Примечание: IDA выполняет расширенное сопоставление по любому размеру и любой позиции непосредственного значения. Если известно, что оно имеет определённую ширину (4 или 8 байт), быстрее может быть байтовый паттерн (но он может давать ложные срабатывания).

Байтовый паттерн

Функция должна содержать заданный байтовый паттерн хотя бы один раз. Формат паттерна такой же, как у бинарного поиска IDA, и поддерживает подстановочные символы — идеально подходит для функции расширенного копирования!

Примеры:

root@kitploit:~
11 22 33 44 aa bb cc
11 22 33 ?? ?? bb cc -> ?? может обозначать любой байт

Байтовые паттерны можно вставлять из буфера обмена прямо в список правил. Примечание: Сопоставление паттернов выполняется довольно быстро и хорошо подходит для быстрого сокращения количества совпадений!

Ссылка на строку

Функция должна хотя бы один раз ссылаться на заданную строку. Строка сопоставляется с помощью модуля fnmatch Python, поэтому поддерживается сопоставление с подстановочными знаками. Сопоставление выполняется без учёта регистра. Учитываются строки следующих форматов: [idaapi.STRTYPE_C, idaapi.STRTYPE_C_16] (можно изменить в классе Config).

Примеры:

  • «TestString» — функция должна хотя бы один раз ссылаться на точную строку (регистр не учитывается)
  • «TestStr*» — функция должна хотя бы один раз ссылаться на строку, начинающуюся с «TestStr» (например, TestString, TestStrong) (регистр не учитывается)

Примечание: Сопоставление строк выполняется быстро и является хорошим выбором для быстрого сокращения числа кандидатов!

Ссылка на имя

Функция должна хотя бы один раз ссылаться на заданное имя/метку. Имя/метка сопоставляется с помощью модуля fnmatch Python, поэтому поддерживается сопоставление с подстановочными знаками. Сопоставление выполняется без учёта регистра.

Примеры:

  • «memset» — функция должна хотя бы один раз ссылаться на имя «memset»
  • «mem*» — функция должна хотя бы один раз ссылаться на имя, начинающееся с «mem» (memset, memcpy, memcmp)

Примечание: Сопоставление имён выполняется очень быстро и идеально подходит для быстрого сокращения числа кандидатов!

Размер функции

Размер функции должен находиться в заданных пределах: «min <= размер функции <= max». Данные вводятся в виде строки вида «min,max». Размер функции включает все её фрагменты.

Примечание: Сопоставление размера функции выполняется очень быстро и идеально подходит для быстрого сокращения числа кандидатов!

Сочетания клавиш и графический интерфейс

Для удобства использования FF можно управлять следующими сочетаниями клавиш:

  • Ctrl+Alt+F — запуск/показ виджета вкладок (основной GUI)
    • Или View->FindFunc
  • Ctrl+F — начать поиск по текущим включённым правилам
  • Ctrl+R — уточнить существующие результаты с помощью текущих включённых правил
  • Правила
    • Ctrl+C — скопировать выбранные правила в буфер обмена
    • Ctrl+V — вставить правила из буфера обмена в текущую вкладку (добавление)
    • Ctrl+S — сохранить выбранные правила в файл
    • Ctrl+L — загрузить правила из файла (добавление)
    • Ctrl+A — выбрать все правила
    • Del — удалить выбранные правила
  • Сохранение сессии
    • Ctrl+Shift+S — сохранить сессию в файл
    • Ctrl+Shift+L — загрузить сессию из файла

Дополнительные возможности GUI:

  • Правый клик по вкладке: возможность клонировать вкладку
  • Правила можно редактировать двойным щелчком по столбцу «Data»
  • Правила можно инвертировать (отрицательное совпадение) двойным щелчком по столбцу «Invert match»
  • Правила можно включать/отключать двойным щелчком по столбцу «Enabled»
  • Колесо мыши на любой ячейке в списке правил или результатов копирует содержимое ячейки в буфер обмена
  • Байтовые паттерны и непосредственные значения можно вставлять из буфера обмена прямо в таблицу правил
  • Вкладки можно переименовывать двойным щелчком по ним
  • Сортировка поддерживается как для списка правил, так и для списка результатов
  • Двойной щелчок по элементу результатов переходит к нему в IDA
    • имя функции: переход к началу функции
    • любой другой столбец: переход к месту совпадения последнего сопоставленного правила
  • Флажок «Profile»: выводит информацию о производительности поиска
  • Флажок «Debug»: выводит подробную отладочную информацию для сопоставления правил кода — используйте только если до правила проверки кода доходит мало функций, иначе это может занять очень много времени!

Расширенное копирование двоичных данных

Часто требуется искать двоичные паттерны ассемблера, но без жёстко заданных адресов и значений (непосредственных), или даже только фактические коды операций инструкции. FindFunc упрощает эту задачу, добавляя три опции копирования в контекстное меню дизассемблера:

Копировать все байты

Копирует все байты инструкции в виде шестнадцатеричной строки в буфер обмена для использования в правиле «Байтовый паттерн» (или бинарном поиске IDA).

root@kitploit:~
B8 44332211      mov eax,11223344
68 00000001      push 1000000
66:894424 70     mov word ptr ss:[esp+70],ax

будет скопировано как

root@kitploit:~
b8 44 33 22 11 68 00 00 00 01 66 89 44 24 70

Копировать только байты без непосредственных значений

Копирует байты инструкции для заданной инструкции, маскируя все непосредственные значения. Пример:

root@kitploit:~
B8 44332211      mov eax,11223344
68 00000001      push 1000000
66:894424 70     mov word ptr ss:[esp+70],ax

будет скопировано как

root@kitploit:~
b8 ?? ?? ?? ?? 68 ?? ?? ?? ?? 66 89 44 24 ??

Копировать только коды операций

Копирует все байты инструкции в виде шестнадцатеричной строки в буфер обмена, маскируя любые байты, не являющиеся фактическим кодом операции (включая sib, modrm, но сохраняя префиксы).

root@kitploit:~
B8 44332211      mov eax,11223344
68 00000001      push 1000000
66:894424 70     mov word ptr ss:[esp+70],ax

будет скопировано как

root@kitploit:~
b8 ?? ?? ?? ?? 68 ?? ?? ?? ?? 66 89 ?? ?? ??

Копировать коды операций + непосредственные значения

Комбинация, сохраняющая код операции и непосредственные значения, но маскирующая, например, mod r/m. Обратите внимание, что это сохраняет коды операций, даже если они требуют определённых регистров, например:

root@kitploit:~
B8 44332211      mov eax,11223344

сохранит код операции B8.

Примечание: Это «наилучшая попытка» с использованием API IDA, поэтому в некоторых случаях она может работать лишь частично. Для 100% корректного решения потребовалась бы специализированная библиотека дизассемблирования x86.

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

Копировать дизассемблер

Копирует выбранный дизассемблер в буфер обмена в том виде, в каком он отображается в IDA.

Производительность

Кратко о производительности:

  1. name, string, funcsize почти бесплатны в любом случае
  2. bytepattern почти бесплатен для паттернов длиной > 2
  3. immediate сложен: Мы можем использовать поиск idaapi, или дизассемблировать всю базу данных и искать сами — возможно, нам всё равно придётся это делать, если мы ищем паттерны кода. НО: сканирование паттернов кода на самом деле намного дешевле, чем сканирование непосредственных значений. API-поиск всех совпадений относительно дорог — примерно в 1/8 стоимости дизассемблирования всей базы данных. Итак: если мы сначала сократим совпадения с помощью дешёвых правил, то мы сильно выиграем от дизассемблирования оставшихся функций и самостоятельного поиска непосредственного значения, особенно если правило кода всё равно присутствует. Однако: если дешёвых вариантов нет, и нам всё равно придётся дизассемблировать большие части базы данных (из-за наличия правил паттернов кода), то использование одного правила непосредственного значения в качестве предварительного фильтра может сильно окупиться. API-поиск ОДНОГО непосредственного значения примерно эквивалентен 1/8 поиска любого количества правил паттернов кода — хотя это также зависит от многих разных факторов...
  4. Правила паттернов кода самые дорогие, но проверка одного паттерна по сравнению с проверкой многих очень похожа.

Список задач (неупорядоченный):

  • jcc-псевдомнемоника
  • Разрешить именованные местоположения в CodeRules («call memset»)
  • Добавить правило перекрёстных ссылок в/из
  • Отмена/повтор
  • Индикатор прогресса
  • Средний клик для закрытия вкладок
  • Меню вкладки: закрыть все, кроме этой
  • Опция «игнорировать все последующие операнды»
  • Правило для параметров при вызовах API внутри функции
  • Правило для требований к родительской/вызывающей/дочерней функции
  • Правило для параметров функции
  • Правило на основе регулярных выражений
  • string/name: опция учёта регистра
  • Автоматически преобразовывать правила непосредственных значений в байтовый паттерн, если применимо?
  • Настройки: чувствительность к регистру, типы строк, диапазон, ...
  • Правила Hexrays?
  • Логическое ИЛИ для правил
  • «Питонизация» кода ;)
  • Распараллеливание
  • Автоматическая генерация правил для идентификации функции?
Скачать инструмент