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 は、2022 HexRays IDA Pro Plugin Contest で第3位を獲得しました。

ffmain

ルールによるフィルタリング

FindFunc の主な機能は、ユーザーが IDA Pro のコード関数が満たす必要がある「ルール」または制約のセットを指定できることです。FF は、すべてのルールを満たすすべての関数を検索してリストします(つまり、現在すべてのルールは AND 結合されています)。例外: ルールは「反転」して否定マッチにすることができます。そのようなルールは「AND NOT」に準拠します。

FF は、処理時間を最小限に抑えるために、ルールをスマートな順序でスケジュールします。 機能概要:

  • 現在利用可能な6つのルール(下記参照)
  • 関数チャンクに対応
  • パフォーマンスのためのルールのスマートスケジューリング
  • シンプルなASCII形式でルールをファイルに保存/読み込み
  • 実験用の複数の独立したタブ
  • クリップボードを介したタブ間のルールコピー(ファイル形式と同じ形式)
  • セッション全体(すべてのタブ)をファイルに保存
  • 高度な命令バイトコピー(すべて、オペコードのみ、即値以外すべてなど)
  • 結果を絞り込むためのクイック実験用のタブ複製
  • コードマッチングはアドレスサイズプレフィックスとオペランドサイズプレフィックスを尊重します

「Find Functions」ボタンは既存の結果をクリアして新規検索を開始し、「Refine Results」は前回の検索結果のみを考慮します。

高度なバイナリコピー

FF の補助機能として、以下のオプションで命令のバイナリ表現をコピーする機能があります。

  • すべてコピー -> すべてのバイトをクリップボードにコピー
  • 即値を除いてコピー -> 命令バイト内の即値をブランクアウト (AA ?? BB)
  • オペコードのみ -> 命令の実際のオペコード(およびプレフィックス)以外をすべてブランクアウト
  • ...

詳細は下記の「高度なコピー」セクションを参照してください。 この機能は Byte Pattern ルールと相性が良いです。

ビルドとインストール

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 でテスト済みです。

利用可能なルール

現在、以下の6つのルールが利用可能です。パフォーマンスへの影響が大きい順に並べられています。 大規模なデータベースでは、まず安価なルールで候補関数を絞り込んでから、コードルールなどの重いマッチングを行うことをお勧めします。FF は自動的にルールをスマートな順序でスケジュールします。

コードパターン

指定されたアセンブリコードスニペットを含む関数をフィルタリングするルールです。 これは IDA のテキスト逆アセンブル表現のテキスト検索ではなく、基になる命令の高度なマッチングを実行します。 スニペットには、連続した複数の命令を1行に1つずつ含めることができます。関数チャンクに対応しています。 リテラルアセンブリに加えて、特別なワイルドカードマッチングをサポートします。

  • "pass" -> 任意のオペランドを持つ任意の命令にマッチ
  • "mov* any,any" -> ニーモニック "mov*" (例: mov, movzx, ...) かつ任意の2つの引数を持つ命令にマッチ
  • "mov eax, r32" -> ニーモニック "mov"、第1オペランドがレジスタ eax、第2オペランドが任意の32ビットレジスタの命令にマッチ
    • 同様に: r は任意のレジスタ、r8/r16/r32/r64 は特定の幅のレジスタ、"imm" は任意の即値
  • "mov r64, imm" -> 64ビットレジスタへの定数移動にマッチ
  • "any r64,r64" -> 2つの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 はデータベース全体を逆アセンブルする以外に選択肢がありません。非常に大きなバイナリでは数分かかる可能性があります。パフォーマンスに関する注意事項を参照してください。

即値 (定数)

関数が指定された即値を少なくとも1回、任意の位置で含む必要があります。 即値とは、命令のバイナリ表現に固定された値です。 即値 0x100 にマッチする命令の例:

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

即値はクリップボードから直接ルールリストに貼り付けることができます。 注: IDA は任意のサイズと任意の位置の即値を広範にマッチングします。4バイトまたは8バイトの特定の幅であることがわかっている場合、バイトパターンの方が高速になる可能性があります(ただし、誤検出が発生する可能性があります)。

バイトパターン

関数が指定されたバイトパターンを少なくとも1回含む必要があります。 パターンは IDA のバイナリ検索と同じ形式であり、ワイルドカードをサポートします。これは高度なコピー機能に最適です。

例:

root@kitploit:~
11 22 33 44 aa bb cc
11 22 33 ?? ?? bb cc -> ?? は任意のバイト

バイトパターンはクリップボードから直接ルールリストに貼り付けることができます。 注: パターンマッチングは非常に高速で、迅速に候補を絞り込むのに適しています。

文字列参照

関数が指定された文字列を少なくとも1回参照する必要があります。 文字列は Python の 'fnmatch' モジュールに従ってマッチングされ、ワイルドカードのようなマッチングをサポートします。 マッチングは大文字と小文字を区別しません。 以下の形式の文字列が考慮されます: [idaapi.STRTYPE_C, idaapi.STRTYPE_C_16] (Config クラスで変更可能)。

例:

  • "TestString" -> 関数が正確な文字列(大文字小文字は無視)を少なくとも1回参照する必要があります
  • "TestStr*" -> 関数が 'TestStr' で始まる文字列(例: TestString, TestStrong)を少なくとも1回参照する必要があります(大文字小文字は無視)

注: 文字列マッチングは高速で、迅速に候補を絞り込むのに適しています。

名前参照

