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

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

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

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

دليل الأدوات

الفئات

عرض جميع الفئات
Loading categories
MOEW — ورقة بيضاء | Kitploit
أدوات/GitHubGitHub/harryeetsource/moew
أدوات دفاعيةالاستغلالالهندسة العكسيةمصممي الأخطاءتحليل البرمجيات الخبيثةالتعلم والتعليماستغلال الملفات الثنائية
GitHubharryeetsource/moew

MOEW

ورقة بيضاء

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

الأكثر شعبية

عرض الكل →

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

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

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

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

تهديدات غير مرئية، حلول مرئية.

شلال الأكواد غير المحاذية (MOEW)

إثبات المفهوم لشلال المعالجات الاستثنائية (SEH) ذو 3 مراحل (غير ضار، x86/Wow64)

الخلاصة: يُظهر إثبات المفهوم هذا سلسلة متتالية من المعالجات الاستثنائية المنظمة (SEH) مكونة من 3 مراحل ناتجة عن تنفيذ غير محاذٍ متعمد إلى كتل بايت خام التي أول تعليمة صحيحة فيها هي تعليمة div reg بقسمة على صفر.
كل مرحلة استثناء تقوم بتثبيت معالج SEH التالي، وتؤدي إلى قسمة جديدة غير محاذية على صفر، وتنفذ حمولة مرئية غير ضارة قبل استعادة سلسلة SEH الأصلية والإنهاء النظيف.


1. نظرة عامة

MOEW (شلال الأكواد غير المحاذية) هو عينة بحث دفاعي تُظهر تنفيذًا متعدد المراحل مدفوعًا بالاستثناءات بشكل متحكم به على x86/Wow64 Windows. يُظهر:

  • التلاعب اليدوي بسلسلة SEH عبر fs:[0]
  • عدم المحاذاة المتعمد في تسلسلات بايت مصنوعة يدويًا (blob1، blob2، blob3)
  • معالجات SEH متسلسلة عبر المراحل
  • التكرار متعدد الأعطال من خلال:
    • KiUserExceptionDispatcher
    • RtlDispatchException
    • معالجات وضع المستخدم المخصصة
  • مسار إنهاء نظيف يعيد سلسلة SEH الأصلية

جميع الحمولات غير ضارة:

  • المرحلة 1: تشغيل Notepad
  • المرحلة 2: كتابة ملف علامة إلى %TEMP%
  • المرحلة النهائية: تشغيل الآلة الحاسبة

تم تعطيل إثبات المفهوم عمدًا. لا يتم تشفير أو تعديل أو إتلاف أي بيانات.


2. الميزات

  • تكرار SEH محدد بالكامل من خلال 3 معالجات متدرجة
  • كتل بايت x86 عارية مع مسارات فك تشفير صحيحة متعددة
  • div غير محاذٍ في إزاحات متحكم بها (ECX/EDX/EBX = 0)
  • عداد عالمي لكل مرحلة للتسجيل والتتبع
  • استعادة كاملة لرأس SEH الأصلي (ORIGINAL_SEH)
  • Rust الليلي + التجميع المضمّن + الوظائف العارية
  • "حمولات" غير ضارة ولكن مرئية لاختبار التتبع والمصحح

3. متطلبات البيئة

3.1 العمارة

  • x86 (32 بت) فقط
  • تم التجميع باستخدام سلسلة أدوات MSVC
  • يعمل على Windows 64 بت تحت WoW64 أيضًا

3.2 Rust الليلي

يستخدم إثبات المفهوم ميزات الليلي فقط:

root@kitploit:~
#![feature(asm_experimental_arch)]
#![feature(naked_functions)]

قم بتثبيت المكونات الضرورية:

root@kitploit:~
rustup toolchain install nightly
rustup target add i686-pc-windows-msvc --toolchain nightly

3.3 تعطيل SAFESEH

