Skip to content
KitploitKITPLOIT
أدواتعمليات الاستغلالالمدونة
Log in
إرسال
أدواتعمليات الاستغلالالمدونة
إرسال

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

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

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

دليل الأدوات

الفئات

عرض جميع الفئات
Loading categories
SILVERPICK — إطار تطوير شيلكود وضع المستخدم لنظام ويندوز (WUMSDF) | Kitploit
أدوات/GitHubGitHub/winterknife/silverpick
الاستغلالشيل كودالفريق الأحمرتوليد شيفرة القشرةتطوير الحمولات
GitHubwinterknife/silverpick

SILVERPICK

إطار تطوير شيلكود وضع المستخدم لنظام ويندوز (WUMSDF)

عرض المستودع
1581719منذ 2 أشهرتمت المراجعة من قبل Kitploit

الأكثر شعبية

عرض الكل →

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

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

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

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

SILVERPICK

الإصدار

  • v1.1

نبذة

مشروع SILVERPICK هو إطار عمل تطوير شيل كود في وضع المستخدم لنظام ويندوز (WUMSDF)، والغرض الوحيد منه هو تمكين مطوّري القدرات من بناء كتل كود مستقل عن العنوان (PIC) لنظام Windows بمعمارية x64 باستخدام C/C++ بطريقة سهلة، وذلك لتقليل تكاليف التطوير لمثل هذا المسعى.

إنه مشتق من مشروع WILDBEAST، وبالتالي يعتمد على:

  1. Visual Studio Code كمحرر أكواد
  2. سلسلة أدوات MinGW-w64 كسلسلة أدوات الترجمة
  3. GNU Make كنظام بناء

الإعداد

يمكنك العثور على تعليمات الإعداد من هنا: GCC-Clang-Setup-Windows

يُرجى ملاحظة أن هذا المشروع يستخدم MSYS2.

الميزات

كتابة الشيل كود بلغات برمجة عالية المستوى ليس بالأمر الجديد، فقد نُشرت عدد لا يحصى من التدوينات والأوراق البحثية حول هذا الموضوع منذ عام 2010. إذن، ما الجديد في SILVERPICK؟

حسنًا، يسعدني أنك سألت.

SILVERPICK يملك حقيبة صغيرة لطيفة من الحيل المخبأة في جعبته، لكن الأهم من ذلك كله، أن هذه هي رؤيتي الشخصية للموضوع.

لذا، دون مزيد من اللغط، أقدم لكم حيلتي الأولى.

الحيلة 01

منذ أن روّج مات غريبر (Matt Graeber) لكتابة الشيل كود بلغة C، كان معظم الناس يستخدمون كعب محاذاة المكدس ذا الـ 16 بايت المكتوب بلغة Assembly.

ورغم أن هذا ليس مشكلة، وبما أننا لسنا IKEA، فإن لغة التجميع لا ينبغي أن تكون ضرورية، وهي في الحقيقة ليست كذلك.

توجد سمة دالة في GCC من شأنها إصدار كعب محاذاة المكدس نيابةً عنك.

تعرّف على سمة الدالة force_align_arg_pointer في صورة ماكرو مفيد يُدعى ALIGN_STACK، والذي يولّد لغة التجميع التالية:

Disassembly of section .init:

<PicEntry>:
	push   rbp
	mov    rbp,rsp
	and    rsp,0xfffffffffffffff0
	sub    rsp,0x20
	call   <PicEntry+0x11>	IMAGE_REL_AMD64_REL32	.text$payload
	leave
	ret

ما هو قسم .init، تتساءل؟ حسنًا، هذا يقودنا بشكل جميل إلى حيلتي الثانية.

الحيلة 02

ربما يكون مات غريبر قد روّج لكتابة الشيل كود بلغة C في وقت ما، لكن في الحقيقة، كان بول أونغور (Paul Ungur) هو من أحيا هذا الفن الأسود مع مشروع Stardust.

الآن، يستخدم Stardust سكربت ربط خاص بأدوات Binutils للتحكم في وضع الدوال والبيانات داخل قسم PE المناسب بالترتيب الصحيح. هذه التقنية نفسها مشتقة من عمل أوستن هدسون (Austin Hudson)، وكثير من الناس يستخدمون نسخة مختلفة من سكربتات الربط الخاصة به.

في حين أن سكربتات الربط رائعة لترتيب الأقسام في الرابط، إلا أنها غير ضرورية إذا كان كل ما تحتاجه هو وضع دالة معينة في بداية قسم الكود.

هنا تأتي سمة الدالة section مع اسم قسم خاص يُدعى .init، والذي يخبر الرابط بأن الدالة تحتوي على كود تهيئة زمن التشغيل الذي يسبق main()، ويجب أن تكون أولًا في ترتيب الربط.

من أجل هذا الغرض، تم إنشاء ماكرو CODE_BEGIN.

الحيلة 03

أما بالنسبة لحيلتي الثالثة، فأقدم لكم ماكرو STACK_STRING.

في C، يمكنك إنشاء سلسلة نصية على المكدس (سلسلة تُبنى ديناميكيًا على المكدس) عن طريق تعريف حرفية السلسلة كمصفوفة من أحرف ANSI:

char charrHelloKitty[] = { 'H', 'e', 'l', 'l', 'o', 'K', 'i', 't', 't', 'y', '\0' };

في C++، يمكنك إنشاء سلسلة نصية على المكدس بمجرد تعريف مصفوفة char على أنها constexpr:

constexpr char charrHelloKitty[]{ "HelloKitty" };

ومع ذلك، فإن كلتا التقنيتين تصبحان عديمتي الفائدة في مواجهة تحسينات المترجم إذا كانت الحروف النصية كبيرة بما يكفي، على عكس حلّنا الذي سيعمل بغض النظر عن طول السلسلة ومستوى تحسينات المترجم، وذلك بفضل خدعة برمجة قوالب C++ الذكية التي تفضلنا بها جان بولو (Can Bölük).

