Skip to content
KitploitKITPLOIT
أدواتالمدونة
إرسال
أدواتالمدونة
إرسال

أدوات الاختراق واختبار الاختراق والأمن السيبراني لترسانتك الأمنية!

Kitploit هو دليل لأدوات الاختراق والأمن السيبراني واختبار الاختراق. اكتشف آخر تحديثات المشاريع للعثور على الثغرات وتحليل الأنظمة وأتمتة الاختبارات وتعزيز أمنك.

··الخلاصات·اتصال·الخصوصية·© 2026 Kitploit

دليل الأدوات

الفئات

عرض جميع الفئات
Loading categories
pe-signgen — توليد تواقيع عالمية لأي دالة نظام من جميع إصدارات ويندوز باستخدام Winbindex | Kitploit
أدوات/GitHubGitHub/forentfraps/pe-signgen
التحليل الثابتتحليل الثغرات الأمنيةالهندسة العكسيةالتحقيق الجنائي الرقميتحليل البرمجيات الخبيثةتحليل الملفات الثنائية
GitHubforentfraps/pe-signgen

pe-signgen

توليد تواقيع عالمية لأي دالة نظام من جميع إصدارات ويندوز باستخدام Winbindex

عرض المستودع
20منذ 8 أشهرلم تتم المراجعة بعد

الأكثر شعبية

عرض الكل →

اكتشف الأدوات الأكثر استخدامًا من قبل مجتمعنا.

استكشف جميع الأدوات

تصفح مجموعتنا من الأدوات

عرض جميع الأدوات →
مشاركة
الموقع الإلكتروني

pe-signgen

التوقيعات الثنائية عبر الإصدارات وإزاحات RVA لوظائف PE في Windows


نظرة عامة

pe-signgen هي أداة لمهندسي الهندسة العكسية وباحثي الأمن، تقوم تلقائيًا بتوليد:

  • التوقيعات الثنائية (أنماط بايت مع بطاقات بدل) للوظائف غير المُصدرة والمُصدرة
  • إزاحات RVA وإزاحات الملف لتحديد موقع الوظائف مباشرة في الثنائيات
  • توقيعات عبر الإصدارات تعمل عبر العديد من إصدارات Windows
  • صيغ إخراج متعددة محسّنة لحالات استخدام مختلفة
  • دعم لمعماريات x64 و ARM64 و WoW64

الفكرة الأساسية هي توفير طريقة منهجية وقوية للوصول إلى الوظائف غير المُصدرة عبر إصدارات Windows 10/11. تعتمد الأداة على:

  • Winbindex لبيانات تعريف إصدارات Windows
  • خوادم الرموز العامة من Microsoft للحصول على PDBs
  • تخزين مؤقت محلي لسير عمل قابل للتكرار وملائم للعمل دون اتصال

⚠️ دعم إصدارات Windows pe-signgen يدعم Windows 10 و Windows 11 فقط. هذا اختيار تصميم متعمد: لا يوفر Winbindex بيانات كاملة للإصدارات الأقدم.


حالات الاستخدام

  • دوال Windows الداخلية غير المُصدرة توليد توقيعات لوظائف مثل LdrpInitializeTls و RtlpInsertInvertedFunctionTableEntry وغيرها.

  • أبحاث اختراق الألعاب / مكافحة الغش توليد توقيعات مستقرة تصمد أمام تحديثات الألعاب

  • البحث الأمني تحديد موقع الإجراءات الحساسة أمنيًا عبر إصدارات Windows

  • الأتمتة توليد توقيعات وإزاحات قابلة للبرمجة لمجموعات كاملة من واجهات API الداخلية


صيغ الإخراج

توفر pe-signgen ثلاث صيغ إخراج متميزة لحالات استخدام مختلفة:

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
Group Entry (24 bytes)

تمثل كل مجموعة توقيع نمطًا فريدًا ينطبق على إصدار واحد أو أكثر من إصدارات 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 بايت)

