
تصوّر مساحة العنوان الافتراضية لعملية ويندوز على منحنى هيلبرت.
كليرفويانس (/klɛərˈvɔɪəns/؛ من الفرنسية clair بمعنى واضح وvoyance بمعنى رؤية) من ويكيبيديا.
clairvoyance ينشئ تصورًا ملونًا لحماية الصفحات لمساحة عنوان عملية 64-بت بأكملها (المستخدم والنواة) التي تعمل على نواة Windows 64-بت.
لتحويل الفضاء أحادي البعد، أي مساحة العنوان، إلى تصور ثنائي الأبعاد، يتم استخدام منحنى هيلبرت لملء الفراغ. كل بكسل ملون في الصورة أعلاه يمثل حماية الصفحة (UserRead، UserReadWrite، إلخ) لصفحة بحجم 4KB في الذاكرة الافتراضية.
يتم حساب مساحة العنوان مباشرة عن طريق تحليل التسلسل الهرمي لجداول الصفحات رباعي المستويات المرتبط بعملية من تفريغ تعطل النواة الذي تم إنشاؤه باستخدام WindDbg.
أخيرًا، ينتج البرنامج ملفًا يحتوي على البيانات الوصفية المطلوبة لعرضه على لوحة ثنائية الأبعاد، بالإضافة إلى القدرة على حساب العنوان الافتراضي المقابل لبكسل محدد مُميَّز.
الثنائيات المجمّعة متاحة في قسم الإصدارات. كما يتوفر عارض عبر الإنترنت مستضاف على 0vercl0k.github.io/clairvoyance.
تحية خاصة إلى:
لتوليد تفريغ تعطل النواة، يُنصح باستخدام WinDbg وKDNet مع الأمر .dump /f.
بمجرد الحصول على التفريغ، يمكنك تمرير مساره إلى clairvoyance بالإضافة إلى العنوان الفعلي لدليل الصفحات الذي يهمك:
./clairvoyance <dump path> [<page dir pa>]
يؤدي هذا إلى إنشاء ملف بامتداد clairvoyance يمكنك بعد ذلك عرضه في متصفحك على 0vercl0k.github.io/clairvoyance أو عن طريق الانتقال إلى فرع gh-pages حيث يستضاف العارض.
يقوم CI ببناء clairvoyance على Linux باستخدام clang++-11 وعلى Windows باستخدام Visual studio 2019 من مايكروسوفت.
لبنائه بنفسك، يمكنك استخدام النصوص البرمجية في build/:
(base) clairvoyance\build>build-msvc.bat
(base) clairvoyance\build>cmake ..
-- Selecting Windows SDK version 10.0.19041.0 to target Windows 10.0.19042.
-- Configuring done
-- Generating done
-- Build files have been written to: clairvoyance/build
(base) clairvoyance\build>cmake --build . --config RelWithDebInfo
Microsoft (R) Build Engine version 16.8.2+25e4d540b for .NET Framework
Copyright (C) Microsoft Corporation. All rights reserved.
clairvoyance.vcxproj -> clairvoyance\build\RelWithDebInfo\clairvoyance.exe
Building Custom Rule clairvoyance/CMakeLists.txt
فيما يلي أشياء لاحظتها في تفريغ تعطل للنواة تم إنشاؤه من جهاز افتراضي Hyper-V يعمل بنظام Windows:
kd> vertarget
Windows 10 Kernel Version 18362 UP Free x64
Product: WinNt, suite: TerminalServer SingleUserTS
Edition build lab: 18362.1.amd64fre.19h1_release.190318-1202
Machine Name:
Kernel base = 0xfffff805`36800000 PsLoadedModuleList = 0xfffff805`36c432f0
Debug session time: Sat Jul 25 10:00:19.637 2020 (UTC - 8:00)
System Uptime: 0 days 0:18:53.609
لا يبدو أن Windows يستخدم الصفحات الضخمة (1GB)، أو على الأقل لم أرَ أي واحدة تُستخدم في أي من التفريغات التي جمعتها.
تُستخدم الصفحات الكبيرة بكثرة لتعيين بعض الملفات التنفيذية للنواة مثل نواة Windows nt على سبيل المثال:
kd> ? nt
Evaluate expression: -8773703827456 = fffff805`36800000
VA:0xfffff80536800000, PA:0x2400000 (KernelReadWriteExec, Large, PML4E:0xd5745f80, PDPTE:0x42080a0, PDE:0x4209da0, PTE:0x0)
هناك أيضًا مجموعة من صفحات النواة القابلة للقراءة والكتابة والتنفيذ وهي ليست صفحات كبيرة، وكان ذلك مفاجئًا إلى حد ما. كنت أعلم أن النواة / hal يمكن تعيينها باستخدام صفحات كبيرة وأن تلك الصفحات كانت krwx. السبب في ذلك هو أن حجم 2MB كبير جدًا لدرجة أنه يمتد عبر كل من المقاطع القابلة للتنفيذ ومقاطع البيانات؛ مما يعني أن الصفحة يجب أن تكون قابلة للكتابة والتنفيذ.
الذكر العلني الوحيد الذي تمكنت من العثور عليه لهذا الأمر هو في هذه التدوينة (شكرًا Ivan):
لقد تواصلت مع Microsoft التي ادعت أن هذا مقصود لأنه "في بعض الحالات يتم تعيين النواة بصفحات كبيرة" وأنه يمكن منع ذلك عن طريق تمكين الحماية القائمة على المحاكاة الافتراضية (VBS).
يتم تعيين مجموعة من مقاطع ذاكرة النواة الكبيرة على نفس الصفحة الفعلية (مملوءة بالأصفار):
VA:0xffffc27ef4401000, PA:0x4200000 (KernelRead, Normal, ...)
VA:0xffffc27ef4402000, PA:0x4200000 (KernelRead, Normal, ...)
VA:0xffffc27ef4403000, PA:0x4200000 (KernelRead, Normal, ...)
...
VA:0xffffc27ef63fb000, PA:0x4200000 (KernelRead, Normal, ...)
VA:0xffffc27ef63fc000, PA:0x4200000 (KernelRead, Normal, ...)
VA:0xffffc27ef63fd000, PA:0x4200000 (KernelRead, Normal, ...)
VA:0xffffc27ef63fe000, PA:0x4200000 (KernelRead, Normal, ...)
VA:0xffffc27ef63ff000, PA:0x4200000 (KernelRead, Normal, ...)
فيما يلي واحدة أصغر (المنطقة ليست متجاورة تمامًا، هناك بعض الثغرات):
VA:0xffffc27ed2201000, PA:0x4300000 (KernelRead, Normal, ...)
VA:0xffffc27ed2202000, PA:0x4300000 (KernelRead, Normal, ...)
VA:0xffffc27ed2203000, PA:0x4300000 (KernelRead, Normal, ...)
...
VA:0xffffc27ed25fc000, PA:0x4300000 (KernelRead, Normal, ...)
VA:0xffffc27ed25fd000, PA:0x4300000 (KernelRead, Normal, ...)
VA:0xffffc27ed25fe000, PA:0x4300000 (KernelRead, Normal, ...)
VA:0xffffc27ed25ff000, PA:0x4300000 (KernelRead, Normal, ...)
هذا مجرد قسم يستعرض بعضًا من الأنماط الرائعة التي يمكنك رؤيتها في بعض مناطق مساحة العنوان.
تخصيصات كومة الصفحات وصفحات الحماية الخاصة بها تبدو رائعة جدًا ويسهل تمييزها:
تتميز أكوام النواة أيضًا بشكل جميل يمكن التعرف عليه نظرًا لحجمها وصفحات الحماية:
تبدو منطقة ذاكرة التخزين المؤقت للنظام في النواة وكأنها سديم في التفريغات التي رأيتها:
Axel '0vercl0k' Souchet