
असेंबली पैटर्न, बाइट अनुक्रम, स्ट्रिंग/नाम संदर्भ, और आकार बाधाओं द्वारा फ़ंक्शन को फ़िल्टर करने के लिए IDA Pro प्लगइन, जिसमें नियम-आधारित खोज और उन्नत बाइनरी कॉपी करना शामिल है।
FindFunc एक IDA Pro प्लगइन है जो कोड फ़ंक्शंस को खोजने के लिए है जिनमें एक निश्चित असेंबली या बाइट पैटर्न होता है, एक निश्चित नाम या स्ट्रिंग का संदर्भ होता है, या विभिन्न अन्य बाधाओं का पालन करते हैं।
FindFunc ने 2022 HexRays IDA Pro Plugin Contest में तीसरा स्थान जीता!

FindFunc की मुख्य कार्यक्षमता उपयोगकर्ता को "Rules" या बाधाओं का एक सेट निर्दिष्ट करने देती है जिसे IDA Pro में एक कोड फ़ंक्शन को संतुष्ट करना होता है। FF फिर उन सभी फ़ंक्शंस को खोजेगा और सूचीबद्ध करेगा जो सभी नियमों को संतुष्ट करते हैं (इसलिए वर्तमान में सभी नियम AND-संयोजन में हैं)। अपवाद: नियमों को नकारात्मक मिलान के लिए "inverted" किया जा सकता है। ऐसे नियम इस प्रकार "AND NOT" के अनुरूप होते हैं।
FF प्रसंस्करण समय को कम करने के लिए नियमों को स्मार्ट क्रम में शेड्यूल करेगा। सुविधा अवलोकन:
बटन "Find Functions" मौजूदा परिणामों को साफ़ करता है और एक ताज़ा खोज शुरू करता है, "Refine Results" केवल पिछली खोज के परिणामों पर विचार करता है।
FF की एक द्वितीयक विशेषता निम्नलिखित विकल्पों के साथ निर्देशों के बाइनरी प्रतिनिधित्व की प्रतिलिपि बनाने का विकल्प है:
विवरण के लिए नीचे "advanced copying" अनुभाग देखें। यह सुविधा बाइट पैटर्न नियम (Byte Pattern rule) के साथ अच्छी तरह से मेल खाती है!
FindFunc एक IDA Pro पायथन प्लगइन है जिसमें कोई बाहरी पैकेज निर्भरता नहीं है। इसे रिपॉजिटरी डाउनलोड करके और फ़ाइल 'findfuncmain.py' और फ़ोल्डर 'findfunc' को अपने IDA Pro प्लगइन निर्देशिका में कॉपी करके स्थापित किया जा सकता है। IDA 9.0+ के लिए रिपॉजिटरी को सीधे प्लगइन निर्देशिका में क्लोन भी किया जा सकता है। किसी भी तरह से निर्माण की आवश्यकता नहीं है।
आवश्यकताएँ: python3 वातावरण के साथ IDA Pro 8.x (8.3+)। FindFunc केवल x86/x64 आर्किटेक्चर के लिए डिज़ाइन किया गया है। इसे Windows 10 + 11 पर IDA 8.3 - 9.2, python 3.11 के साथ परीक्षण किया गया है।
वर्तमान में निम्नलिखित छह नियम उपलब्ध हैं। उन्हें प्रदर्शन प्रभाव के संबंध में भारी से हल्के क्रम में यहाँ क्रमबद्ध किया गया है। बड़े डेटाबेस के साथ एक अच्छा विचार है कि पहले एक सस्ते नियम के साथ उम्मीदवार-फ़ंक्शंस को कम करें, फिर भारी मिलान करें जैसे कि कोड नियमों (Code Rules) के माध्यम से। FF स्वचालित रूप से नियमों को स्मार्ट तरीके से शेड्यूल करेगा।
किसी दिए गए असेंबली कोड स्निपेट को शामिल करने के आधार पर फ़ंक्शन को फ़िल्टर करने का नियम। यह IDA के टेक्स्टुअल डिसअसेंबली प्रतिनिधित्व के लिए टेक्स्ट-खोज नहीं है, बल्कि अंतर्निहित निर्देश का उन्नत मिलान करता है। स्निपेट में कई क्रमिक निर्देश हो सकते हैं, प्रति पंक्ति एक। फ़ंक्शन चंक्स समर्थित हैं। शाब्दिक असेंबली के अलावा विशेष वाइल्डकार्ड मिलान का समर्थन करता है:
अधिक उदाहरण:
mov r64, [r32 * 8 + 0x100]
mov r, [r * 8 - 0x100]
mov r64, [r32 * 8 + imm]
pass
mov r, word [eax + r32 * 8 - 0x100]
any r64, r64
push imm
push any
सावधानियाँ: IDA से असेंबली कॉपी करते समय सावधान रहें। IDA निर्देश में स्थानीय चर नाम और अन्य जानकारी मिला देता है जो मिलान विफलता का कारण बनता है। साथ ही, लेबल समर्थित नहीं हैं ("call sub_123456")।
ध्यान दें कि कोड पैटर्न सबसे महंगा नियम है, और यदि केवल कोड नियम मौजूद हैं तो FF के पास पूरे डेटाबेस को डिसअसेंबल करने के अलावा कोई विकल्प नहीं है। बहुत बड़ी बाइनरी के लिए इसमें कई मिनट लग सकते हैं। प्रदर्शन पर नोट्स नीचे देखें।
फ़ंक्शन में दिए गए इमीडिएट को कम से कम एक बार किसी भी स्थिति में शामिल होना चाहिए। इमीडिएट मान निर्देश के बाइनरी प्रतिनिधित्व में निश्चित मान होता है। इमीडिएट मान 0x100 से मेल खाने वाले निर्देशों के उदाहरण:
mov eax, 0x100
mov eax, [0x100]
and al, [eax + ebx*8 + 0x100]
push 0x100
इमीडिएट्स को सीधे क्लिपबोर्ड से नियमों की सूची में पेस्ट किया जा सकता है। नोट: IDA किसी भी आकार और इमीडिएट की किसी भी स्थिति का व्यापक मिलान करता है। यदि आप इसे 4 या 8 बाइट्स की विशिष्ट चौड़ाई के रूप में जानते हैं, तो एक बाइट पैटर्न तेज़ हो सकता है (लेकिन गलत सकारात्मक उत्पन्न कर सकता है)।
फ़ंक्शन में दिए गए बाइट पैटर्न को कम से कम एक बार शामिल होना चाहिए। पैटर्न IDA के बाइनरी खोज के समान प्रारूप का है, और इस प्रकार वाइल्डकार्ड का समर्थन करता है - उन्नत-प्रतिलिपि सुविधा के लिए एकदम सही मेल!
उदाहरण:
11 22 33 44 aa bb cc
11 22 33 ?? ?? bb cc -> ?? कोई भी बाइट हो सकता है
बाइट-पैटर्न को सीधे क्लिपबोर्ड से नियमों की सूची में पेस्ट किया जा सकता है। नोट: पैटर्न मिलान काफी तेज़ है और मैचों को जल्दी से कम करने के लिए एक अच्छा उम्मीदवार है!
फ़ंक्शन में दिए गए स्ट्रिंग को कम से कम एक बार संदर्भित होना चाहिए। स्ट्रिंग को पायथन के 'fnmatch' मॉड्यूल के अनुसार मिलान किया जाता है, और इस प्रकार वाइल्डकार्ड-जैसे मिलान का समर्थन करता है। मिलान केस-असंवेदनशील है। निम्नलिखित प्रारूपों के स्ट्रिंग पर विचार किया जाता है: [idaapi.STRTYPE_C, idaapi.STRTYPE_C_16] (इसे Config वर्ग में बदला जा सकता है)।
उदाहरण:
नोट: स्ट्रिंग मिलान तेज़ है और उम्मीदवारों को जल्दी से कम करने के लिए एक अच्छा विकल्प है!
फ़ंक्शन में दिए गए नाम/लेबल को कम से कम एक बार संदर्भित होना चाहिए। नाम/लेबल को पायथन के 'fnmatch' मॉड्यूल के अनुसार मिलान किया जाता है, और इस प्रकार वाइल्डकार्ड-जैसे मिलान का समर्थन करता है। मिलान केस-असंवेदनशील है।
उदाहरण:
नोट: नाम मिलान बहुत तेज़ है और उम्मीदवारों को जल्दी से कम करने के लिए आदर्श है!
फ़ंक्शन का आकार दी गई सीमा के भीतर होना चाहिए: "min <= functionsize <= max"। डेटा "min,max" फॉर्म के स्ट्रिंग के रूप में दर्ज किया जाता है। फ़ंक्शन के आकार में इसके सभी चंक्स शामिल हैं।
नोट: फ़ंक्शन आकार मिलान बहुत तेज़ है और उम्मीदवारों को जल्दी से कम करने के लिए आदर्श है!
उपयोग में आसानी के लिए FF का उपयोग निम्नलिखित कीबोर्ड शॉर्टकट के माध्यम से किया जा सकता है:
आगे GUI उपयोग
अक्सर हम असेंबली के बाइनरी पैटर्न खोजना चाहते हैं, लेकिन हार्डकोडेड पतों और मानों (इमीडिएट्स) के बिना, या यहाँ तक कि केवल निर्देश के वास्तविक ऑपकोड। FindFunc इसे आसान बनाता है डिसअसेंबली पॉपअप-मेनू में तीन कॉपी विकल्प जोड़कर:
बाइट-पैटर्न-नियम (या IDA की बाइनरी खोज) में उपयोग के लिए सभी निर्देश बाइट्स को हेक्स-स्ट्रिंग के रूप में क्लिपबोर्ड पर कॉपी करता है।
B8 44332211 mov eax,11223344
68 00000001 push 1000000
66:894424 70 mov word ptr ss:[esp+70],ax
will be copied as
b8 44 33 22 11 68 00 00 00 01 66 89 44 24 70
दिए गए निर्देश के लिए निर्देश बाइट्स कॉपी करता है, किसी भी इमीडिएट मान को मास्क करता है। उदाहरण:
B8 44332211 mov eax,11223344
68 00000001 push 1000000
66:894424 70 mov word ptr ss:[esp+70],ax
will be copied as
b8 ?? ?? ?? ?? 68 ?? ?? ?? ?? 66 89 44 24 ??
सभी निर्देश बाइट्स को हेक्स-स्ट्रिंग के रूप में क्लिपबोर्ड पर कॉपी करता है, किसी भी बाइट को मास्क करता है जो वास्तविक ऑपकोड नहीं है (sib, modrm सहित, लेकिन लीगेसी प्रीफ़िक्स रखता है)।
B8 44332211 mov eax,11223344
68 00000001 push 1000000
66:894424 70 mov word ptr ss:[esp+70],ax
will be copied as
b8 ?? ?? ?? ?? 68 ?? ?? ?? ?? 66 89 ?? ?? ??
एक संयोजन जो ऑपकोड और इमीडिएट्स रखता है, लेकिन उदाहरण के लिए mod r/m मास्क करता है। ध्यान दें कि यह ऑपकोड रखता है भले ही वे विशिष्ट रजिस्टर अनिवार्य करते हों, जैसे:
B8 44332211 mov eax,11223344
will keep the opcode B8.
नोट: यह IDA के API का उपयोग करके एक "सर्वोत्तम प्रयास" है, इस प्रकार कुछ मामले हो सकते हैं जहाँ यह केवल आंशिक रूप से काम करता है। 100% सही समाधान के लिए हमें एक समर्पित x86 डिसअसेम्बली लाइब्रेरी शिप करनी होगी।
समान परिणाम कोड पैटर्न नियमों (Code Pattern Rules) के साथ प्राप्त किए जा सकते हैं, लेकिन यह तेज़ हो सकता है, उपयोगकर्ता इंटरैक्शन और वास्तविक खोज दोनों के लिए।
चयनित डिसअसेम्बली को क्लिपबोर्ड पर कॉपी करता है, जैसा कि IDA में दिखाई देता है।
प्रदर्शन पर एक संक्षिप्त शब्द: