Skip to content
KitploitKITPLOIT
ツールブログ
提出
ツールブログ
提出

ハッキング、侵入テスト、サイバーセキュリティツールをあなたのセキュリティアーセナルに!

Kitploitはハッキング、サイバーセキュリティ、ペネトレーションテストのツールディレクトリです。最新のプロジェクトアップデートを見つけて、脆弱性の発見、システム分析、テストの自動化、セキュリティの強化を行いましょう。

··フィード·お問い合わせ·プライバシー·© 2026 Kitploit

ツールディレクトリ

カテゴリ

すべてのカテゴリを見る
Loading categories
pe-signgen — Winbindex を使用して、すべての Windows ビルドの任意のシステム関数に対するユニバーサル署名生成 | Kitploit
ツール/GitHubGitHub/forentfraps/pe-signgen
静的分析脆弱性分析リバースエンジニアリングフォレンジックマルウェア分析バイナリ解析
GitHubforentfraps/pe-signgen

pe-signgen

Winbindex を使用して、すべての Windows ビルドの任意のシステム関数に対するユニバーサル署名生成

リポジトリを見る
2039ヶ月前未レビュー

人気

すべて見る →

コミュニティで最も使われているツールを見つけましょう。

すべてのツールを探索

ツールコレクションを閲覧

すべてのツールを見る →
ウェブサイト
共有

pe-signgen

クロスバージョンバイナリシグネチャとWindows PE関数のRVAオフセット


概要

pe-signgenは、リバースエンジニアやセキュリティ研究者向けのツールで、以下のものを自動生成します。

  • 非公開関数および公開関数用のバイナリシグネチャ(ワイルドカード付きバイトパターン)
  • バイナリ内で関数を直接特定するためのRVAとファイルオフセット
  • 多くのWindowsバージョンで動作するクロスビルドシグネチャ
  • 様々なユースケースに最適化された複数の出力フォーマット
  • x64、ARM64、WoW64アーキテクチャのサポート

中核的なアイデアは、Windows 10/11ビルド全体で非公開関数にアクセスするための体系的で堅牢な方法を提供することです。これは以下を活用します。

  • Winbindex(Windowsビルドメタデータ用)
  • Microsoftの公開シンボルサーバー(PDB用)
  • 再現可能でオフライン対応のワークフローのためのローカルキャッシュ

⚠️ Windowsバージョンサポート pe-signgenはWindows 10およびWindows 11のみをサポートします。 これは意図的な設計上の選択です。Winbindexは古いバージョンの完全なデータを提供していません。


