तीन लघु विंडोज रजिस्ट्री कहानियां

शुभ दोपहर, प्रिय पाठकों।

रजिस्ट्री सबसे दृश्यमान और महत्वपूर्ण विंडोज सिस्टम में से एक है। शायद ही कोई ऐसा व्यक्ति हो जिसने उसके बारे में न सुना हो। लगभग 20 वर्षों से विंडोज के तहत प्रोग्रामिंग कर रहा था, मुझे लगा कि मुझे उसके बारे में सब कुछ पता है। लेकिन समय-समय पर, कुछ नया दिखाई देता है जो मुझे दिखाता है कि मैं कितना गलत था। इसलिए, आज मैं आपको रजिस्ट्री के साथ काम करने के असामान्य तरीकों के बारे में बताना चाहता हूं जो मुझे रूटकिट पर शोध करते समय मिले थे और जिसने मुझे आश्चर्यचकित किया।


पहली कहानी। रजिस्ट्री मान और कुंजियों के नाम


हम सभी जानते हैं कि विंडोज में वस्तुओं के नामकरण के लिए कुछ नियम हैं, चाहे वह फाइलें हों, निर्देशिकाएं हों, या रजिस्ट्री कुंजियां हों। फ़ाइल नामों में "\" वर्ण नहीं हो सकता है। नाम खाली नहीं हो सकते। नामों में कुछ लंबाई प्रतिबंध आदि हैं।

अनजाने में हम सभी विंडोज सिस्टम के लिए इन प्रतिबंधों का विस्तार करते हैं और रजिस्ट्री के साथ काम करते समय उनका निरीक्षण करते हैं। और यहाँ हमारी गलती है। नाम बनाते समय रजिस्ट्री पर आश्चर्यजनक रूप से कुछ प्रतिबंध हैं। उदाहरण के लिए, मानों के नाम पर आप वर्ण "\" का उपयोग कर सकते हैं


आश्चर्य? नहीं? तब आप क्या कहेंगे अगर मैं आपको दिखाऊं कि मूल्य के नाम पर "\" का उपयोग किया जा सकता है? हाँ, हाँ, बिल्कुल अशक्त चरित्र। वह जो परंपरागत रूप से एक पंक्ति के अंत को इंगित करने के लिए उपयोग किया जाता है।

इसके लिए, हमें ntdll.dll से निर्यात किए गए NtSetValueKey फ़ंक्शन की आवश्यकता है

HKEY hKey = 0; RegOpenKeyA( HKEY_LOCAL_MACHINE, "Software\\Microsoft\\Windows\\CurrentVersion\\Run", &hKey); UNICODE_STRING uName; uName.Buffer = L"Test\0Zero"; uName.MaxLen = uName.Length = 9 * sizeof(wchar_t); NTSTATUS status = 0; status = NtSetValueKey( hKey, &uName, 0, REG_SZ, (void*)lpData, DataSize); RegCloseKey(hKey); 

NtSetValueKey फ़ंक्शन को निष्पादित करने के लिए, आपको व्यवस्थापक अधिकारों की आवश्यकता है। परिणामस्वरूप, आपकी रजिस्ट्री में Test \ 0Zero नाम का मान दिखाई देगा।

कुछ Microsoft डेवलपर्स भी आश्चर्यचकित होंगे, क्योंकि मानक रजिस्ट्री संपादक ऐसे असामान्य रजिस्ट्री मान को प्रदर्शित नहीं कर सकता है।


दूसरी कहानी


दूसरी कहानी जो मैं आपको बताऊंगा आज २०१३ में हुई।

पहले एक छोटा सा विषयांतर। Kaspersky Lab में, मैं टीम का एक सदस्य हूं, जो अन्य चीजों के साथ, Kaspersky Rescue Disk बनाता है। लिनक्स के तहत विंडोज को ठीक करने के लिए, हमें स्वयं रजिस्ट्री फ़ाइलों को पार्स करने की आवश्यकता है। और इस तंत्र के सही संचालन की जांच करने के लिए, हम कई परीक्षणों का उपयोग करते हैं। उनमें से, एक काफी सरल है:

  • विंडोज के तहत, हम रजिस्ट्री में परीक्षण मान लिखते हैं।
  • परीक्षण निर्देशिका के लिए रजिस्ट्री हाइव फ़ाइल की प्रतिलिपि बनाएँ।
  • हम प्रोग्राम शुरू करते हैं जो परीक्षण मूल्यों को हटाने का कार्य करता है।
  • हम हटाने को सत्यापित करने के लिए रजिस्ट्री में संशोधित बुश लोड करते हैं।

