
कुछ IDA Pro स्क्रिप्ट्स जो EFI बाइनरीज़ के रिवर्स इंजीनियरिंग में सहायता करती हैं
EFI एक्ज़ीक्यूटेबल्स के रिवर्स इंजीनियरिंग में सहायता के लिए कुछ IDA स्क्रिप्ट्स।
इस पैकेज में निम्नलिखित फ़ाइलें शामिल हैं:
efiutils.py - कुछ सहायक फ़ंक्शनों वाला IDAPython मॉड्यूल
efiguids.py - EFI प्रोटोकॉल के लिए ज्ञात GUIDs का संग्रह
efiguids_ami.py - AMI BIOS में उपयोग किए जाने वाले प्रोटोकॉल के लिए ज्ञात GUIDs का संग्रह
behemoth.h - EFI के लिए प्रकार और संरचना परिभाषाओं का संग्रह रखने वाला एक विशाल हेडर
structs.idc - कुछ संरचना परिभाषाएँ रखने वाली एक IDC स्क्रिप्ट (behemoth.h द्वारा प्रतिस्थापित)
te_image.bt - TE बाइनरी इमेज के लिए एक 010 Editor टेम्पलेट
te_loader.py - TE बाइनरी इमेज के लिए एक IDA Pro लोडर स्क्रिप्ट
IDA स्क्रिप्टिंग का यह मेरा पहला प्रयास है, इसलिए कृपया मुझे क्षमा करें और बताएं कि क्या मैंने पहिये का पुनः आविष्कार किया है/कुछ अनुचित किया है।
मुख्य उपयोगी फ़ंक्शन नीचे वर्णित हैं। अन्य फ़ंक्शनों के बारे में अधिक जानकारी के लिए कोड और docstrings देखें।
rename_tables()बाइनरी के लिए पहला एंट्री पॉइंट ढूंढता है, एंट्री पॉइंट फ़ंक्शन को पारित किए गए पैरामीटरों को ट्रैक करने का प्रयास करता है और उन ग्लोबल वेरिएबल्स का नाम बदलता है जिनमें प्रमुख EFI टेबल्स संग्रहीत हैं। निम्नलिखित नामकरण क्रियाएँ की जाती हैं:
ग्लोबल जहाँ ImageHandle समाप्त होता है उसका नाम बदलकर gImageHandle कर दिया जाता है।
ग्लोबल जहाँ SystemTable समाप्त होता है उसका नाम बदलकर gSystemTable कर दिया जाता है।
ग्लोबल जहाँ SystemTable->BootServices समाप्त होता है उसका नाम बदलकर gBootServices कर दिया जाता है।
ग्लोबल जहाँ SystemTable->RuntimeServices समाप्त होता है उसका नाम बदलकर gRuntimeServices कर दिया जाता है।
कॉल निर्देशों का अनुसरण केवल एक स्तर गहराई तक किया जाएगा, क्योंकि अधिकांश एक्ज़ीक्यूटेबल्स टेबल संदर्भों को एंट्री पॉइंट या एंट्री पॉइंट से कॉल किए गए फ़ंक्शन में कॉपी करते हैं। आवश्यकता पड़ने पर MAX_STACK_DEPTH बदलें।
update_structs()ऊपर नाम बदले गए टेबल्स के क्रॉस-रेफरेंस ढूंढता है, और उनके नामों को उपयुक्त संरचनाओं से स्ट्रक्चर ऑफसेट होने के लिए अपडेट करता है। यदि rename_tables() विफल रहा तो इसे ठीक से काम करने के लिए आपको ऊपर बताए अनुसार चीज़ों का मैन्युअल रूप से नाम बदलना होगा।
उदाहरण के लिए:
mov rax, cs:qword_whatever
call qword ptr [rax+150h]
बन जाता है:
mov rax, cs:gBootServices
call [rax+EFI_BOOT_SERVICES.UninstallMultipleProtocolInterfaces]
rename_guids()डेटा सेगमेंट में GUIDs ढूंढता है और उनका नाम बदलता है। TianoCore स्रोत से 470 प्रोटोकॉल GUIDs निकाले गए थे, और मालिकाना Apple (और अन्य विक्रेता) GUIDs जोड़े जाएंगे जैसे ही उनका सामना होगा।
go()सुविधा विधि जो उपरोक्त सभी कार्य करती है।
अपनी EFI बाइनरी को IDA Pro में लोड करें
आवश्यक डेटा संरचनाओं को परिभाषित करने के लिए behemoth.h आयात करें
स्थानीय प्रकारों से संरचनाओं को अपने IDB में जोड़ें
इसे python के पथ में जोड़ने के लिए efiutils.py चलाएँ (या इसे किसी अन्य विधि से करें)
कोड/docstrings पर एक नज़र डालें, लेकिन संभवतः:
import efiutils; efiutils.go()
te_loader.py TE इमेज लोडर का उपयोग करने के लिए, इसे किसी भी अन्य लोडर की तरह इंस्टॉल करें। OS X पर यह इसे idaq.app/Contents/MacOS/loaders/ फ़ोल्डर के अंदर कॉपी या सिमलिंक करके किया जाता है।