ट्रांसेक्शनल NTFS के साथ किसी भी प्रक्रिया का काम कैसे करें: विंडोज के लिए सैंडबॉक्स लिखने का मेरा पहला कदम

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


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


चलो फिर विंडोज इंटर्नल के बारे में बात करते हैं, एक नया टूल आज़माते हैं, और एक सवाल का जवाब देते हैं: सैंडबॉक्स के साथ इसका क्या करना है?


कोष


जो लोग अभी से प्रयोग करना शुरू करना चाहते हैं, वे GitHub: TransactionMaster पर परियोजना के पृष्ठ पर स्वागत करते हैं।


सिद्धांत


Windows Vista में ट्रांसेक्शनल NTFS, जिसे TxF के रूप में भी जाना जाता है, का परिचय, सिस्टम स्थिरता बनाए रखने और इसलिए, स्थिरता की दिशा में एक क्रांतिकारी कदम था। डेवलपर्स के लिए सीधे इस कार्यक्षमता को उजागर करके, Microsoft ने सॉफ़्टवेयर को स्थापित करने और अद्यतन करने के लिए जिम्मेदार सभी घटकों में नाटकीय रूप से त्रुटि को सरल बनाना संभव बना दिया। सभी संभव फ़ाइल-सिस्टम विफलताओं के लिए एक बैकअप योजना बनाए रखने का कार्य खुद ओएस का काम बन गया, जिसने मांग पर एक पूर्ण-विशेषताओं वाले एसीआईडी शब्दार्थ प्रदान करना शुरू कर दिया।


इस नए उपकरण को प्रदान करने के लिए, Microsoft ने API फ़ंक्शन का एक सेट पेश किया, जो मौजूदा कार्यक्षमता को दोहराता है, लेकिन लेनदेन के संदर्भ में। लेन-देन अपने आप में एक नई कर्नेल ऑब्जेक्ट बन गई है, जो मौजूदा फ़ाइलों जैसे फाइलों, प्रक्रियाओं और सिंक्रनाइज़ेशन प्राइमरी के साथ है। सरलतम परिदृश्य में, अनुप्रयोग CreateTransaction का उपयोग करके एक नया लेनदेन बनाता है, आवश्यक ऑपरेशन ( CreateFileTransacted , MoveFileTransacted , DeleteFileTransacted , आदि) करता है, और फिर CreateTransaction / CreateTransaction साथ इसे वापस करता या रोल करता है।


आइए इन नए कार्यों की वास्तुकला पर एक नज़र डालें। हम जानते हैं, कि kernel32.dll जैसे पुस्तकालयों की आधिकारिक एपीआई परत सीधे कर्नेल को नहीं बुलाती है, लेकिन मापदंडों को परिवर्तित करती है और इसके बजाय ntdll.dll को कॉल करती है। जो तब, एक syscall जारी करता है। हैरानी की बात यह है कि कॉल के एनडीटीएल और कर्नेल दोनों तरफ किसी भी अतिरिक्त- ट्रांसएक्टेड फ़ंक्शन का कोई संकेत नहीं है।


एपीआई परतों

इन मूल API फ़ंक्शन की परिभाषा दशकों में नहीं बदली है, इसलिए लेनदेन को निर्दिष्ट करने के लिए कोई अतिरिक्त पैरामीटर नहीं है। कर्नेल को कैसे पता चलता है कि किसका उपयोग करना है? जवाब सरल है, फिर भी आशाजनक है: प्रत्येक थ्रेड में एक निर्दिष्ट फ़ील्ड है, जहां यह वर्तमान लेनदेन को संभालता है। यह चर TEB - थ्रेड एनवायर्नमेंटल ब्लॉक नामक मेमोरी के एक विशिष्ट क्षेत्र में रहता है। यहाँ पर स्थित अन्य प्रसिद्ध क्षेत्रों के लिए, मैं अंतिम त्रुटि कोड और थ्रेड आईडी को नाम दे सकता हूँ।


इसलिए, -Transacted प्रत्यय के साथ सभी फ़ंक्शन TEB में वर्तमान लेनदेन फ़ील्ड सेट करते हैं, संबंधित गैर-ट्रांज़ैक्ड API को कॉल करते हैं, और पिछले मान को पुनर्स्थापित करते हैं। इस लक्ष्य को प्राप्त करने के लिए, वे RtlSetCurrentTransaction से ntdll / RtlSetCurrentTransaction नामक बहुत सीधे रूटीन की एक जोड़ी का उपयोग करते हैं। वे अमूर्तता का एक पर्याप्त स्तर प्रदान करते हैं, जो कि बाद में और अधिक, वाह के मामले में काम आता है।


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


नुकसान


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


थ्रेड-ट्रैकिंग डीएल


सौभाग्य से, थ्रेड निर्माण के बारे में तुल्यकालिक सूचनाएं प्राप्त करना लक्ष्य प्रक्रिया के संदर्भ में बेहद सरल है। हमें बस एक डीएलएल को तैयार करने की आवश्यकता है, जो वर्तमान लेनदेन को नए थ्रेड्स में प्रसारित करता है, ntdll से मॉड्यूल लोडर बाकी को संभाल लेगा। हर बार * एक नया धागा प्रक्रिया में आता है, यह DLL_THREAD_ATTACH पैरामीटर के साथ हमारे प्रवेश-बिंदु को ट्रिगर करेगा। इस कार्यक्षमता को लागू करके, मैंने विभिन्न कार्यक्रमों के एक पूरे समूह के साथ संगतता तय की।


