
IDA Pro प्लगइन बाइनरी के भीतर क्वेरी-आधारित खोज के लिए, मुख्य रूप से भेद्यता अनुसंधान के लिए उपयोगी।
VulFi (Vulnerability Finder) उपकरण IDA Pro के लिए एक प्लगइन है जिसका उपयोग बाइनरी में बग शिकार के दौरान सहायता के लिए किया जा सकता है। इसका मुख्य उद्देश्य सबसे दिलचस्प फ़ंक्शनों (जैसे strcpy, sprintf, system, आदि) के सभी क्रॉस-रेफ़रेंस के साथ एक एकल दृश्य प्रदान करना है। ऐसे मामलों में जहाँ Hexrays डीकंपाइलर का उपयोग किया जा सकता है, यह उन कॉलों को बाहर करने का प्रयास करेगा जो भेद्यता अनुसंधान के दृष्टिकोण से दिलचस्प नहीं हैं (जैसे strcpy(dst,"Hello World!"))। डीकंपाइलर के बिना, नियम बहुत सरल होते हैं (आर्किटेक्चर पर निर्भर न होने के लिए) और इस प्रकार केवल सबसे स्पष्ट मामलों को बाहर करते हैं।
अपडेट पर अधिक जानकारी के लिए Changelog देखें।
vulfi.py, vulfi_prototypes.json और vulfi_rules.json फ़ाइलों को IDA प्लगइन फ़ोल्डर में रखें (cp vulfi* <IDA_PLUGIN_FOLDER>)।
VulFi चलाने से पहले सुनिश्चित करें कि आपको उस बाइनरी की अच्छी समझ है जिसके साथ आप काम कर रहे हैं। सभी मानक फ़ंक्शनों (strcpy, memcpy, आदि) की पहचान करने का प्रयास करें और उन्हें तदनुसार नाम दें। प्लगइन केस-असंवेदनशील है, इसलिए MEMCPY, Memcpy और memcpy सभी मान्य नाम हैं। हालाँकि, ध्यान दें कि फ़ंक्शन की खोज के लिए सटीक मिलान आवश्यक है। इसका मतलब है कि memcpy? या std_memcpy (या कोई अन्य प्रकार) को मानक फ़ंक्शन के रूप में नहीं पहचाना जाएगा और इसलिए संभावित भेद्यताओं की तलाश में उन पर विचार नहीं किया जाएगा। यदि आप किसी अज्ञात बाइनरी के साथ काम कर रहे हैं, तो आपको पहले कंपाइलर विकल्प Options > Compiler सेट करने होंगे। उसके बाद VulFi सभी स्पष्ट झूठी सकारात्मकताओं (जैसे किसी स्थिर स्ट्रिंग के साथ printf का कॉल) को फ़िल्टर करने की पूरी कोशिश करेगा। कृपया ध्यान दें कि जबकि प्लगइन किसी विशिष्ट आर्किटेक्चर से बंधे बिना बनाया गया है, कुछ प्रोसेसर प्रकार निर्दिष्ट करने के लिए पूर्ण समर्थन नहीं रखते हैं और ऐसे मामले में VulFi सभी क्रॉस-रेफ़रेंस को संभावित खतरनाक मानक फ़ंक्शनों के रूप में चिह्नित करेगा ताकि आप मैन्युअल विश्लेषण के साथ आगे बढ़ सकें। इन मामलों में, आप प्लगइन की ट्रैकिंग सुविधाओं से लाभ उठा सकते हैं।
स्कैन शुरू करने के लिए, शीर्ष बार मेनू से Search > VulFi विकल्प चुनें। यह या तो एक नया स्कैन शुरू करेगा, या idb/i64 फ़ाइल में संग्रहीत पिछले परिणामों को पढ़ेगा। जब भी आप डेटाबेस सहेजते हैं तो डेटा स्वचालित रूप से सहेजा जाता है।
एक बार स्कैन पूरा हो जाने या पिछले परिणाम लोड हो जाने के बाद, निम्नलिखित कॉलम वाला एक दृश्य प्रस्तुत किया जाएगा:
Not Checked निर्दिष्ट किया गया है। अन्य स्थितियाँ False Positive, Suspicious और Vulnerable हैं। इन्हें किसी आइटम पर राइट-क्लिक मेनू का उपयोग करके सेट किया जा सकता है और किसी दिए गए फ़ंक्शन कॉल की मैन्युअल समीक्षा के परिणामों को प्रतिबिंबित करना चाहिए।High, Medium और Low हैं (उन मामलों के लिए Info भी जहां स्कैनर सभी मापदंडों को ठीक से पहचानने में सक्षम नहीं था)। प्राथमिकताएँ vulfi_rules.json फ़ाइल में अन्य नियमों के साथ परिभाषित की गई हैं।यदि idb/i64 फ़ाइल में कोई डेटा नहीं है या उपयोगकर्ता नया स्कैन करने का निर्णय लेता है, तो प्लगइन पूछेगा कि क्या उसे डिफ़ॉल्ट शामिल नियमों का उपयोग करके स्कैन चलाना चाहिए या क्या उसे एक कस्टम नियम फ़ाइल का उपयोग करना चाहिए। कृपया ध्यान दें कि पहले से मौजूद डेटा के साथ नया स्कैन चलाने से पहले से पाए गए आइटम, जो पिछले परिणामों वाले उसी नाम के नियम द्वारा पहचाने गए हैं, अधिलेखित नहीं होते हैं। इसलिए, स्कैन को फिर से चलाने से मौजूदा टिप्पणियाँ और स्थिति अपडेट नहीं हटती हैं।

