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

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

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

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

ツールディレクトリ

カテゴリ

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

pe-signgen

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

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

人気

すべて見る →

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

すべてのツールを探索

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

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

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

**出力構成:**```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) │ └─────────────────────────────────────┘

**重要なレイアウトノート(`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

##### ビルドバージョンエントリ (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)

マスクバイトは、各バイト内で **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) │ └─────────────────────────────────────┘

レイアウトの詳細(`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

##### 使用上の注意

* **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 |
ツールをダウンロード