IDA Pro署名ジェネレータープラグインを拡張しました。
IDA_SigMaker32.dLLとIDA_SigMaker64.dLLをIDA pluginsディレクトリにコピーします。
デフォルトのIDAホットキーは「ctrl-alt-s」ですが、key your ida "plugins.cfg"を使用して別のものに設定できます。 「Ctrl-Alt-S」は、コンボがIDAのデフォルトと競合するようになったため、警告メッセージの取得を避け、「Idagui.cfg」を編集し、 "StackTrace" = 0 // "Ctrl-Alt-S" // open stack trace window 。
Ida Proバージョン7.6'ishが必要です。
ホットキーまたはIDA編集/プラグインメニューを介してプラグインを呼び出します。

3つの署名生成操作があります。
関数:一意の関数エントリポイント、オフセットを備えた最小関数署名、またはオプションの構成に応じて全身署名を作成するために使用されます(以下を参照)。
最初に、ターゲット関数内のアドレスを選択します。選択した関数が一意でない場合(エントリポイントまたは最小オプションの場合)、一意の関数の相互参照スキャンの署名が試行されます。
典型的なユースケース:ターゲットメモリの実行時に関数を特定する署名、実行可能可能性のある更新後のIDAの関数を見つけ、署名などで既知のライブラリを見つけるのに役立ちます。
例の署名出力: 
署名の結果は、ソースコードなどに簡単にctrl+v貼り付けるためにWindowsクリップボードに押し込まれます。