और एक ठीक दिन, हमने विंडोज टेस्ट बेंच पर संस्करण 8.1 पर अपडेट किया, और परीक्षण ने परीक्षण मूल्यों को हटाना बंद कर दिया। कैसे, मैं हैरान था। मैंने अपने काम करने वाले कंप्यूटर पर रजिस्ट्री हाइव के साथ फाइल को कॉपी किया - कोई मूल्य नहीं! मेरा पहला विचार: मुझे फ्लश परीक्षण में परिवर्तित कुंजी जोड़ने की आवश्यकता है। RegFlushKey में एक कॉल जोड़ा गया, परीक्षण को फिर से शुरू किया - कोई मूल्य नहीं!

क्या RegFlushKey काम नहीं कर रहा है, मैंने सोचा। लेकिन, जैसा कि यह निकला, मैं केवल आंशिक रूप से सही था।

चाल यह थी कि विंडोज 8.1 में, माइक्रोसॉफ्ट ने रजिस्ट्री में परिवर्तन को बचाने के लिए तंत्र को बदल दिया। पहले, सभी रजिस्ट्री परिवर्तन मेमोरी में जमा हो गए थे, और फिर, जब कुंजी को बंद कर दिया गया था, जब RegFlushKey को निष्पादित किया गया था या कुछ समय बाद सिस्टम ने रजिस्ट्री हाइव फ़ाइल में परिवर्तन सहेजे थे। विंडोज 8.1 में, रजिस्ट्री बुश फ़ाइल के बजाय परिवर्तनों को उसी नाम की फ़ाइलों में एक्सटेंशन .LOG, .LOG1 और .LOG2 के साथ सहेजा जाता है, और मेरे कोड ने उन दिनों में इन फ़ाइलों को अनदेखा कर दिया था।

इन फ़ाइलों में, लगभग एक घंटे के लिए परिवर्तन जमा होते हैं। और उसके बाद ही, विंडोज मुख्य फाइल में परिवर्तन को एकीकृत करने का कार्य शुरू करता है। इस कार्य को रिकंसीलेशन कहा जाता है, और यह हर 40 मिनट में शुरू होता है, या जब विंडोज बंद हो जाता है। RegFlushKey फ़ंक्शन को कॉल करना सुलह कार्य को ट्रिगर नहीं करता है। परिवर्तन एकीकरण कार्य को प्रारंभ करने के लिए बाध्य करने के लिए, आपको ZwSetSystemInformation को अनिर्दिष्ट तर्क SystemRegistryReconciliationInformation के साथ कॉल करने की आवश्यकता है।

 ZwSetSystemInformation( 0x9b, //SystemRegistryReconciliationInformation NULL, 0); 

ZwSetSystemInformation फ़ंक्शन को निष्पादित करने के लिए, आपको व्यवस्थापक अधिकारों की आवश्यकता है। और निष्पादन योग्य फ़ाइल की वास्तुकला को सिस्टम की वास्तुकला से मेल खाना चाहिए। 64-बिट विंडोज पर 32-बिट प्रोग्राम से इस फ़ंक्शन को कॉल करना विफल हो जाएगा।

तीसरी कहानी


कुछ समय पहले, हमने एक रूटकिट की खोज की जिसने रजिस्ट्री में अपने ड्राइवर के लॉन्च को निर्धारित किया। हमारे उत्पादों ने संबंधित रजिस्ट्री कुंजियों को हटा दिया, लेकिन रिबूट के बाद चाबियाँ अपने स्थानों पर थीं। ऐसा लगता है कि वह रजिस्ट्री परिवर्तन पर अपने कॉलबैक फ़ंक्शन डालता है और हमारे परिवर्तनों के बाद अपनी कुंजी को पुनर्स्थापित करता है, मैंने सोचा। लेकिन यह पता चला कि नहीं। अधिक ठीक है, हाँ। रूटकिट ने कॉलबैक फ़ंक्शंस को सेट किया, लेकिन कुंजी रिकवरी के कार्य से उनका कोई लेना देना नहीं था। सब कुछ सरल और अधिक सुरुचिपूर्ण बनाया गया था।

रूटकिट ड्राइवर, स्टार्टअप पर, सिस्टम रजिस्ट्री हाइव फ़ाइल का नाम बदलकर HARDWARE है। मैंने अपनी सिस्टम फ़ाइल बनाई और समय-समय पर एचकेएलएम / सिस्टम ब्रांच को RegSaveKey फ़ंक्शन का उपयोग करके सहेजा। बचत करते समय, उन्होंने अपनी चाबियों को बहाल किया। विंडोज को पुनरारंभ करते समय, सिस्टम ने सिस्टम फाइल को लोड किया और रूटकिट ड्राइवर को लॉन्च किया। क्या यह सुंदर है? खूबसूरती से।

वांटेड


पुनश्च हम तो देखने के लिए डेवलपर और शोधकर्ता टीम है कि आरी एंटी-स्पैम इंजन, लेकिन अभी भी एक जरूरत पर सॉफ्टवेयर परीक्षण इंजीनियर

Source: https://habr.com/ru/post/hi415699/


All Articles