2015-09-04 9 views
7

जब मैं अपने ड्राइवर को संकलित करता हूं तो विंडोज 8.1 को लक्षित करता हूं तो कुछ बहुत अजीब होता है।विंडोज ड्राइवर में __security_init_cookie बगचेक का कारण बनता है KERNEL_SECURITY_CHECK_FAILURE

जैसे ही यह लोड हो जाता है, यह बगचेक KERNEL_SECURITY_CHECK_FAILURE, पहले पैरामीटर 6 के साथ दुर्घटनाग्रस्त हो जाता है, जिसका अर्थ है "The stack cookie security cookie was not properly initialized by the loader"।

यह केवल विंडोज 8 पर चलाने के लिए ड्राइवर चलाने और विंडोज के पुराने संस्करण पर ड्राइवर छवि को लोड करने का प्रयास कर सकता है। इस समस्या से बचने के लिए, यदि आप Windows के पिछले संस्करण "पर चलाने के लिए ड्राइवर का निर्माण करना होगा। यह त्रुटि जब मेरे द्वारा लक्षित नहीं होती है विंडोज 7

मैं बिल्कुल खोजने के लिए जहां यह त्रुटि उत्पन्न हो रही है कर रहा था। यह इस disassembly से __security_init_cookie समारोह जो GsDriverEntry द्वारा कहा जाता है में हो रहा है।

INIT:000000014000C1B4 __security_init_cookie proc near  ; CODE XREF: GsDriverEntry+10p 
INIT:000000014000C1B4     mov  rax, cs:__security_cookie 
INIT:000000014000C1BB     test rax, rax 
INIT:000000014000C1BE     jz  short loc_14000C1DA 
INIT:000000014000C1C0     mov  rcx, 2B992DDFA232h 
INIT:000000014000C1CA     cmp  rax, rcx 
INIT:000000014000C1CD     jz  short loc_14000C1DA 
INIT:000000014000C1CF     not  rax 
INIT:000000014000C1D2     mov  cs:__security_cookie_complement, rax 
INIT:000000014000C1D9     retn 
INIT:000000014000C1DA ; --------------------------------------------------------------------------- 
INIT:000000014000C1DA 
INIT:000000014000C1DA loc_14000C1DA:       ; CODE XREF: __security_init_cookie+Aj 
INIT:000000014000C1DA           ; __security_init_cookie+19j 
INIT:000000014000C1DA     mov  ecx, 6 
INIT:000000014000C1DF     int  29h    ; Win8: RtlFailFast(ecx) 

हम देख सकते हैं कि यह 2 जाँचों का निष्पादन।

The first check checks if rax (__security_cookie) is zero and the 
second check compares it to 2B992DDFA232h. 

हालांकि, 012,378,को मेरी बाइनरी में 2B992DDFA232h के रूप में घोषित किया गया है, और इस प्रकार बाधा को कभी नहीं कहा जाना चाहिए, लेकिन किसी भी तरह यह है।

+0

क्या आपने मैन्युअल रूप से '__security_cookie' घोषित किया था? यदि कोड '__security_cookie == 2B992DDFA232h' है तो यह कोड ** असफल ** (कॉल 'RtlFastFail') होगा क्योंकि इसका मतलब है कि कुकी को इसके डिफ़ॉल्ट मान (असुरक्षित) पर छोड़ दिया गया था। वहां कहीं और कोड है ('केटिककाउंट' के लिए देखो) जो कि एक नई यादृच्छिक सुरक्षा कुकी की गणना करनी चाहिए। – nneonneo

+0

आह हाँ, आप सही @nneonneo हैं, मैंने उस नियंत्रण प्रवाह को गलत तरीके से व्याख्या की है। अपने प्रश्न का उत्तर देने के लिए, नहीं, मैंने मैन्युअल रूप से __security_cookie घोषित नहीं किया था। मैंने विंडोज 7 बाइनरी में एक नज़र डाली और वास्तव में केटिककाउंट के साथ एक नई कुकी की गणना की, हालांकि विंडोज 8.1 बाइनरी पर बराबर कोड पूरी तरह गायब है। – InvokeStatic