出力形式: IDA :IDAおよびその他のツールがサポートしているデフォルトのHEXバイナリ検索形式で、間隔の16進バイトと「??」を使用しています。ワイルドカード。例: C1 6C E8 ?? ?? ?? ?? 8B 50 08コードスタイル:エスケープコード付きヘックスストリングと別のマスクストリングがあり、「x」はキーパーバイトであり、「?」ワイルドカードバイトです。例: "xC1x6CxE8xCCxCCxCCxCCx8Bx50x08", "xxx????xxx"インラインバイト:ワイルドカードを含むバイトのミニマリストCスタイルのアレイ。例: {0xC1,0x6C,0xE8,0xAE,0xAE,0xAE,0xAE,0x8B,0x50,0x08}; 「マスクバイト」編集ボックスを使用して、デフォルトの「インラインバイト」マスクバイトを変更します。デフォルトのマスクバイトは0xAEで、最も使用されていないコードバイトの1つです(以下の「理想的なマスクバイト」を参照)。
「関数」署名生成の基準。エントリポイント:可能な場合は、最小限のバイトサイズの機能エントリポイント署名を生成しようとします。最小限のバイトサイズ:最小限の最小限の生成を試みます。最小限のワイルドカードカウント、バイトサイズ(5つは大きい)命令境界選択された関数本体内の署名された署名されます。フル機能ボディ:ユニークなフル機能本文の署名を生成しようとします。
これら3つのオプションのいずれかについて、関数が一意でない場合、代わりに最小の一意の相互参照署名を見つける試みが行われます。非ユニーク関数の完全または部分関数の署名を作成する場合は、代わりに「アドレス範囲」オプションを使用します。
メッセージレベル:IDAログウィンドウへの内部署名生成メッセージ出力の「冗長」に設定します。
MAX関数スキャン参照:直接の「関数」アクション署名が見つからないときに検索するための関数の相互参照の数を制限します。通常、これは無制限の検索では「0」である必要がありますが、スローダウンを引き起こす非常に多くの参照がある問題の場合は、スキャン速度を上げるために16または100のような合理的な制限に設定できます。
チャンクが複数のアドレス範囲に広がっている関数の比較的まれなケースの場合、ツールは最初のチャンクのみを使用しようとします。ばらばらのチャンクの1つで署名を作成したい場合は、「ATアドレス」メソッドを使用してみてください。他のすべてが失敗した場合は、「アドレス範囲から」SIG(一意性を手動で検索する可能性がある)を試してください。
最大関数エントリポイント署名バイト:「関数」オプションを使用し、「エントリポイント」基準が設定されている場合、オプションで最大エントリポイント署名バイトサイズを制限します。デフォルトは「0」です。この制限を超えると、代わりに相互参照署名が探しられます。
「16」や「32」のような実用的な制限に設定されています。通常は、潜在的に非常に大きなエントリポイント署名と潜在的に小さなXREF署名が優先されます。
Sigmakerex( "ex")全体的に、より良い命令分析を使用して、より小さくてより狭い関数の署名を生成します。例:sigmaker( "sm")ワイルドカードの命令sub esp, 90h ( "81 EC ?? ?? ?? ?? 81 EC 90 00 00 00オペランドバイト。
EXは、規範的関数本体シグネチャーユースケースに焦点を合わせています。 SMの場合、制御可能なオプションは1つだけです。関数内のアドレスで一意の署名を作成しようとします。そこにある場合は、代わりにのみ一意の相互参照SIGを探します。たとえば、特定された典型的なユースケースは関数のエントリポイントを見つけることであるため、「エントリポイント」基準オプションが構成されている場合、最小のエントリポイント署名が生成されます。 「最小限のバイトサイズ」オプションが選択された場合、関数ボディ全体で最小および最小ワイルドカードカウントユニークな署名(最低5バイト)を探します。
SMは、オプションダイアログで、バイト対ワイルドカードカウントなどをより多くの出力基準制御しています。例は、あなたが両方の最高のものを望んでいると仮定します(最小ワイルドカードと最小のバイトサイズ)。
EXは、SMがよりシンプルで乱雑ではないUIを好むという「変換」と個々の「検索」機能を省略します。
検索では、EXは選択した出力形式の署名に加えて常にIDA形式の出力を発するため、IDA SIG文字列を使用してIDAバイナリ検索「HEX」オプションを使用します。
IDBをRAMにクローン化し、AVX2最適化されたパターンスキャナーを使用してスキャンのためにavx2最適化されたパターンスキャナーと依存するため、より広範な検索を行うと、より速くなります。
パターンを動的に見つけるための私自身のプロジェクトでは、「インラインバイト」(より良い名前がないため)形式を好みます。これは最もシンプルで最もコンパクトであり、ASCII 16進ストリングからのランタイム変換は必要ありません。私は多くのプロジェクトにこの形式を使用しましたが、署名の衝突や冗長な一致の問題はまだ遭遇していません。
潜在的な冗長性の問題を最小限に抑えるために、ワイルドカード/マスクバイトに最も使用されていないコードバイト値の1つを使用することは賢明です。理想的な候補を見つけるために、3つの大きな32ビットおよび64ビットコードセグメントの3つからコードバイト周波数を収集し、結果を集計してソートしました。 「ida_get_byte_frequency.py」idaスクリプトが使用され、バイト周波数辞書の収集とjson dbに保存されます。 「byte_frequency_tabulate.py」スクリプトは、これらの保存されたjson dbsのセットを昇順で並べ替えてソートします。 32ビットのバイト周波数は64ビットの周波数と同じではなく、独立して集計されていることは明らかです。 「32bit.txt」および「64bit.txt」を参照してください。 2つの視覚相関では、0xA2は実際には最も一般的な分母であり、その後0xAEが続きます。 0xaeは、視覚的に16進数で選択できるため、デフォルトマスクバイトとして0xa2を超えて選択されました。
Windows 10でVisual Studio 2019を使用して構築され、唯一の依存関係は公式のIDA Pro C/C ++ SDKです。プロジェクトファイルでセットアップすると、環境変数_IDADIRを探します。そこからは、IDA SDKがある「Idasdk/include」と「Idasdk/lib」フォルダーを見つけることが予想されます。 Idaはそれ自体を探しており、複数のインストールされたIDAバージョンを使用しようとすると競合を引き起こす可能性があるため、 IDADIR使用していません。
"byte_frequency_tabulate.py" scriptを実行するためにpython 3.7'ish以下。
Gamedeception.netの日から現在のC/C ++およびPython反復著者までの元のSigmaker Toolの作成者に感謝します:P4tr!CK、Bobbysing、Xero | Hawk、Ajkhoury、およびZoomgod et al。彼のSIMDプログラミングリソースをしてくれたWojciech Mulaに感謝します。
MITの下でリリースされた©2022 Kevin Weatherman