
विंडोज़ प्रक्रिया के वर्चुअल एड्रेस स्पेस को हिल्बर्ट वक्र पर विज़ुअलाइज़ करें।
क्लेयरवॉयेंस (/klɛərˈvɔɪəns/; फ्रेंच clair से जिसका अर्थ है स्पष्ट और voyance का अर्थ है दृष्टि) विकिपीडिया से।
clairvoyance Windows 64-बिट कर्नेल पर चल रही एक संपूर्ण 64-बिट प्रोसेस एड्रेस स्पेस (यूज़र और कर्नेल) की पेज प्रोटेक्शन का एक रंगीन विज़ुअलाइज़ेशन तैयार करता है।
1 आयामी स्पेस, यानी एड्रेस स्पेस, को 2 आयामों वाले विज़ुअलाइज़ेशन में बदलने के लिए हिल्बर्ट स्पेस-फिलिंग कर्व का उपयोग किया जाता है। ऊपर की तस्वीर में प्रत्येक रंगीन पिक्सेल वर्चुअल मेमोरी में 4KB पेज की पेज प्रोटेक्शन (UserRead, UserReadWrite, आदि) को दर्शाता है।
एड्रेस स्पेस की गणना सीधे तौर पर WindDbg का उपयोग करके उत्पन्न किए गए कर्नेल क्रैश-डंप से किसी प्रोसेस से जुड़े चार-स्तरीय पेज टेबल पदानुक्रम को मैन्युअल रूप से पार्स करके की जाती है।
अंत में, प्रोग्राम एक फ़ाइल आउटपुट करता है जिसमें इसे द्वि-आयामी कैनवास पर प्रदर्शित करने के लिए आवश्यक मेटाडेटा होता है, साथ ही किसी विशिष्ट हाइलाइट किए गए पिक्सेल के अनुरूप वर्चुअल एड्रेस की गणना करने में भी सक्षम होता है।
संकलित बाइनरी releases अनुभाग में उपलब्ध हैं। एक ऑनलाइन व्यूअर 0vercl0k.github.io/clairvoyance पर भी होस्ट किया गया है।
शाउट आउट:
कर्नेल क्रैश डंप उत्पन्न करने के लिए WinDbg, KDNet का उपयोग .dump /f कमांड के साथ करने की अनुशंसा की जाती है।
एक बार डंप प्राप्त हो जाने पर, आप उसका पथ clairvoyance को दे सकते हैं, साथ ही उस पेज डायरेक्टरी का भौतिक पता भी दे सकते हैं जिसमें आपकी रुचि है:
./clairvoyance <dump path> [<page dir pa>]
यह clairvoyance एक्सटेंशन वाली एक फ़ाइल उत्पन्न करता है जिसे आप 0vercl0k.github.io/clairvoyance पर अपने ब्राउज़र में देख सकते हैं, या gh-pages शाखा को देखकर, जहाँ व्यूअर होस्ट किया गया है।
CI Linux पर clang++-11 का उपयोग करके और Windows पर Microsoft के Visual studio 2019 का उपयोग करके clairvoyance बनाता है।
इसे स्वयं बनाने के लिए आप 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
नीचे वे चीज़ें हैं जो मैंने Windows के एक Hyper-V VM से उत्पन्न कर्नेल क्रैश-डंप पर देखीं:
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)
ऐसे भी बहुत सारे कर्नेल रीड, राइट, एक्ज़ीक्यूटेबल पेज हैं जो लार्ज पेज नहीं हैं, जो कुछ हद तक आश्चर्यजनक था। मुझे ज्ञात था कि कर्नेल / हाल को लार्ज पेज का उपयोग करके मैप किया जा सकता है और वे 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