نظرًا لأن إثبات المفهوم يقوم بتثبيت معالجات SEH مخصصة غير موجودة في جدول SAFESEH، يجب توجيه الرابط لتعطيل التحقق من SAFESEH.

أنشئ .cargo/config.toml:

root@kitploit:~
[target.i686-pc-windows-msvc]
rustflags = [
  "-C", "link-arg=/SAFESEH:NO",
]

4. تعليمات البناء

قم ببناء الثنائي:

root@kitploit:~
cargo +nightly build --target i686-pc-windows-msvc --release

المخرج موجود في:

root@kitploit:~
target\i686-pc-windows-msvc\release\seh_waterfall.exe

5. تشغيل إثبات المفهوم

نفّذ:

root@kitploit:~
seh_waterfall.exe

تدفق التحكم المتوقع:

root@kitploit:~
المرحلة 0 ← blob1 غير محاذٍ ← معالج المرحلة 1
المرحلة 1 ← blob2 غير محاذٍ ← معالج المرحلة 2
المرحلة 2 ← blob3 غير محاذٍ ← المعالج النهائي
النهائي ← استعادة SEH ← خروج

الآثار المرئية:

  • يتم تشغيل notepad.exe (المرحلة 1)
  • يتم إنشاء %TEMP%\moew_stage2.txt (المرحلة 2)
  • يتم تشغيل calc.exe (المعالج النهائي)

6. التحليل الفني

6.1 تنسيق سجل SEH

على Windows 32 بت، تشكل سجلات SEH قائمة مرتبطة مخزنة في fs:[0]:

root@kitploit:~
#[repr(C)]
struct SehRec {
    next: *mut SehRec,
    handler: usize,
}

يستخدم كل معالج توقيع SEH القياسي:

root@kitploit:~
extern "system" fn handler(
    record: *mut u8,
    frame: *mut u8,
    context: *mut u8,
    dispatcher: *mut u8,
) -> i32

6.2 الحالة العالمية

root@kitploit:~
static STAGE_COUNTER: AtomicU32 = AtomicU32::new(0);
static mut ORIGINAL_SEH: *mut SehRec = std::ptr::null_mut();

تستخدم من أجل:

  • حساب عمق التكرار للمعالج
  • استعادة رأس SEH الأصلي في نهاية الشلال

7. منطق المراحل

المرحلة 0 — إعداد الإطار الأولي

  1. حفظ fs:[0] كـ ORIGINAL_SEH.
  2. بناء سجل SEH يشير إلى معالج المرحلة 1.
  3. الكتابة فوق fs:[0] بهذا السجل الجديد.
  4. عدم المحاذاة إلى blob1 + 5، الذي يفك تشفيره كـ div ecx (بعد تعيين ECX = 0).

المرحلة 1 — أول معالج SEH

  1. تشغيل notepad.exe.
  2. بناء سجل SEH لمعالج المرحلة 2 وسلسلته في الأعلى.
  3. عدم المحاذاة إلى blob2 + 3 → div edx (مع EDX = 0).

المرحلة 2 — ثاني معالج SEH

  1. كتابة %TEMP%\moew_stage2.txt.
  2. تثبيت المعالج النهائي على سلسلة SEH.
  3. عدم المحاذاة إلى blob3 + 3 → div ebx (مع EBX = 0).

المعالج النهائي — الإنهاء

  1. تشغيل calc.exe.
  2. استعادة ORIGINAL_SEH إلى fs:[0].
  3. الخروج النظيف من العملية عبر process::exit(0).

8. كتل الأعطال غير المحاذية

8.1 blob1