+0

मुझे लगता है कि आप विंडोज 8.1 सिस्टम पर ड्राइवर का परीक्षण कर रहे हैं? सवाल नहीं कहता है। –

उत्तर

3

विंडोज 8+ लोड निष्पादन योग्य छवि के लिए सुरक्षा कुकी उत्पन्न करने में सक्षम है। PE हेडर में LoadConfig डेटा निर्देशिका में सुरक्षा कुकी का स्थान संग्रहीत किया जाता है ताकि विंडोज लोडर इसे आसानी से बदल सके।
कारण यह है कि ओएस सुरक्षित तरीके से कुकी उत्पन्न करने में सक्षम होना चाहिए (उदाहरण के लिए RDRAND निर्देश का उपयोग कर उपलब्ध है और/या अन्य यादृच्छिक एंट्रॉपी स्रोत)। इसके अलावा प्रत्येक ड्राइवर को कुकी प्रारंभिकरण कोड की प्रतिलिपि बनाने की आवश्यकता नहीं है।

यदि आपका ड्राइवर विंडोज 8 (और नया) को लक्षित करता है तो यह उम्मीद करता है कि ओएस कुकी शुरू करेगा। इसलिए यदि कुकी नहीं बदला गया तो यह BSOD बढ़ाता है।
दूसरी तरफ यदि आपका ड्राइवर पुराने ओएस (विंडोज 7) को लक्षित करता है, तो कंपाइलर को उस कोड को उत्पन्न करना होता है जो कुकी को प्रारंभ करता है यदि यह पहले से ही ओएस द्वारा प्रारंभ नहीं किया गया था। इस तरह ड्राइवर सभी विंडोज संस्करणों के साथ संगत है।

मैं इस Windows 8 सुविधा के किसी भी अधिकारी विवरण नहीं मिला है, लेकिन यहाँ लेख का वर्णन करता है:
Reversing Windows8: Interesting Features of Kernel Security

जब कर्नेल ड्राइवर लोड हो रहा है, Windows 8 सुरक्षा कुकी उत्पन्न करने के लिए MiProcessLoadConfigForDriver कॉल , पीई में पुरानी सुरक्षा कुकी का पता लगाता है और इसे बदल देता है।

नए विंडोज 8 कर्नेल ड्राइवर जांचेंगे कि क्या उनकी सुरक्षा कुकीज़ पहले से ही प्रतिस्थापित है या नहीं।

2
जो लोग दृश्य स्टूडियो 2015 में ड्राइवरों निर्माण के लिए

आप अपने ड्राइवर की जरूरत है विंडोज 7.

  1. आप Windows 10 एसडीके और मिलान WDK (संशोधन से मेल खाना चाहिए) की जरूरत के साथ संगत होना करने के लिए।
  2. अपने ड्राइवर प्रोजेक्ट में डिफ़ॉल्ट लक्ष्य प्लेटफ़ॉर्म संस्करण i.e. 10.x.x.x और डिफ़ॉल्ट प्लेटफ़ॉर्म टूलसेट यानी WindowsKernelModeDriver10 का उपयोग करें। यहां कुछ भी मत बदलें। और _WIN32_WINNT परिभाषा को स्पर्श न करें।
  3. प्लेटफार्म ड्राइवर सेटिंग्स - सामान्य पर निर्दिष्ट है। वहां आप लक्ष्य ओएस संस्करण - विंडोज 7, लक्ष्य प्लेटफार्म - डेस्कटॉप निर्दिष्ट करते हैं। और केवल यह एक। यदि आप विंडोज 8 या विंडोज 8.1 निर्दिष्ट करते हैं, तो यह अभी भी सुरक्षा कुकी चेक कोड में क्रैश होने जा रहा है।

पेज। ड्राइवर अभी भी विंडोज 10, 8.1 और 8. के ​​साथ संगत होगा।

संबंधित मुद्दे