* कड़ाई से बोलते हुए, यह कॉलबैक हर संभव स्थिति में नहीं होता है। अब और फिर, आप एक या दो सहायक थ्रेड्स को लेन-देन के बिना चारों ओर लटका देखेंगे। ज्यादातर समय, ये मॉड्यूल लोडर के काम करने वाले पूल से ही थ्रेड होते हैं। इसका कारण, डीएलएल नोटिफिकेशन लोडर लॉक के तहत होता है, जो विभिन्न मॉड्यूल को लोड करने की क्षमता सहित कई प्रकार की सीमाओं का पता लगाता है। और यह वास्तव में क्या इस तरह के धागे को पूरा करने की जरूरत है, इस बीच फ़ाइल का उपयोग समानांतर। इसलिए, डेडलॉक को रोकने के लिए एक अपवाद मौजूद है: यदि कॉलर THREAD_CREATE_FLAGS_SKIP_THREAD_ATTACH की मदद से थ्रेड बनाते समय THREAD_CREATE_FLAGS_SKIP_THREAD_ATTACH ध्वज निर्दिष्ट करता है, तो DLL- सूचना कॉलबैक ट्रिगर नहीं होता है।


विंडोज एक्सप्लोरर शुरू करना


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


इस प्रकार, मैंने एक नई प्रक्रिया बनाते समय तुरंत DLL इंजेक्शन करने का विकल्प लागू किया। और यह दुर्घटनाग्रस्त होने को ठीक करने के लिए पर्याप्त निकला। हालाँकि, चूंकि एक्सप्लोरर गहन रूप से प्रक्रिया COM, पूर्वावलोकन, और कुछ अन्य सुविधाओं का उपयोग करता है, जो अभी भी संशोधित फ़ाइलों पर काम नहीं करते हैं।


WoW64 के बारे में क्या?


संगतता लाभ जो विंडोज-ऑन-विंडोज 64-बिट सबसिस्टम प्रदान करता है, ईमानदारी से उल्लेखनीय है। हालाँकि, सिस्टम की प्रोग्रामिंग के दौरान इसकी बारीकियों को ध्यान में रखना अक्सर थकाऊ हो जाता है। पहले मैंने उल्लेख किया था, कि Rtl[Get/Set]CurrentTransaction का व्यवहार इस मामले में थोड़ा अधिक जटिल हो जाता है। चूंकि इस तरह की प्रक्रियाएं बाकी प्रणाली की तुलना में बिंदुओं के एक विशिष्ट आकार के साथ काम करती हैं, प्रत्येक WoW64 धागा इसके साथ जुड़े दो TEB को बनाए रखता है: ओएस खुद ही यह उम्मीद करता है कि उसके पास 64-बिट एक है, और आवेदन के लिए 32-बिट की आवश्यकता है सही ढंग से काम करने के लिए। और फिर भी, कर्नेल के दृष्टिकोण से, देशी TEB पूर्वता लेता है, इन कार्यों में कुछ अतिरिक्त कोड होता है ताकि संबंधित मान हमेशा मेल खाते रहें। वैसे भी, नई कार्यक्षमता को लागू करते समय इन सभी विशिष्टताओं को ध्यान में रखना आवश्यक है।


अनसुलझी समस्याएं


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


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


सैंडबॉक्सिंग के साथ क्या है?


इस स्क्रीनशॉट को नीचे देखें। आप एक ही फ़ोल्डर की सामग्री पर पूरी तरह असहमत तीन कार्यक्रम देख सकते हैं। वे सभी तीन अलग-अलग लेनदेन के अंदर काम करते हैं। एसीआईडी ​​शब्दार्थ में अलगाव की शक्ति है।


लेन-देन अलगाव

मेरा कार्यक्रम सैंडबॉक्स नहीं है जो भी हो; इसमें एक महत्वपूर्ण टुकड़े का अभाव है - एक सुरक्षा सीमा । मुझे पता है कि कुछ कंपनियां अभी भी समान उत्पादों को बेचने का प्रबंधन करती हैं, उन्हें असली सैंडबॉक्स के रूप में पेश करती हैं, उन पर शर्म आती है, मैं क्या कह सकता हूं। और आप सोच सकते हैं: आप इसे कभी भी सैंडबॉक्स कैसे बना सकते हैं, यहां तक ​​कि एक डिबगर होने के नाते आप किसी प्रक्रिया को एक चर को संशोधित करने से रोक नहीं सकते हैं जो लेनदेन को नियंत्रित करता है, यह सब के बाद इसकी मेमोरी में रहता है। पर्याप्त रूप से, यही कारण है कि मुझे अपनी आस्तीन में एक और अद्भुत चाल चलनी है, जो अंततः मुझे इस परियोजना को पूरा करने में मदद करेगी और जिसे मैं अब तक प्रकट नहीं करूंगा। हां, मैं फाइल सिस्टम वर्चुअलाइजेशन के साथ पूरी तरह से उपयोगकर्ता-मोड सैंडबॉक्स बनाने की योजना बना रहा हूं। इस बीच, सैंडबॉक्स का उपयोग करें और AppContainers के साथ प्रयोग करते रहें । देखते रहो।


GitHub पर प्रोजेक्ट का भंडार: TransactionMaster

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


All Articles