استخدام هذا الماكرو سهل للغاية:

STACK_STRING(sstrText, "an extra long hello world!");
STACK_STRING(sstrCaption, "Demo");

MessageBoxA(nullptr, sstrText.data(), sstrCaption.data(), MB_OK);

سيولّد هذا لغة التجميع التالية:

mov     [rsp+58h+var_23], 61h ; 'a'
mov     [rsp+58h+var_22], 6Eh ; 'n'
mov     [rsp+58h+var_21], 20h ; ' '
mov     [rsp+58h+var_20], 65h ; 'e'
mov     [rsp+58h+var_1F], 78h ; 'x'
mov     [rsp+58h+var_1E], 74h ; 't'
mov     [rsp+58h+var_1D], 72h ; 'r'
mov     [rsp+58h+var_1C], 61h ; 'a'
mov     [rsp+58h+var_1B], 20h ; ' '
mov     [rsp+58h+var_1A], 6Ch ; 'l'
mov     [rsp+58h+var_19], 6Fh ; 'o'
mov     [rsp+58h+var_18], 6Eh ; 'n'
mov     [rsp+58h+var_17], 67h ; 'g'
mov     [rsp+58h+var_16], 20h ; ' '
mov     [rsp+58h+var_15], 68h ; 'h'
mov     [rsp+58h+var_14], 65h ; 'e'
mov     [rsp+58h+var_13], 6Ch ; 'l'
mov     [rsp+58h+var_12], 6Ch ; 'l'
mov     [rsp+58h+var_11], 6Fh ; 'o'
mov     [rsp+58h+var_10], 20h ; ' '
mov     [rsp+58h+var_2F], 0
mov     [rsp+58h+var_F], 77h ; 'w'
mov     [rsp+58h+var_E], 6Fh ; 'o'
mov     [rsp+58h+var_D], 72h ; 'r'
mov     [rsp+58h+var_C], 6Ch ; 'l'
mov     [rsp+58h+var_B], 64h ; 'd'
mov     [rsp+58h+var_A], 21h ; '!'
mov     [rsp+58h+var_33], 44h ; 'D'
mov     [rsp+58h+var_32], 65h ; 'e'
mov     [rsp+58h+var_31], 6Dh ; 'm'
mov     [rsp+58h+var_30], 6Fh ; 'o'

الحيلة 04

وبالحديث عن C++، أقدم لكم في حيلتي الرابعة التجزئة النصية في زمن الترجمة (compile-time string hashing).

ورغم أن هذا ليس مفهومًا جديدًا، فإن SILVERPICK يقدم بعض التحسينات على التنفيذات العامة الموجودة.

أولًا، نستخدم المتغير 64-بت من دالة التجزئة غير المشفرة الشهيرة FNV-1a لتقليل احتمالية نجاح هجوم تصادم التجزئة.

ثانيًا، نستخدم معاملًا معدلًا لدالة التجزئة للدفاع ضد عمليات البحث في جداول التجزئة المحسوبة مسبقًا، مثل HashDB. والأهم من ذلك، أن هذا لا يغير خصائص دالة التجزئة.

لتجزئة سلسلة قصيرة في زمن التشغيل، ما عليك سوى استخدام ماكرو HASH_STRING_RUN_TIME.

لتجزئة حرفية نصية قصيرة في زمن الترجمة، ما عليك سوى استخدام ماكرو HASH_STRING_COMPILE_TIME. يتم ضمان التقييم في زمن الترجمة فقط عبر consteval.

الحيلة 05

اتضح أنه يمكنك تنفيذ عدد لا بأس به من دوال مكتبة وقت التشغيل للغة C (CRT) باستخدام تعليمات السلاسل في معمارية x86. لذا، بالطبع، كان عليّ تنفيذها باستخدام مزيج من الدوال الجوهرية للمترجم (compiler intrinsics) ولغة التجميع المضمّنة (inline assembly).

هل تريد استخدام دالة msvcrt!memset في كودك؟ استخدم بدلًا منها ماكرو ZERO_MEMORY، والذي يستخدم تعليمة rep stosb الصادرة عبر دالة جوهرية للمترجم.

ماذا عن دالة msvcrt!memcpy أو دالة msvcrt!memmove، تسأل؟ تعرّف على ماكرو COPY_MEMORY كبديل، والذي يستخدم تعليمة rep movsb الصادرة عبر دالة جوهرية للمترجم.

ولكن ماذا عن بديل لدالة msvcrt!memcmp؟ اتضح أنه لا توجد بالضبط دالة جوهرية للمترجم متاحة لإصدار تعليمة repe cmpsb. لذا، نكتب دالة compare_memory باستخدام لغة التجميع المضمّنة بدلًا من ذلك.

أخيرًا، إذا كنت تبحث عن بديل لدالة msvcrt!memchr، تعرّف على دالة scan_memory، والتي تستخدم مرة أخرى لغة التجميع المضمّنة نظرًا لعدم وجود دالة جوهرية للمترجم متاحة لإصدار تعليمة repne scasb.

أوه، وهل نسيت أن أذكر أنه يمكنك كتابة نسختك الأكثر أمانًا من دالة msvcrt!strlen باستخدام روتين scan_memory على النحو التالي:

DWORD_PTR dwptrExportNameLength = std::min(BIT_CAST(DWORD_PTR, scan_memory(strExportName, 0x00, MAX_EXPORTED_SYMBOL_NAME_LEN)) - BIT_CAST(DWORD_PTR, strExportName), MAX_EXPORTED_SYMBOL_NAME_LEN);
تنزيل الأداة