VulFi दृश्य के भीतर राइट-क्लिक संदर्भ मेनू में, आप परिणामों से आइटम को हटा सकते हैं या सभी आइटम हटा सकते हैं। कृपया ध्यान दें कि यह ऑपरेशन करने के बाद कोई भी टिप्पणी या स्थिति अद्यतन खो जाएगी।
संस्करण 2.1 के अनुसार, VulFi एक साथ कई चयनित आइटमों पर किए गए संचालन का भी समर्थन करता है। यह कई आइटमों को एक निश्चित स्थिति के साथ चिह्नित करने, हटाने या कई पंक्तियों में समान टिप्पणी जोड़ने की अनुमति देता है। कभी-कभी ऐसा होता है कि ऑपरेशन सही ढंग से रिफ्रेश नहीं होता है। जब ऐसा होता है, तो UI को कुछ बार रिफ्रेश करें (Ctrl+U) जब तक आपको परिवर्तन दिखाई न दें।
जब भी आप किसी संभावित कमजोर फ़ंक्शन के पता लगाए गए उदाहरण का निरीक्षण करना चाहते हैं, तो वांछित पंक्ति में कहीं भी डबल-क्लिक करें और IDA आपको उस मेमोरी स्थान पर ले जाएगा जिसे संभावित रूप से दिलचस्प के रूप में पहचाना गया था। राइट-क्लिक और Set Vulfi Comment विकल्प का उपयोग करके आप दिए गए उदाहरण के लिए टिप्पणी दर्ज कर सकते हैं (उदाहरण के लिए स्थिति को सही ठहराने के लिए)।
प्लगइन कस्टम नियम बनाने की भी अनुमति देता है। ये नियम IDA इंटरफ़ेस में परिभाषित किए जा सकते हैं (एकल फ़ंक्शन के लिए आदर्श) या कस्टम नियम फ़ाइल के रूप में आपूर्ति की जा सकती है (उन नियमों के लिए आदर्श जो कई फ़ंक्शनों को कवर करने का लक्ष्य रखते हैं)।
जब आप किसी कस्टम फ़ंक्शन को ट्रेस करना चाहते हैं, जिसे विश्लेषण के दौरान पहचाना गया था, तो उसके बॉडी में कहीं भी राइट-क्लिक करें और Add <name> function to VulFi चुनें। आप वर्तमान डिसएसेंबली/डीकंपाइलर दृश्य में एक फ़ंक्शन नाम को हाइलाइट और राइट-क्लिक भी कर सकते हैं ताकि फ़ंक्शन बॉडी में स्विच करने से बचा जा सके।

