
IDA Pro में स्वचालित C++ वर्चुअल टेबल बनाने का IDAPython उपकरण
Virtuailor एक IDAPython उपकरण है जो इंटेल आर्किटेक्चर, दोनों 32बिट और 64बिट कोड और AArch64 (नया!) के लिए लिखे गए C++ कोड के लिए vtables का पुनर्निर्माण करता है। यह उपकरण 2 भागों से निर्मित है: स्थैतिक और गतिशील।
पहला भाग स्थैतिक है, जिसमें निम्नलिखित क्षमताएं हैं:
दूसरा भाग गतिशील है, जिसमें निम्नलिखित क्षमताएं हैं:
Virtuailor अब IDA संस्करण 7.0 से नवीनतम संस्करण (7.5) तक का समर्थन करता है। यदि आप IDA संस्करण 7.4 से पुराने का उपयोग कर रहे हैं तो आपको beforeIDA-7.4 शाखा पर स्विच करना होगा। मास्टर शाखा उपलब्ध नवीनतम संस्करण (7.5) का समर्थन करती है।
if __name__ == '__main__':
start_addr_range = idc.MinEA() # You can change the virtual calls address range
end_addr_range = idc.MaxEA()
add_bp_to_virtual_calls(start_addr_range, end_addr_range)
वैकल्पिक, (लेकिन अत्यधिक अनुशंसित), अपने idb का स्नैपशॉट बनाएं। बस ctrl+shift+t दबाएं और स्नैपशॉट बनाएं।
File->Run script... दबाएं, फिर Virtuailor फ़ोल्डर में जाएं और Main.py चलाना चुनें। अधिक स्पष्ट और दृश्य स्पष्टीकरण के लिए आप निम्न GIF देख सकते हैं।

अब GUI आपको लक्षित करने के लिए एक सीमा चुनने का विकल्प प्रदान करेगा, यदि आप पूरे बाइनरी को लक्षित करना चाहते हैं तो आरंभ और अंत पतों में डिफ़ॉल्ट मानों के साथ OK दबाएं।
उसके बाद ब्रेकपॉइंट्स आपके कोड में रखे जाएंगे और आपको बस इतना करना है कि IDA डीबगर के साथ अपने कोड को निष्पादित करें, जो भी कार्य आप चाहते हैं करें और देखें कि vtables कैसे बन रहे हैं! AArch64 के लिए आप एक रिमोट gdb सर्वर सेट अप कर सकते हैं और IDA डीबगर का उपयोग करके डीबग कर सकते हैं।
यदि आप अब ब्रेकपॉइंट्स नहीं चाहते/जरूरत नहीं है, तो बस IDA में ब्रेकपॉइंट सूची टैब पर जाएं और अपनी इच्छानुसार ब्रेकपॉइंट्स हटा दें।
यह भी ध्यान देने योग्य है कि यह उपकरण का दूसरा संस्करण है जिसमें 32 और 64 बिट और aarch64 दोनों के लिए समर्थन है, शायद कुछ मामलों में थोड़ी संख्या में ब्रेकपॉइंट छूट जाएंगे। ऐसे मामलों में कृपया एक इश्यू खोलें और मुझसे संपर्क करें ताकि मैं कोड में सुधार कर सकूं और इसे ठीक करने में मदद कर सकूं। इसके लिए अग्रिम धन्यवाद :)
Virtuailor उन vtable से संरचनाएँ बनाता है जो मारे गए वर्चुअल कॉल में उपयोग की गई थीं। vtable फ़ंक्शन BP ऑपकोड में उपयोग किए गए प्रासंगिक रजिस्टर के आधार पर स्मृति से निकाले जाते हैं।
चूंकि मैं IDA में संरचना और डेटा अनुभाग में vtables के बीच सहसंबंध बनाना चाहता था, BP डेटा अनुभाग में vtable पते के नाम को संरचना के नाम में बदल देता है। जैसा कि आप निम्नलिखित चित्र में देख सकते हैं:

वर्चुअल फ़ंक्शन के नाम भी बदले जा रहे हैं, उन स्थितियों को छोड़कर जहां नाम डिफ़ॉल्ट IDA नाम नहीं हैं (प्रतीकों वाले फ़ंक्शन या उपयोगकर्ता द्वारा बदले गए फ़ंक्शन), उन मामलों में फ़ंक्शन नाम वही रहेंगे और उन्हें उनके वर्तमान नाम के साथ vtable संरचना में भी जोड़ा जाएगा।
चुने गए नाम निम्नलिखित पैटर्न का उपयोग करके बनाए गए हैं:
vtable बनाने के बाद Virtuailor बनाई गई संरचना और असेंबली के बीच एक कनेक्शन भी जोड़ता है जैसा कि आप निम्नलिखित छवियों में देख सकते हैं:

P.S: BP में उपयोग की गई संरचना ऑफसेट केवल अंतिम कॉल के लिए प्रासंगिक है, सभी किए गए वर्चुअल कॉल की बेहतर समझ प्राप्त करने के लिए xref सुविधा जोड़ी गई जैसा कि अगले अनुभाग में समझाया गया है।
जब C++ को स्थैतिक रूप से रिवर्स करते हैं तो यह देखना आसान नहीं है कि किसने किसे कॉल किया, ऐसा इसलिए है क्योंकि अधिकांश कॉल अप्रत्यक्ष कॉल हैं, हालांकि Virtuailor चलाने के बाद हर वह फ़ंक्शन जिसे अप्रत्यक्ष रूप से कॉल किया गया था, अब उन स्थानों पर एक xref है।
निम्नलिखित gif उनके अप्रत्यक्ष फ़ंक्शन कॉल के साथ जोड़े गए Xrefs को दिखाता है:

यह उपकरण RECon ब्रुसेल्स, ट्रूपर्स और वॉरकॉन में प्रस्तुत किया गया था। प्रस्तुति निम्नलिखित लिंक पर पाई जा सकती है: https://www.youtube.com/watch?v=Xk75TM7NmtA
REcon Brussels, Troopers, Warcon crews, Nana, @tmr232, @matalaz, @oryandp, @talkain, @shiftreduce
प्लगइन GNU GPL v3 लाइसेंस के तहत लाइसेंस प्राप्त है।