يحدد كل مدخل بناء إصدارًا محددًا من ويندوز يستخدم هذا التوقيع.```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).

تنسيق قناع البدل

القناع هو قناع بت حيث يتوافق كل بت مع بايت في نمط التوقيع:

  • Bit = 1: يجب أن يتطابق البايت تمامًا (بايت ثابت)
  • Bit = 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:~
يتم تخزين و تفسير بايتات القناع (Mask bytes) بترتيب البتات **little-endian** داخل كل بايت (تمامًا كما هو مستخدم في المساعدات C و `parse_signature`):```c
uint8_t bit = (mask_bytes[byte_index >> 3] >> (byte_index & 7)) & 1u;
تخزين السلاسل النصية
  • أسماء DLL والوظائف تُخزَّن بصيغة UTF‑8، بدون منتهيات فارغة.
  • استخدم *_len لتحديد الطول؛ لا تقرأ بعد ذلك.
  • لا توجد متطلبات محاذاة للسلاسل النصية نفسها.
  • مناطق البيانات الإضافية (مصفوفات البناء وجدول المجموعات) محاذية لحدود 4 بايت؛ تعامل مع أي حشو على أنه معتم.

تنسيق WOFF (Windows Offset)

العلامة السحرية: WOF\0 (0x57 0x4F 0x46 0x00) الإصدار الحالي: 1 الغرض: تخزين عناوين RVA المباشرة وإزاحات الملفات للوظائف عبر إصدارات Windows المختلفة

هيكل الملف```

┌─────────────────────────────────────┐ │ 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)

كل إدخال يربط إصدار ويندوز بموقع الدالة في ذلك الإصدار.```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 في قاعدته المفضلة.
* **إزاحة الملف** هو الموضع الخام في ملف PE على القرص.
* **الرمز المطابق** قد يختلف عن الوظيفة المطلوبة (مثل التصديرات المُعاد توجيهها).
  يتم تخزين السلسلة مرة واحدة في مجموعة السلاسل؛ `matched_off`/`matched_len` تشير إليها.
* الإدخالات **مُرَتَّبة حسب إصدار البناء** (`major`، ثم `minor`) للبحث الفعال.

---

#### رموز البنية (Architecture Codes)

كلا التنسيقين الثنائيين يستخدمان نفس ترميز البنية (عبر `ARCH_CODE_MAP`):

| الكود | البنية        | الوصف                          |
| ----- | ------------- | ------------------------------ |
| 1     | x64           | 64-bit AMD64/Intel64           |
| 2     | ARM64         | 64-bit ARM (AArch64)           |
| 3     | WoW64         | 32-bit x86 على 64-bit Windows  |

سلاسل البنية غير المعروفة تتحول افتراضيًا إلى `1` (x64) داخليًا؛ CLI يقيّد القيم إلى المجموعة المدعومة.

---

### 3. **تنسيق ملف رأس C (C Header)**

ملفات رأس C جاهزة للترجمة تحتوي على هياكل ومصفوفات بيانات آمنة من حيث النوع.

`pe-signgen` يمكنه إصدار *نوعين* من ملفات رأس 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 Header

لحالات الاستخدام التي تعتمد على الإزاحة فقط، يُصدر 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
* اتصال بالإنترنت (التشغيل الأول)
* مساحة قرص ~10 جيجابايت للذاكرة المؤقتة الكاملة

### التثبيت من 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-core CPU, 100 Mbps):**

| العملية                         | الوقت        |
| ------------------------------- | ----------- |
| التشغيل الأول (بدون ذاكرة تخزين مؤقت)              | 5–10 دقائق    |
| تشغيل من الذاكرة المؤقتة                        | < 1 ثانية     |
| تحليل لكل بناء                | 0.1–0.5 ثانية |
| تشغيل كامل (1000 بناء، 8 عمال) | 2–4 دقائق     |

**المتطلبات من الموارد:**

* **القرص:** ~10 جيجابايت لذاكرة التخزين المؤقت الكاملة لـ DLL/PDB
* **الذاكرة:** ~500 ميجابايت ذروة الاستخدام
* **الشبكة:** عدة جيجابايت في التشغيل الأول

---

## القيود المعروفة

* **تغطية إصدارات ويندوز:** فقط ويندوز **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 – بيانات بناء ويندوز بواسطة @m417z
  • pefile – مكتبة تحليل PE
  • winpdb-rs – روابط بايثون لتحليل PDB

مستوحى من الحاجة إلى توليد توقيعات قوية وآلية لواجهات برمجة تطبيقات ويندوز الداخلية.


المساهمة

المساهمات مرحب بها! يرجى:

  1. عمل Fork للمستودع
  2. إنشاء فرع ميزة
  3. إضافة اختبارات للوظائف الجديدة
  4. تقديم طلب سحب

الدعم

  • المشكلات: GitHub Issues
  • النقاشات: GitHub Discussions
تنزيل الأداة