कई नियमों के सेट के साथ एक कस्टम फ़ाइल लोड करना भी संभव है। नीचे दी गई संरचना के साथ एक कस्टम नियम फ़ाइल बनाने के लिए आप यहां शामिल टेम्पलेट फ़ाइल यहाँ का उपयोग कर सकते हैं।
[ // नियमों की एक सारणी
{
"name": "RULE NAME", // नियम का नाम
"function_names":[
"function_name_to_look_for" // सभी फ़ंक्शन नामों की सूची जो इस नियम में परिभाषित शर्तों के विरुद्ध मिलान किया जाना चाहिए
],
"wrappers":true, // उपरोक्त फ़ंक्शनों के रैपर भी देखें (ध्यान दें कि रैप किए गए फ़ंक्शन को भी नियम से मेल खाना चाहिए)
"mark_if":{
"High":"True", // यदि True पर मूल्यांकन होता है, तो प्राथमिकता High से चिह्नित करें (नीचे नियम देखें)
"Medium":"False", // यदि True पर मूल्यांकन होता है, तो प्राथमिकता Medium से चिह्नित करें (नीचे नियम देखें)
"Low": "False" // यदि True पर मूल्यांकन होता है, तो प्राथमिकता Low से चिह्नित करें (नीचे नियम देखें)
}
}
]
एक उदाहरण नियम जो फ़ंक्शन malloc के सभी क्रॉस-रेफ़रेंस को देखता है और जाँचता है कि क्या इसका पैरामीटर स्थिर नहीं है और क्या फ़ंक्शन का रिटर्न मान जाँचा गया है, नीचे दिखाया गया है:
{
"name": "Possible Null Pointer Dereference",
"function_names":[
"malloc"
],
"wrappers":false,
"mark_if":{
"High":"not param[0].is_constant() and not function_call.return_value_checked()",
"Medium":"False",
"Low": "False"
}
}
Loop Check - सभी लूपों को चिह्नित करता है। ऐसे मामले में param[0] लूप का काउंटर है (यदि पता चला) और param[1] वह शर्त है जिसके विरुद्ध लूप को समाप्त करने के लिए काउंटर की जाँच की जाती है।Array Access - सभी ऐरे एक्सेस को चिह्नित करता है। इस मामले में param[0] ऐरे है और param[1] इंडेक्स है।नियम बनाते समय वही फ़ंक्शन सामान्य फ़ंक्शन पैरामीटर के समान उपयोग किए जा सकते हैं (कुछ भी जो param[<index>] पर कॉल किया जा सकता है)।
param[<index>]: किसी फ़ंक्शन कॉल के पैरामीटर तक पहुँचने के लिए उपयोग किया जाता है (इंडेक्स 0 से शुरू होता है)function_call: फ़ंक्शन कॉल ईवेंट तक पहुँचने के लिए उपयोग किया जाता हैparam_count: एक फ़ंक्शन को पारित किए गए पैरामीटरों की संख्या रखता हैparam[<index>].is_constant()param[<index>].number_value()param[<index>].string_value()param[<index>].set_to_null_after_call()function_call.return_value_checked(<constant_to_check>)param[<index>].used_in_call_<before|after>(["function1","function2"])function_call.reachable_from("<function_name>")param[<index>].is_sign_compared()param[<index>].used_as_index()param[2].number_value() > 5"%s" in param[1].string_value()not param[1].is_constant()function_call.return_value_checked(param_count)function_call.return_value_checked()all(not p.is_constant() for p in param[2:])any(p.is_constant() for p in param)Truestrlen से जाँच नहीं की गई है: not param[1].is_constant() and not param[1].used_in_call_before(["strlen"])Low प्राथमिकता के रूप में चिह्नित किया जाएगा। यह क्रॉस-रेफ़रेंस को याद करने से बचने का एक तरीका है जहाँ सभी पैरामीटरों को सही ढंग से प्राप्त करना संभव नहीं था (यह मुख्य रूप से डिसएसेंबली मोड पर लागू होता है)।Ctrl+U शॉर्टकट का उपयोग करके मैन्युअल रूप से दृश्य को रिफ्रेश करें (कुछ बार)।read फ़ंक्शन से पहुंच योग्य हैं: function_call.reachable_from("read")