関数が指定された名前/ラベルを少なくとも1回参照する必要があります。 名前/ラベルは Python の 'fnmatch' モジュールに従ってマッチングされ、ワイルドカードのようなマッチングをサポートします。 マッチングは大文字と小文字を区別しません。

例:

  • "memset" -> 関数が名前 "memset" を少なくとも1回参照する必要があります
  • "mem*" -> 関数が "mem" で始まる名前 (memset, memcpy, memcmp) を少なくとも1回参照する必要があります

注: 名前マッチングは非常に高速で、迅速に候補を絞り込むのに最適です。

関数サイズ

関数のサイズが指定された範囲内である必要があります: "min <= functionsize <= max"。 データは "min,max" の形式の文字列として入力されます。 関数のサイズにはすべてのチャンクが含まれます。

注: 関数サイズのマッチングは非常に高速で、迅速に候補を絞り込むのに最適です。

キーボードショートカットと GUI

使いやすさのために、FF は以下のキーボードショートカットで使用できます。

  • Ctrl+Alt+F -> TabWidget (メイン 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 操作

  • タブを右クリック: タブを複製するオプション
  • データ列をダブルクリックしてルールを編集
  • 反転マッチ列をダブルクリックしてルールを反転(否定マッチ)
  • 有効列をダブルクリックしてルールを有効/無効
  • ルールまたは結果の任意のセルをホイールクリックしてクリップボードにコピー
  • バイトパターンと即値はクリップボードから直接ルールテーブルに貼り付け可能
  • タブをダブルクリックして名前を変更
  • ルールリストと結果リストの両方で並べ替えが可能
  • 結果アイテムをダブルクリックして IDA 内で該当箇所にジャンプ
    • 関数名列: 関数の先頭にジャンプ
    • その他の列: 最後にマッチしたルールのマッチ箇所にジャンプ
  • チェックボックス「Profile」: 検索のプロファイリング情報を出力
  • チェックボックス「Debug」: コードルールマッチングの詳細なデバッグ出力をダンプ - コードチェックルールに到達する関数が少ない場合のみ使用してください。そうでない場合、非常に時間がかかる可能性があります。

高度なバイナリコピー

アセンブリのバイナリパターンを検索したいが、ハードコードされたアドレスや値(即値)を除外したり、命令の実際のオペコードのみを検索したいことがよくあります。FindFunc は、逆アセンブリのポップアップメニューに3つのコピーオプションを追加することでこれを容易にします。

すべてのバイトをコピー

すべての命令バイトを16進文字列としてクリップボードにコピーします。Byte-Pattern-Rule(または 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 ??

オペコードのみをコピー

すべての命令バイトを16進文字列としてクリップボードにコピーしますが、実際のオペコードではないバイト(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 を保持します。

注: これは IDA の API を使用した「ベストエフォート」であり、一部のケースでは部分的にしか機能しない可能性があります。 100% 正しいソリューションを実現するには、専用の x86 逆アセンブルライブラリを同梱する必要があります。 同様の結果は Code Pattern Rules でも得られますが、ユーザーの操作と実際の検索の両方で、こちらがより高速な場合があります。

逆アセンブルをコピー

選択した逆アセンブルを、IDA に表示されている通りにクリップボードにコピーします。

パフォーマンス

パフォーマンスに関する簡単な説明:

  1. name, string, funcsize はほとんどの場合ほぼ無料
  2. bytepattern はパターン長が 2 より大きい場合、ほぼ無料
  3. immediate は難しい: idaapi の検索を使用するか、データベース全体を逆アセンブルして自分で検索できます。コードパターンを探す場合、いずれにせよこれを行う必要があるかもしれません。 ただし、コードパターンのスキャンは即値のスキャンよりもはるかに安価です。 すべてのマッチに対する API 検索は比較的高価で、データベース全体の逆アセンブルにかかるコストの約 1/8 です。 したがって、まず安価なルールでマッチを絞り込むと、残りの関数を逆アセンブルして即値を自分で探すことが非常に有益です。特にコードルールが存在する場合はなおさらです。 ただし、安価なオプションがなく、コードパターンルールが存在するためにデータベースの大部分を逆アセンブルする必要がある場合、1つの即値ルールを事前フィルターとして使用することは大きな効果があります。 1つの即値を API 検索するコストは、任意の数のコードパターンルールを検索するコストの約 1/8 に相当します。ただし、これも多くの要因に依存します。
  4. コードパターンは群を抜いて最も高価ですが、1つのパターンをチェックするのと複数のパターンをチェックするのは非常に似ています。

Todo (順不同):

  • jcc 疑似ニーモニック
  • CodeRules での名前付きロケーションの許可 ('call memset')
  • xref in/out ルールの追加
  • 元に戻す/やり直し
  • プログレスバー
  • 中クリックでタブを閉じる
  • タブメニュー: これ以外をすべて閉じる
  • '以降のオペランドをすべて無視' オプション
  • 関数内の API 呼び出しのパラメータに関するルール
  • 親/呼び出し元/子関数の要件に関するルール
  • 関数パラメータに関するルール
  • 正規表現ルール
  • 文字列/名前: 大文字小文字のオプション
  • 該当する場合、即値ルールを自動的にバイトパターンに変換?
  • 設定: 大文字小文字の区別、文字列タイプ、範囲など
  • Hexray ルール?
  • ルールの OR 結合
  • コードの Python 化 ;)
  • 並列化
  • 関数を識別するためのルールの自動生成?
ツールをダウンロード