ユースケース

  • 非公開Windows内部関数 LdrpInitializeTls、RtlpInsertInvertedFunctionTableEntryなどの関数のシグネチャを生成

  • ゲームハッキング/アンチチート研究 ゲームアップデート後も安定したシグネチャを生成

  • セキュリティ研究 Windowsビルド全体でセキュリティクリティカルなルーチンを特定

  • 自動化 内部APIセット全体のスクリプト可能なシグネチャおよびオフセット生成


  • 出力フォーマット

    pe-signgenは、さまざまなユースケースに応じて3つの異なる出力フォーマットを提供します。

    1. JSONフォーマット

    自動化、スクリプト、他のツールとの統合用の構造化データ。```bash pe-signgen --signature ntdll!NtCreateFile -o ntcreatefile.json --output-format json

    root@kitploit:~
    **出力構成:**```json
    {
      "dll_name": "ntdll",
      "function_name": "NtCreateFile",
      "architecture": "x64",
      "generated": "2024-12-11T15:30:00.123456",
      "total_builds": 1247,
      "unique_signatures": 3,
      "signature_groups": [
        {
          "matched_symbol": "NtCreateFile",
          "signature": "4C 8B DC 49 89 5B 08 49 89 6B 10 49 89 73 18 ...",
          "length": 48,
          "build_count": 845,
          "versions": [
            { "major": 10240, "minor": 16384, "build": "10240.16384" },
            { "major": 10586, "minor": 0, "build": "10586.0" }
          ]
        }
      ]
    }
    

    注意事項:

    • major と minor はビルド文字列を最初の . で分割して導出されます。 例: "10240.16384" → major = 10240, minor = 16384。
    • build は内部的に使用される元のビルド文字列キーです。

    2. バイナリ形式 (WSIG/WOFF)

    組み込みシステムや低オーバーヘッドスキャンに最適化された、コンパクトで実行時対応のバイナリ形式。

    これらは write_wsig() および write_woff() で実装されたディスク上のレイアウトに対応しています。


    WSIG形式 (Windowsシグネチャ)

    マジック: WSO\0 (0x57 0x53 0x4F 0x00) 現在のバージョン: 1 目的: ワイルドカードマスクと関連するWindowsビルドバージョンを持つバイナリシグネチャを保存する

    ファイル構造 (概念)```

    ┌─────────────────────────────────────┐ │ Header (36 bytes) │ ├─────────────────────────────────────┤ │ DLL Name (variable) │ ├─────────────────────────────────────┤ │ Function Name (variable) │ ├─────────────────────────────────────┤ │ Signature / Mask / Build blobs │ ← Arbitrary order, see notes ├─────────────────────────────────────┤ ← Aligned to 4 bytes │ Groups Table (24 × N bytes) │ └─────────────────────────────────────┘

    root@kitploit:~
    **重要なレイアウトノート(`write_wsig` と一致)**
    
    * ヘッダーの後、DLL名と関数名はUTF-8バイトで書き込まれます。
    * シグネチャグループごとに、パターンバイトとマスクバイトが書き込まれ、その後にそのグループのビルド配列が続きます。
    * これらのグループごとの領域は、タイプ別にグローバルにグループ化されて**いません**。パターン、マスク、ビルド配列がインターリーブされる可能性があります。
    * ビルダーは、各ビルド配列の前とグループテーブルの前に**4バイト**にアライメントします。これによりパディングが発生する可能性があります。
    * 利用者は、ヘッダーとグループエントリ内のオフセットに**常に**従わなければなりません。概念図に基づいて物理的な連続性を想定しては**いけません**。
    
    ##### ヘッダーレイアウト(36バイト)```c
    // Packed as: "<4sIIIIIIII" (little-endian)
    
    typedef struct {
        char     magic[4];   // "WSO\0" (WSIG_MAGIC)
        uint32_t version;    // FORMAT_VERSION (currently 1)
        uint32_t arch;       // Architecture code (1=x64, 2=ARM64, 3=WoW64)
        uint32_t dll_off;    // Offset to DLL name string
        uint32_t dll_len;    // Length of DLL name in bytes
        uint32_t func_off;   // Offset to function name string
        uint32_t func_len;   // Length of function name in bytes
        uint32_t group_count;// Number of signature groups
        uint32_t groups_off; // Offset to groups table
    } wsig_header_t; // 36 bytes
    
    グループエントリ (24 bytes)

    各シグネチャグループは、1つ以上のWindowsビルドに適用される一意のパターンを表します。```c // Packed as: "<IIIIII" (little-endian)

    typedef struct { uint32_t sig_off; // Offset to signature pattern bytes uint32_t sig_len; // Length of signature pattern (in bytes) uint32_t mask_off; // Offset to wildcard mask bytes uint32_t mask_len; // Length of wildcard mask (≈ ceil(sig_len/8)) uint32_t builds_off; // Offset to build version array uint32_t build_cnt; // Number of builds using this signature } wsig_group_t; // 24 bytes

    root@kitploit:~
    ##### ビルドバージョンエントリ (8バイト)
    
    各ビルドエントリは、この署名を使用する特定のWindowsバージョンを識別します。```c
    typedef struct {
        uint32_t major; // e.g. 19041
        uint32_t minor; // e.g. 1234
    } wsig_build_t; // 8 bytes
    

    major と minor はビルド文字列を分割して得られます ("A.B" → A, B)。元のビルド文字列はバイナリ形式には保存されません。もし必要であれば、外部に保持してください(JSON 出力には含まれています)。

    ワイルドカードマスク形式

    マスクは ビットマスク であり、各ビットが署名パターンの1バイトに対応します。

    • ビット = 1: バイトは完全に一致する必要があります(固定バイト)
    • ビット = 0: バイトはワイルドカード化されます(マッチング時にはこのバイトを無視します)

    例:``` Signature: 4C 8B DC 49 89 ?? 08 49 Mask bits: 1 1 1 1 1 0 1 1 (MSB first within each byte) Mask byte: 0xBF (binary: 10111111)

    root@kitploit:~
    マスクバイトは、各バイト内で **little-endian bit order** で保存および解釈されます(Cヘルパーや `parse_signature` で使用されているのとまったく同じです)。```c
    uint8_t bit = (mask_bytes[byte_index >> 3] >> (byte_index & 7)) & 1u;
    
    String Storage
    • DLLと関数名は、UTF‑8として、ヌル終端なしで保存されます。
    • 長さを判断するには*_lenを使用し、それを超えて読み取らないでください。
    • 文字列自体にアライメント要件はありません。
    • 追加のデータ領域(ビルド配列とグループテーブル)は4バイト境界にアライメントされています。パディングは不透明として扱ってください。

    WOFF Format (Windows Offset)

    マジック: WOF\0 (0x57 0x4F 0x46 0x00) 現在のバージョン: 1 目的: Windowsビルド全体の関数の直接RVAとファイルオフセットを保存します

    File Structure```

    ┌─────────────────────────────────────┐ │ Header (36 bytes) │ ├─────────────────────────────────────┤ │ DLL Name (variable) │ ├─────────────────────────────────────┤ │ Function Name (variable) │ ├─────────────────────────────────────┤ │ Matched Symbol Names (variable) │ ← One UTF‑8 string per entry ├─────────────────────────────────────┤ ← Aligned to 4 bytes │ Entries Table (32 × N bytes) │ └─────────────────────────────────────┘

    root@kitploit:~
    レイアウトの詳細(`write_woff` と一致):
    
    * ヘッダープレースホルダーの後、DLLと関数名がUTF‑8バイトとして書き込まれます。
    * 各ビルドに対して、一致したシンボル名がUTF‑8文字列(終端なし)として書き込まれます。これらは単純な文字列プールを形成します。
    * 次にライターは4バイトにアラインし、固定サイズのエントリテーブルを書き込みます。
    * 各エントリには、この文字列プールを指すオフセット(`matched_off`、`matched_len`)が含まれます。
    
    ##### ヘッダーレイアウト(36バイト)```c
    // Packed as: "<4sIIIIIIII" (little-endian)
    
    typedef struct {
        char     magic[4];   // "WOF\0" (WOFF_MAGIC)
        uint32_t version;    // FORMAT_VERSION (currently 1)
        uint32_t arch;       // Architecture code (1=x64, 2=ARM64, 3=WoW64)
        uint32_t dll_off;    // Offset to DLL name string
        uint32_t dll_len;    // Length of DLL name in bytes
        uint32_t func_off;   // Offset to function name string
        uint32_t func_len;   // Length of function name in bytes
        uint32_t entry_cnt;  // Number of offset entries
        uint32_t entries_off;// Offset to entries table
    } woff_header_t; // 36 bytes
    
    Offset Entry (32 bytes)

    各エントリは、Windowsビルドをそのビルド内の関数の位置にマッピングします。```c // Packed as: "<IIQQII" (little-endian)

    typedef struct { uint32_t major; // Windows major version (e.g., 19041) uint32_t minor; // Windows minor version (e.g., 1234) uint64_t rva; // Relative Virtual Address in the DLL uint64_t file_offset; // Raw file offset in the DLL on disk uint32_t matched_off; // Offset to matched symbol name string uint32_t matched_len; // Length of matched symbol name } woff_entry_t; // 32 bytes

    root@kitploit:~
    ##### 使用上の注意
    
    * **RVA** は、DLLが優先ベースアドレスにロードされたときのメモリオフセットです。
    * **File offset** は、ディスク上のPEファイル内の未加工の位置です。
    * **Matched symbol** は、要求された関数と異なる場合があります(例:フォワードされたエクスポート)。
      文字列は文字列プールに一度格納されます。`matched_off`/`matched_len` がそれを参照します。
    * エントリはビルドバージョン(`major`、次に `minor`)で**ソート**され、効率的な検索を実現します。
    
    ---
    
    #### アーキテクチャコード
    
    両方のバイナリ形式は、同じアーキテクチャエンコーディング(`ARCH_CODE_MAP`経由)を使用します。
    
    | コード | アーキテクチャ | 説明                           |
    | ------ | -------------- | ------------------------------ |
    | 1      | x64            | 64ビット AMD64/Intel64         |
    | 2      | ARM64          | 64ビット ARM (AArch64)         |
    | 3      | WoW64          | 64ビットWindows上の32ビットx86 |
    
    不明なアーキテクチャ文字列は内部的に `1` (x64) にデフォルト設定されます。CLIはサポートされているセットに値を制限します。
    
    ---
    
    ### 3. **C ヘッダーフォーマット**
    
    コンパイル可能な型安全な構造体とデータ配列を持つ C ヘッダー。
    
    `pe-signgen` は2種類の C ヘッダーを出力できます。
    
    * **WSIG ヘッダー** – シグネチャとマスクデータ用(`write_wsig_header` から)。
    * **WOFF ヘッダー** – 直接的な RVA/ファイルオフセットテーブル用(`write_woff_header` から)。
    
    `--output-format cheader` オプションで C ヘッダーを選択し、`--offsets` と組み合わせることで WSIG と WOFF のバリアントを切り替えます。
    
    #### WSIG C ヘッダー```bash
    pe-signgen --signature ntdll!RtlpInitializeThreadActivationContextStack \
      -o rtlp_init_actx.h --output-format cheader
    

    生成されたヘッダ構造(簡略化、write_wsig_header に一致):```c /* Auto-generated WSIG header for ntdll ! RtlpInitializeThreadActivationContextStack ! x64. */ #ifndef WSIG_NTDLL_RTLPINITIALIZETHREADACTIVATIONCONTEXTSTACK_X64_H #define WSIG_NTDLL_RTLPINITIALIZETHREADACTIVATIONCONTEXTSTACK_X64_H

    #include <stdint.h> #include <stddef.h>

    #define WSIG_NTDLL_RTLPINITIALIZETHREADACTIVATIONCONTEXTSTACK_X64_DLL_NAME "ntdll" #define WSIG_NTDLL_RTLPINITIALIZETHREADACTIVATIONCONTEXTSTACK_X64_FUNCTION_NAME "RtlpInitializeThreadActivationContextStack" #define WSIG_NTDLL_RTLPINITIALIZETHREADACTIVATIONCONTEXTSTACK_X64_ARCH "x64"

    /* Per-version build identifier. */ typedef struct { uint32_t major; uint32_t minor; } WSIG_NTDLL_RTLPINITIALIZETHREADACTIVATIONCONTEXTSTACK_X64_version_t;

    /* Signature group entry. */ typedef struct { const uint8_t *pattern; const uint8_t *mask; uint32_t length; uint32_t build_count; const WSIG_NTDLL_RTLPINITIALIZETHREADACTIVATIONCONTEXTSTACK_X64_version_t *versions; } WSIG_NTDLL_RTLPINITIALIZETHREADACTIVATIONCONTEXTSTACK_X64_group_t;

    /* One pattern/mask/versions triple per group. / static const uint8_t WSIG_NTDLL_RTLPINITIALIZETHREADACTIVATIONCONTEXTSTACK_X64_group0_pattern[] = { / ... / }; static const uint8_t WSIG_NTDLL_RTLPINITIALIZETHREADACTIVATIONCONTEXTSTACK_X64_group0_mask[] = { / ... / }; static const WSIG_NTDLL_RTLPINITIALIZETHREADACTIVATIONCONTEXTSTACK_X64_version_t WSIG_NTDLL_RTLPINITIALIZETHREADACTIVATIONCONTEXTSTACK_X64_group0_versions[] = { { 10240u, 16384u }, / 10240.16384 / / ... */ };

    static const WSIG_NTDLL_RTLPINITIALIZETHREADACTIVATIONCONTEXTSTACK_X64_group_t WSIG_NTDLL_RTLPINITIALIZETHREADACTIVATIONCONTEXTSTACK_X64_GROUPS[] = { { WSIG_NTDLL_RTLPINITIALIZETHREADACTIVATIONCONTEXTSTACK_X64_group0_pattern, WSIG_NTDLL_RTLPINITIALIZETHREADACTIVATIONCONTEXTSTACK_X64_group0_mask, (uint32_t)(sizeof(WSIG_NTDLL_RTLPINITIALIZETHREADACTIVATIONCONTEXTSTACK_X64_group0_pattern) / sizeof(WSIG_NTDLL_RTLPINITIALIZETHREADACTIVATIONCONTEXTSTACK_X64_group0_pattern[0])), (uint32_t)(sizeof(WSIG_NTDLL_RTLPINITIALIZETHREADACTIVATIONCONTEXTSTACK_X64_group0_versions) / sizeof(WSIG_NTDLL_RTLPINITIALIZETHREADACTIVATIONCONTEXTSTACK_X64_group0_versions[0])), WSIG_NTDLL_RTLPINITIALIZETHREADACTIVATIONCONTEXTSTACK_X64_group0_versions }, /* group 0 (RtlpInitializeThreadActivationContextStack) / / ... */ };

    static const size_t WSIG_NTDLL_RTLPINITIALIZETHREADACTIVATIONCONTEXTSTACK_X64_GROUP_COUNT = sizeof(WSIG_NTDLL_RTLPINITIALIZETHREADACTIVATIONCONTEXTSTACK_X64_GROUPS) / sizeof(WSIG_NTDLL_RTLPINITIALIZETHREADACTIVATIONCONTEXTSTACK_X64_GROUPS[0]);

    #endif /* WSIG_NTDLL_RTLPINITIALIZETHREADACTIVATIONCONTEXTSTACK_X64_H */

    root@kitploit:~
    **統合例(生成された型に合わせて修正済み):**```c
    #include "rtlp_init_actx.h"
    
    static inline int match_byte(uint8_t want, uint8_t got,
                                 const uint8_t *mbits, uint32_t i) {
        uint8_t bit = (mbits[i >> 3] >> (i & 7)) & 1u;
        return bit ? (want == got) : 1;
    }
    
    static const uint8_t *
    find_signature(const uint8_t *base, size_t size,
                   const uint8_t *pattern,
                   const uint8_t *mbits,
                   uint32_t sig_len) {
        if (!base || !pattern || !mbits || sig_len == 0)
            return NULL;
        if (size < sig_len)
            return NULL;
    
        // Find first non-wildcard byte as anchor
        uint32_t anchor = sig_len;
        for (uint32_t i = 0; i < sig_len; ++i) {
            if ((mbits[i >> 3] >> (i & 7)) & 1u) {
                anchor = i;
                break;
            }
        }
        if (anchor == sig_len)
            return base; // all wildcards
    
        const uint8_t anchor_val = pattern[anchor];
        const size_t last_pos = size - (size_t)sig_len;
    
        for (size_t pos = 0; pos <= last_pos; ++pos) {
            if (base[pos + anchor] != anchor_val)
                continue;
    
            uint32_t i = 0;
            for (; i < sig_len; ++i) {
                if (!match_byte(pattern[i], base[pos + i], mbits, i))
                    break;
            }
            if (i == sig_len)
                return base + pos;
        }
        return NULL;
    }
    
    static void
    fetch_signature(uint32_t major, uint32_t minor,
                    const WSIG_NTDLL_RTLPINITIALIZETHREADACTIVATIONCONTEXTSTACK_X64_group_t *groups,
                    size_t group_len,
                    const uint8_t **signature_dest,
                    const uint8_t **mask_dest,
                    uint32_t *signature_len_dest) {
        *signature_dest = NULL;
        *mask_dest = NULL;
        *signature_len_dest = 0;
    
        const WSIG_NTDLL_RTLPINITIALIZETHREADACTIVATIONCONTEXTSTACK_X64_group_t *closest = NULL;
        uint32_t best_distance = 0xFFFFFFFFu;
    
        for (size_t gi = 0; gi < group_len; ++gi) {
            const WSIG_NTDLL_RTLPINITIALIZETHREADACTIVATIONCONTEXTSTACK_X64_group_t *g = &groups[gi];
            for (uint32_t vi = 0; vi < g->build_count; ++vi) {
                uint32_t m = g->versions[vi].major;
                uint32_t n = g->versions[vi].minor;
    
                uint32_t distance = (m > major ? m - major : major - m) * 10000u +
                                    (n > minor ? n - minor : minor - n);
    
                if (distance < best_distance) {
                    best_distance = distance;
                    closest = g;
                }
    
                if (m == major && n == minor) {
                    *signature_dest = g->pattern;
                    *mask_dest = g->mask;
                    *signature_len_dest = g->length;
                    return;
                }
            }
        }
    
        if (closest) {
            *signature_dest = closest->pattern;
            *mask_dest = closest->mask;
            *signature_len_dest = closest->length;
        }
    }
    

    これを独自のローダー固有のコードに組み込むことができます(例:GetModuleHandleA を使用する、PEセクションをウォークするなど)。ヘッダーは意図的にデータのみを提供します。ヘルパー関数は利用者の責任です。

    WOFF C ヘッダー

    オフセットのみのユースケースの場合、write_woff_header はソートされた (major, minor, rva, file_offset) エントリのテーブルを記述する小さなヘッダーを出力します。

    レイアウト(write_woff_header に一致):```c /* Auto-generated WOFF header for ntdll ! RtlpInitializeThreadActivationContextStack ! x64. */ #ifndef WOFF_NTDLL_RTLPINITIALIZETHREADACTIVATIONCONTEXTSTACK_X64_H #define WOFF_NTDLL_RTLPINITIALIZETHREADACTIVATIONCONTEXTSTACK_X64_H

    #include <stdint.h> #include <stddef.h>

    #define WOFF_NTDLL_RTLPINITIALIZETHREADACTIVATIONCONTEXTSTACK_X64_DLL_NAME "ntdll" #define WOFF_NTDLL_RTLPINITIALIZETHREADACTIVATIONCONTEXTSTACK_X64_FUNCTION_NAME "RtlpInitializeThreadActivationContextStack" #define WOFF_NTDLL_RTLPINITIALIZETHREADACTIVATIONCONTEXTSTACK_X64_ARCH "x64"

    /* Per-build offset entry. */ typedef struct { uint32_t major; uint32_t minor; uint64_t rva; uint64_t file_offset; } WOFF_NTDLL_RTLPINITIALIZETHREADACTIVATIONCONTEXTSTACK_X64_entry_t;

    static const WOFF_NTDLL_RTLPINITIALIZETHREADACTIVATIONCONTEXTSTACK_X64_entry_t WOFF_NTDLL_RTLPINITIALIZETHREADACTIVATIONCONTEXTSTACK_X64_ENTRIES[] = { { 10240u, 16384u, 0x5B195ULL, 0x5A595ULL }, /* 10240.16384 (RtlpInitializeThreadActivationContextStack) / / ... (sorted by major, then minor) ... */ };

    static const size_t WOFF_NTDLL_RTLPINITIALIZETHREADACTIVATIONCONTEXTSTACK_X64_ENTRY_COUNT = sizeof(WOFF_NTDLL_RTLPINITIALIZETHREADACTIVATIONCONTEXTSTACK_X64_ENTRIES) / sizeof(WOFF_NTDLL_RTLPINITIALIZETHREADACTIVATIONCONTEXTSTACK_X64_ENTRIES[0]);

    #endif /* WOFF_NTDLL_RTLPINITIALIZETHREADACTIVATIONCONTEXTSTACK_X64_H */

    root@kitploit:~
    これは、オフセット自体を信頼してパターンマッチングが不要な場合に便利です。
    
    ---
    
    ## インストール
    
    ### 前提条件
    
    * Python 3.8+
    * Git
    * インターネット接続(初回実行時)
    * フルキャッシュ用に約10GBのディスク容量
    
    ### Pipからインストール```bash
    pip install pe-signgen
    

    ソースからインストール```bash

    git clone https://github.com/forentfraps/pe-signgen.git cd pe-signgen pip install -r requirements.txt pip install -e .

    root@kitploit:~
    ---
    
    ## クイックスタート
    
    ### 署名の生成```bash
    pe-signgen --signature ntdll!LdrLoadDll
    

    オフセットを生成```bash

    pe-signgen --signature kernel32!CreateFileW --offsets

    root@kitploit:~
    ### JSONとして保存```bash
    pe-signgen --signature ntdll!NtCreateFile -o out.json --output-format json
    

    コマンドラインオプション

    基本構文```bash

    pe-signgen --signature DLL!FUNCTION [OPTIONS]

    root@kitploit:~
    ### アーキテクチャ```bash
    --arch x64   # default
    --arch arm64
    --arch wow64
    

    バージョンフィルタリング```bash

    --os-version win10 # Only Windows 10 --os-version win11 # Only Windows 11 --min-version 10.0 # Minimum version --max-version 11.0 # Maximum version

    root@kitploit:~
    ### 署名長の制御```bash
    --min-length 32          # Minimum signature length
    --max-length 64          # Maximum signature length
    

    出力オプション```bash

    -o, --output PATH # Output file path --output-format FORMAT # json | binary | cheader --offsets # Generate offsets instead of signatures

    root@kitploit:~
    ### パフォーマンス```bash
    --workers 16             # Parallel workers (default: CPU count)
    --no-cache               # Disable caching
    --no-git-update          # Skip Winbindex updates
    

    詳細度```bash

    --verbose # Detailed output --quiet # Minimal output --no-progress # Disable progress bars

    root@kitploit:~
    ## キャッシュ
    
    ### キャッシュレイアウト```text
    ~/.cache/pe-signgen/
    │
    ├── dlls/           # Downloaded DLLs
    ├── pdbs/           # Downloaded PDBs
    ├── signatures/     # Generated signatures
    └── winbindex_data/ # Winbindex metadata
    

    キャッシュ制御```bash

    Disable cache for fresh generation

    pe-signgen --signature ntdll!NtCreateFile --no-cache

    Clear cache

    rm -rf ~/.cache/pe-signgen

    Custom cache location

    export PE_SIGNGEN_CACHE=/custom/path pe-signgen --signature ntdll!NtCreateFile

    root@kitploit:~
    ---
    
    ## パフォーマンス
    
    **性能例(12コアCPU、100 Mbps):**
    
    | 操作 | 時間 |
    | ---------------- | ----------- |
    | 初回実行(キャッシュなし) | 5~10分 |
    | キャッシュあり実行 | 1秒未満 |
    | ビルドごとの解析 | 0.1~0.5秒 |
    | フル実行(1000ビルド、8ワーカー) | 2~4分 |
    
    **リソース要件:**
    
    * **ディスク:** フルDLL/PDBキャッシュで約10GB
    * **メモリ:** ピーク使用量約500MB
    * **ネットワーク:** 初回実行で数GB
    
    ---
    
    ## 既知の制限事項
    
    * **Windowsバージョンの範囲:** Windows **10および11**のみ(Winbindexの制限)
    * **ビルドの可用性:** すべてのWin10/11ビルドがWinbindexに存在するわけではありません
    
    ---
    
    ## 開発```bash
    git clone https://github.com/forentfraps/pe-signgen.git
    cd pe-signgen
    pip install -e ".[dev]"
    
    # Code formatting
    black pe_signgen/
    
    # Type checking
    mypy pe_signgen/
    

    ライセンス

    MITライセンス – LICENSE を参照してください。


    謝辞

    • Winbindex – Windowsビルドメタデータ(提供: @m417z)
    • pefile – PE解析ライブラリ
    • winpdb-rs – PDB解析のPythonバインディング

    内部Windows API向けの堅牢で自動化されたシグネチャ生成の必要性から着想を得ました。


    コントリビューション

    コントリビューションを歓迎します!以下の手順に従ってください:

    1. リポジトリをフォーク
    2. フィーチャーブランチを作成
    3. 新しい機能のテストを追加
    4. プルリクエストを送信

    サポート

    • イシュー: GitHub Issues
    • ディスカッション: GitHub Discussions
    ツールをダウンロード