
العثور على عناوين قاعدة DLL دون التنقل عبر PEB
تقدّم هذه المكتبة وأداة سطر الأوامر المكتوبة بلغة Rust طريقة بديلة للعثور على العنوان الأساسي لمكتبات DLL المحمّلة دون استخدام اجتياز كتلة بيئة العملية (PEB walk). تُعد هذه التقنية مفيدة بشكل خاص في السيناريوهات التي قد يتم فيها اكتشاف أو حظر اجتياز PEB.
يحتوي هذا المستودع على فرعين بأساليب مختلفة:
winapi ودالة VirtualQuery للتحقق من الذاكرةlib.rs) لا تحتوي على عبارات طباعة لضمان تكامل نظيفmain.rs) تتضمن مخرجات تصحيح لإثبات المفهومVirtualQueryكلا الفرعين آمنان للاستخدام، لكن فرع OPSEC يوفر مزايا أمان تشغيلي إضافية للسيناريوهات التي قد تتم فيها مراقبة استدعاءات API أو حظرها.
يستخدم البرنامج أسلوب فحص المكدس (stack walking) للعثور على مكتبات DLL من خلال:
الوصول إلى كتلة بيئة الخيط (TEB):
فحص المكدس (Stack Walking):
VirtualQuery للتحقق من مناطق الذاكرةتحديد الوحدة النمطية:
التحقق:
غالباً ما تتضمن الطرق التقليدية للعثور على مكتبات DLL اجتياز قائمة الوحدات في PEB. ورغم فعاليتها، إلا أن هذا الأسلوب قد يكون:
توفّر طريقة فحص المكدس هذه بديلاً:
winapiأضف إلى ملف Cargo.toml الخاص بك:
الفرع الرئيسي:
[dependencies]
moonwalk = { git = "https://github.com/Teach2Breach/moonwalk.git" }
فرع OPSEC:
[dependencies]
moonwalk = { git = "https://github.com/Teach2Breach/moonwalk.git", branch = "opsec" }
مثال على الاستخدام في الكود الخاص بك:
use moonwalk::find_dll_base;
fn main() {
// Find ntdll.dll
if let Some(ntdll_base) = find_dll_base("ntdll.dll") {
println!("ntdll.dll base: 0x{:X}", ntdll_base);
}
// Case-insensitive, .dll extension optional
if let Some(kernel32_base) = find_dll_base("KeRNEl32") {
println!("kernel32.dll base: 0x{:X}", kernel32_base);
}
}
البناء:
cargo build --release
التشغيل:
# Find ntdll.dll (default)
cargo run --release
# Find specific DLL (case insensitive, .dll extension optional)
cargo run --release kernel32.dll
cargo run --release KeRNEl32
cargo run --release USER32
لم تعد عبارات الطباعة مضمنة. هذه الصورة مُدرجة لأغراض تعليمية.

VirtualQuery للتحقق الآمن من الوصول إلى الذاكرة