root@kitploit:~
#[unsafe(naked)]
pub extern "C" fn blob1() {
    naked_asm! {
        ".byte 0xB8, 0x10, 0x00, 0x00, 0x00", // mov eax, 0x10
        ".byte 0xF7, 0xF1",                   // div ecx
        ".byte 0xC3",                         // ret
        ".byte 0x90, 0x90, 0x90",             // nop padding
    }
}
  • فك التشفير المحاذي: mov eax, 0x10; div ecx; ret
  • غير محاذٍ عند +5: div ecx (مع ECX = 0 → #DE)

8.2 blob2

root@kitploit:~
#[unsafe(naked)]
pub extern "C" fn blob2() {
    naked_asm! {
        ".byte 0x55",                         // push ebp
        ".byte 0x8B, 0xEC",                   // mov ebp, esp
        ".byte 0xF7, 0xF2",                   // div edx
        ".byte 0xC3",                         // ret
        ".byte 0x90, 0x90, 0x90",             // nop padding
    }
}
  • فك التشفير المحاذي: push ebp; mov ebp, esp; div edx; ret
  • غير محاذٍ عند +3: div edx (مع EDX = 0 → #DE)

8.3 blob3

root@kitploit:~
#[unsafe(naked)]
pub extern "C" fn blob3() {
    naked_asm! {
        ".byte 0x53",                         // push ebx
        ".byte 0x8B, 0xD8",                   // mov ebx, eax
        ".byte 0xF7, 0xF3",                   // div ebx
        ".byte 0xC3",                         // ret
        ".byte 0x90, 0x90, 0x90",             // nop padding
    }
}
  • فك التشفير المحاذي: push ebx; mov ebx, eax; div ebx; ret
  • غير محاذٍ عند +3: div ebx (مع EBX = 0 → #DE)

9. خط أنابيب الاستثناء

تعيد كل مرحلة متعثرة دخول خط أنابيب استثناء وضع المستخدم في Windows:

root@kitploit:~
KiUserExceptionDispatcher
    → RtlDispatchException
        → اجتياز سلسلة SEH (fs:[0])
            → معالج MOEW

عرض المصحح النموذجي:

root@kitploit:~
seh_waterfall!blobX+offset
ntdll!KiUserExceptionDispatcher
ntdll!RtlDispatchException
seh_waterfall!stageN_handler

الشلال مدفوع بالكامل بأعطال الأجهزة الحقيقية وإرسال SEH؛ لا تُستخدم استثناءات اصطناعية أو مزيفة.


10. إخراج ملف العلامة

يبدو الملف المكتوب في المرحلة 2 كما يلي:

root@kitploit:~
MOEW Stage 2 Marker
-------------------
تم كتابة هذا الملف بواسطة معالج SEH للمرحلة 2
كحمولة توضيحية غير ضارة.

وجودها في %TEMP% يُعد دليلاً بسيطًا ومرئيًا على أن المرحلة 2 تم تنفيذها عبر سلسلة SEH.


11. ملاحظات السلامة

  • إثبات المفهوم غير ضار ولأغراض البحث الدفاعي فقط.
  • لا استمرارية، ولا تعديل في السجل، ولا تشفير.
  • يتم التقاط جميع الاستثناءات ومعالجتها.
  • يتم استعادة سلسلة SEH الأصلية قبل الإنهاء.

12. التحسينات المستقبلية

تشمل الامتدادات المحتملة:

  • قواعد YARA والسلوكية لشلالات SEH وأنماط الاستثناء المتكررة.
  • رسم خرائط إشارات ETW / EDR للأعطال المتدرجة في الأجهزة.
  • رسوم بيانية لتطور سلسلة SEH مع مرور الوقت.
  • مقارنة جنبًا إلى جنب مع سلاسل استثناءات البرامج الضارة الحقيقية.

13. كود المصدر الكامل

يتوفر تنفيذ إثبات المفهوم الكامل في هذا المستودع (راجع src/main.rs).


14. الترخيص

هذا المشروع مخصص للبحث الدفاعي والتعليم. حقوق النشر <2025>

يُمنح الإذن مجانًا لأي شخص يحصل على نسخة من هذا البرنامج والملفات المرتبطة به (البرنامج)، للتعامل مع البرنامج دون قيود، بما في ذلك على سبيل المثال لا الحصر حقوق الاستخدام والنسخ والتعديل والدمج والنشر والتوزيع والترخيص و/أو بيع نسخ من البرنامج، والسماح للأشخاص الذين يتم تزويدهم بالبرنامج بذلك، وفقًا للشروط التالية:

يجب تضمين إشعار حقوق النشر أعلاه وإذن الإذن هذا في جميع النسخ أو الأجزاء الجوهرية من البرنامج.

يتم توفير البرنامج "كما هو"، دون أي ضمان من أي نوع، صريحًا أو ضمنيًا، بما في ذلك على سبيل المثال لا الحصر ضمانات القابلية للتسويق والملاءمة لغرض معين وعدم الانتهاك. في أي حال من الأحوال لا يكون المؤلفون أو مالكو حقوق النشر مسؤولين عن أي مطالبة أو أضرار أو مسؤولية أخرى، سواء في دعوى تعاقدية أو تقصيرية أو غير ذلك، تنشأ عن أو فيما يتعلق بالبرنامج أو استخدامه أو التعاملات الأخرى في البرنامج.


15. العينة الحقيقية مقابل إثبات المفهوم: فساد SEH، سلوك الشلال، وتأثير القياس عن بعد

15.1 سلوك العينة الحقيقية: فساد SEH المتعمد

العينة الحقيقية من MOEW التي ألهمت إثبات المفهوم هذا لم تستعيد fs:[0] في نهاية التنفيذ. بدلاً من ذلك، كانت مرحلتها النهائية:

  1. الكتابة فوق رأس SEH (fs:[0]) إما بـ NULL أو بمؤشر إلى ذاكرة غير صالحة.
  2. إطلاق استثناء غير محاذٍ أخير، مما يضمن حدوث عطل في الأجهزة.
  3. إجبار Windows على اجتياز سلسلة SEH غير صالحة أو مبتورة.
  4. تسبب في مواجهة RtlDispatchException لمؤشر معالج غير صالح.
  5. أدى إلى تعطل حيث:
    • كان EIP/RIP يشير إلى ذاكرة غير صورة (كومة، مكدس، أو منطقة مجهولة).
    • لم يتمكن حل الوحدة المتسببة في العطل وظهرت كـ unknown.
    • ظهر مسار العطل أيضًا كـ unknown.
  6. أنتج تواقيع Windows Error Reporting (WER) غير منسوبة لأي وحدة محملة.
  7. سجل أحداث Application Error من Event Viewer بإزاحات عطل لا معنى لها.
  8. أنتج قياس عن بعد EDR يسيطر عليه:
    • مكالمات متكررة لـ KiUserExceptionDispatcher،
    • انتقالات SEH متكررة،
    • تعطل شاذ نهائي يفتقر إلى إسناد الوحدة.

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


15.2 سلوك إثبات المفهوم: الاستعادة النظيفة لـ SEH دون تعطل نهائي

على عكس العينة الحقيقية، يقوم إثبات المفهوم هذا بما يلي:

  • يلتقط رأس SEH الأصلي أثناء المرحلة 0:

    root@kitploit:~
    asm!("mov {old}, fs:[0]", old = out(reg) old_head);
    ORIGINAL_SEH = old_head;
    
  • يستعيد رأس SEH الأصلي في المعالج النهائي:

    root@kitploit:~
    asm!("mov fs:[0], {p}", p = in(reg) ORIGINAL_SEH);
    
  • ينتهي نظيفًا عبر process::exit(0) بدلاً من إطلاق عطل غير معالج.

نتيجة لذلك، إثبات المفهوم:

  • لا يترك سلسلة SEH فاسدة.
  • لا ينتج استثناءً نهائيًا غير معالج.
  • لا يُنشئ:
    • تقارير تعطل WER،
    • إدخالات Application Error 1000 في Event Viewer،
    • تواقيع "الوحدة المتسببة في العطل: غير معروفة"،
    • تعاملات استثناء غير صالحة،
    • أو سجلات SEH معلقة.

ومع ذلك—بشكل حاسم—إثبات المفهوم لا يلغي سلوك تدهور القياس عن بعد المدفوع بالاستثناء الخاص بـ MOEW.


15.3 تدهور القياس عن بعد المشترك بين العينة الحقيقية وإثبات المفهوم

يقوم إثبات المفهوم بالتأكيد بتدهور القياس عن بعد بنفس الطريقة الأساسية:

  • يتعمد إطلاق أعطال أجهزة متعددة غير محاذية.

  • ينتج استثناءات متعددة من الفرصة الأولى في تتابع سريع.

  • يجبر Windows على تنفيذ متكرر:

    root@kitploit:~
    KiUserExceptionDispatcher
    RtlDispatchException
        → معالج مخصص
        → كتلة غير محاذية
        → عطل في الأجهزة
    
  • يولد أكوام استدعاء غير خطية ومسيطرة على الاستثناءات.

  • يشوه إعادة بناء تدفق التحكم في المصححات و EDR عن طريق توجيه التنفيذ عبر:

    • معالجات SEH متكررة،
    • مسارات فك تشفير غير محاذية،
    • عناوين غير محاذية للوظائف،
    • حدود تعليمات جزئية.

وبالتالي، يعيد إثبات المفهوم إنتاجًا أمينًا:

  • نمط الشلال المتكرر،
  • آلة الحالة المدفوعة بالاستثناء،
  • سلوك الدخول ذو الأكواد غير المحاذية،
  • وإبهام تدفق التحكم،

...مع تجنب التعطل النهائي المدمر.

هذا يجعل إثبات المفهوم مثاليًا للقياس والبحث دون استدعاء الحمولة المضادة للتحقيق الرقمي الكاملة.


15.4 لماذا إثبات المفهوم مناسب للبحث الدفاعي

نظرًا لأن إثبات المفهوم يحافظ على السلوك العام لـ MOEW باستثناء تعطل فساد SEH، فهو:

  • آمن للتشغيل المتكرر في بيئات المختبر.
  • محدد ومستقر.
  • مناسب لـ:
    • تحليل خط أنابيب EDR،
    • أبحاث القياس عن بعد،
    • تدريب الاستجابة للحوادث،
    • اختبار سلوك المصحح،
    • المقارنة جنبًا إلى جنب مع عينات ضارة حقيقية.

يقوم إثبات المفهوم بنمذجة شلال الاستثناء (جوهر MOEW) مع إزالة التوقيع المدمر النهائي. يُظهر أن تدهور القياس عن بعد ينشأ ليس فقط من فساد SEH، ولكن من نموذج تدفق التحكم المدفوع بالاستثناء نفسه.


15.5 ملخص

هذا القسم يُضفي طابعًا رسميًا على الاختلافات السلوكية مع الحفاظ على وضوح الغرض من إثبات المفهوم:
إظهار شلال MOEW بشكل آمن ومناسب للبحث دون التعطل النهائي المضاد للتحقيق الرقمي.

تنزيل الأداة
السلوكعينة MOEW الحقيقيةتنفيذ إثبات المفهوم
شلال الأكواد غير المحاذية✔✔
آلة الحالة المدفوعة بـ SEH المتكرر✔✔
أكوام استدعاء إرسال الاستثناءات المهيمنة✔✔
تدهور القياس عن بعد / تتبع الأكوام✔✔
فساد SEH المتعمد✔❌
مؤشرات SEH معلقة أو غير صالحة✔❌
استثناء نهائي غير معالج✔❌
تعطل WER "وحدة غير معروفة"✔❌
استعادة نظيفة لـ fs:[0]❌✔
إنهاء نظيف❌✔