
Windows अनुप्रयोगों में क्रैश का पता लगाएं, उनका विश्लेषण करें और उन्हें विशिष्ट रूप से पहचानें
एप्लिकेशन बगों का पता लगाएं, उनका विश्लेषण करें और उन्हें विशिष्ट रूप से पहचानें।
क्या आप...
...तो BugId आपके लिए हो सकता है!
BugId का उपयोग करने के लिए, कृपया निम्नलिखित सॉफ़्टवेयर डाउनलोड और इंस्टॉल करें:
यदि आप Python और Debugging Tools for Windows को उनकी डिफ़ॉल्ट सेटिंग्स के साथ इंस्टॉल करते हैं, तो BugId को बिना किसी सेटिंग को समायोजित किए चलने में सक्षम होना चाहिए। आप BugId को अपने स्थानीय फ़ाइल सिस्टम पर कहीं भी अनज़िप कर सकते हैं।
BugId शुरू करने से पहले, आपको लक्षित एप्लिकेशन में full page heap सक्षम करना चाहिए।
यह कुछ Global Flags सेट करके प्रति बाइनरी किया जा सकता है। ऐसा करने का सबसे आसान तरीका BugId के
साथ आने वाली pageheap.cmd स्क्रिप्ट का उपयोग करना है। उदाहरण के लिए, notepad के लिए full page heap सक्षम करने
के लिए, निम्न कमांड चलाएँ:
C:\BugId>pageheap notepad.exe ON
(ध्यान दें कि यह कमांड मशीन तक प्रशासनिक पहुंच वाले एक उन्नत कमांड-प्रॉम्प्ट से चलाया जाना चाहिए)।
चीजों को और भी आसान बनाने के लिए, pageheap.cmd में ज्ञात एप्लिकेशन की एक सूची है। आप
उनमें से किसी एक के लिए उसका नाम प्रदान करके full page heap सक्षम या अक्षम कर सकते हैं, जैसे
pageheap msie ON Microsoft Internet Explorer के लिए full page heap सक्षम करता है। कमांड-लाइन आर्गुमेंट्स के बारे में अधिक जानकारी पाने के लिए
pageheap /? का उपयोग करें।
इस बिंदु पर, आप परीक्षण करना चाह सकते हैं कि BugId सही ढंग से काम कर रहा है या नहीं। हम इसे
BugId में एक एप्लिकेशन चलाकर और उसे क्रैश करके कर सकते हैं, ताकि यह देखा जा सके कि BugId बग की
सही रिपोर्ट करता है या नहीं। इस परीक्षण के लिए उपयोग करने के लिए एक अच्छा एप्लिकेशन rundll32.exe है, जो
सभी Windows इंस्टॉलेशन में Windows फ़ोल्डर के system32 उप-फ़ोल्डर में पाया जाता है
(%WinDir%). इसका उपयोग स्थानीय फ़ाइल सिस्टम पर पाई जाने वाली किसी भी dll को लोड करने और
एक निश्चित कॉल प्रारूप के साथ इस dll में एक निर्यातित फ़ंक्शन को कॉल करने के लिए किया जा सकता है।
system32 फ़ोल्डर में कई dll हैं जो फ़ंक्शन निर्यात करती हैं। इनमें से अधिकांश निर्यातित फ़ंक्शन
पूरी तरह से अलग प्रारूप में आर्गुमेंट्स की अपेक्षा करते हैं, जो rundll32 प्रदान करेगा, जिससे
एप्लिकेशन क्रैश हो जाता है।
पहले हमें निम्न कमांड के साथ rundll32 में full page heap चालू करना होगा:
C:\BugId>pageheap rundll32.exe ON
इसके बाद हम BugId शुरू करेंगे और इसे ऐसे आर्गुमेंट्स के साथ rundll32 शुरू करने के लिए कहेंगे जो इसे
advapi32.dll लोड करने और CloseThreadWaitChainSession कॉल करने का निर्देश देते हैं। इस लेखन के
समय यह एक तथाकथित NULL pointer access violation का कारण बनता है, जिसे BugId को
पहचानना और रिपोर्ट करना चाहिए।
C:\BugId>BugId.cmd %WinDir%\system32\rundll32.exe -- advapi32 CloseThreadWaitChainSession
ध्यान दें कि rundll32.exe और उसे पारित आर्गुमेंट्स के बीच एक -- है।
ऐसा इसलिए है क्योंकि आप BugId और उस एप्लिकेशन दोनों को आर्गुमेंट्स प्रदान करना चाह सकते हैं
जिसे आप परीक्षण करना चाहते हैं। आर्गुमेंट्स के इन दो सेटों को कमांड-लाइन पर -- द्वारा
अलग किया जाना चाहिए। -- से पहले की हर चीज़ BugId द्वारा संभाली जाती है और
उसके बाद की हर चीज़ BugId द्वारा अनदेखी की जाती है लेकिन एप्लिकेशन को पारित कर दी जाती है।
यदि सब कुछ ठीक है, तो BugId का आउटपुट इस प्रकार दिखेगा:
* Command line: C:\WINDOWS\system32\rundll32.exe advapi32 CloseThreadWaitChainSession
+ Main process 8024/0x1F58 (rundll32.exe): Attached; command line = C:\WINDOWS\system32\rundll32.exe advapi32 CloseThreadWaitChainSession.
,-- A bug was detect in the application ----------------------------------------
| Id @ Location: AVR@NULL a1f.904 @ rundll32.exe!advapi32.dll!WctRemoveEntry
| Description: Access violation while reading memory at 0x0 using a NULL pointer.
| Security impact: Denial of Service
| Version: rundll32.exe 10.0.16299.15 (x64)
| advapi32.DLL 10.0.16299.15 (x64)
| Bug report: AVR@NULL a1f.904 @ rundll32.exe!advapi32.dll!WctRemoveEntry.html (60703 bytes)
'-------------------------------------------------------------------------------
पहली पंक्ति आपको बताती है कि BugId कौन सी कमांड-लाइन शुरू करने जा रहा है। दूसरी
पंक्ति आपको बताती है कि इसने प्रोसेस id 8024 के साथ एक नया प्रोसेस बनाया, जो
rundll32.exe चला रहा है और इस प्रोसेस के लिए कमांड लाइन (जो निश्चित रूप से
पहली पंक्ति के समान है)। एप्लिकेशन शुरू करने के तुरंत बाद, एक बग का पता चला।
BugId ने इस बग के लिए एक अद्वितीय id (AVR@NULL a1f.904) उत्पन्न की और
बताया कि इसका स्थान rundll32.exe द्वारा लोड की गई advapi32.dll dll के
WctRemoveEntry फ़ंक्शन में है। चूंकि NULL pointer क्रैश सामान्यतः केवल
एप्लिकेशन को क्रैश करने के अलावा शोषण योग्य नहीं होते हैं, इसलिए बग का
सुरक्षा प्रभाव Denial of Service है। BugId डिफ़ॉल्ट रूप से अपने द्वारा पाए जाने वाले
हर बग के लिए एक HTML स्वरूपित रिपोर्ट उत्पन्न करता है और आपको वह स्थान बताता है जहाँ यह
रिपोर्ट संग्रहीत की गई थी। जैसा कि आप देख सकते हैं, रिपोर्ट का फ़ाइल नाम
बग id और स्थान पर आधारित है।
BugId द्वारा उत्पन्न प्रत्येक बग id में एक स्थान से अलग किए गए दो भाग होते हैं।
पहला भाग बग के प्रकार का वर्णन करता है। उपरोक्त उदाहरण में, AVR@NULL, इसका
अर्थ है Access Violation Reading memory at address NULL (यानी पते NULL पर मेमोरी पढ़ने में एक्सेस उल्लंघन)।
दूसरा भाग बग के स्थान का वर्णन करता है; इसमें एक बिंदु से अलग किए गए दो छोटे हैश होते हैं।
ये हैश स्टैक पर उन शीर्ष फ़ंक्शनों से गणना किए जाते हैं जिन्हें बग से प्रासंगिक माना जाता है।
उदाहरण में, a1f.904 में a1f (advapi32.dll!WctRemoveEntry से गणना किया गया)
और 904 (advapi32.dll!CloseThreadWaitChainSession से गणना किया गया)
शामिल हैं।
यदि आप वही कमांड फिर से चलाते हैं, तो BugId बिल्कुल वही BugId रिपोर्ट करेगा, क्योंकि इससे बिल्कुल उसी कोड में बिल्कुल वही बग उत्पन्न होना चाहिए।
बधाई हो! अब आप BugId के साथ अपने स्वयं के क्रैश का परीक्षण करने के लिए तैयार हैं, लेकिन
आप किसी समय BugId.cmd --help चलाना चाह सकते हैं ताकि BugId द्वारा समर्थित कई अलग-अलग
कमांड-लाइन विकल्पों के बारे में जानकारी प्राप्त कर सकें।
BugId को fuzzing के दौरान बड़ी संख्या में एप्लिकेशनों पर विकसित और परीक्षण किया गया है, ताकि सैकड़ों विभिन्न बगों के कारण होने वाले सैकड़ों हजारों क्रैश का विश्लेषण किया जा सके। इस भूमिका में यह बहुत कम गलत सकारात्मक और नकारात्मक दर के साथ बगों का विश्लेषण करने में अत्यंत सटीक साबित हुआ है; दोनों दरें 1% से कम हैं।
बेशक, सभी प्रकार के बगों का पता लगाना और विश्लेषण करना आसान नहीं है। कुछ बगों का वर्तमान में उनके घटित होने के समय विश्वसनीय रूप से पता नहीं लगाया जा सकता है, लेकिन वे बहुत बाद में पूरी तरह से असंबंधित कोड में क्रैश का कारण बनते हैं, जिससे पूरी तरह से गलत विश्लेषण होता है। ऐसे मामलों में, एक ही बग को बार-बार पुन: उत्पन्न करने से कई अलग-अलग बग ids प्राप्त होंगी क्योंकि एप्लिकेशन अलग-अलग समय पर अलग-अलग तरीकों से क्रैश होता है। यह सुनिश्चित करने के लिए कि ऐसा नहीं है, आपको सलाह दी जाती है कि अपने टेस्ट केस को BugId में कई बार चलाएँ ताकि यह देखा जा सके कि बग id समान रहती है या नहीं।
अन्य बग ऐसे क्रैश का कारण बनते हैं जो एक अलग प्रकार के बग के कारण हुए प्रतीत होते हैं। इसके परिणामस्वरूप गलत विश्लेषण और बग ids हो सकती हैं। विशेष रूप से, C/C++ कोड में bad casts (गलत प्रकार-रूपांतरण) के परिणामस्वरूप होने वाले बगों का वर्तमान में BugId द्वारा पता लगाना और रिपोर्ट करना असंभव है। वे विभिन्न प्रकार के क्रैश का कारण बन सकते हैं; सबसे आम रूप से एक्सेस उल्लंघन जब किसी ऑब्जेक्ट के गुणों में संग्रहीत मानों को गलत तरीके से पॉइंटर्स के रूप में उपयोग किया जाता है। यदि आपको संदेह है कि bad casts क्रैश का कारण हो सकते हैं, तो आपको यह सुनिश्चित करने के लिए BugId द्वारा किए गए विश्लेषण की दोबारा जाँच करनी चाहिए कि यह सही है।
BugId, heap से संबंधित बड़ी संख्या में बगों का पता लगाने और उनका विश्लेषण करने में सक्षम होने के लिए एप्लिकेशन द्वारा उपयोग किए जाने वाले full page heap पर अत्यधिक निर्भर है। इसका मतलब है कि यह उन एप्लिकेशनों में बगों का पता लगाने और उनका विश्लेषण करने में बहुत कम प्रभावी होगा जो अपने स्वयं के आंतरिक heap प्रबंधक का उपयोग करते हैं जो मानक Windows heap पर निर्भर नहीं होता है।
BugId के पास वाणिज्यिक और गैर-वाणिज्यिक उपयोग के लिए एक निःशुल्क 30-दिवसीय परीक्षण अवधि है।
इस परीक्षण अवधि के दौरान यह कार्य एक
[Creative Commons Attribution-NonCommercial 4.0 International License](http://creativecommons.org/licenses/by-nc/4.0/) के अंतर्गत लाइसेंस प्राप्त है।
परीक्षण अवधि के बाद, सशुल्क लाइसेंस license.skylined.nl पर प्राप्त किया जाना चाहिए, यदि आप BugId का उपयोग जारी रखना चाहते हैं।
गैर-वाणिज्यिक लाइसेंस बहुत छोटे शुल्क पर उपलब्ध हैं; बस मेरे खर्चों को वहन करने के लिए पर्याप्त। व्यक्तिगत सुरक्षा शोधकर्ताओं के लिए वाणिज्यिक लाइसेंस भी भारी छूट पर उपलब्ध हैं।
यदि आपके पास लाइसेंसिंग के बारे में कोई प्रश्न हैं, या थोक-छूट पर चर्चा करना चाहते हैं, तो कृपया [email protected] से संपर्क करें।
BugId में एक परीक्षण अवधि है ताकि आप इसकी उपयोगिता का आकलन कर सकें। यदि आप परीक्षण अवधि समाप्त होने के बाद BugId का उपयोग जारी रखना चाहते हैं, तो मैं अनुरोध करता हूँ कि आप BugId पर मेरे काम और लाइसेंस अनुरोध के प्रबंधन के लिए एक छोटा सा शुल्क योगदान करें। यदि आप BugId का व्यावसायिक रूप से उपयोग कर रहे हैं, तो मैं अनुरोध करता हूँ कि आप BugId के अपने उपयोग से होने वाले कुछ लाभ को साझा करने के लिए एक नियमित लाइसेंस शुल्क का भुगतान करें।