
डेल्फी एक्ज़ीक्यूटेबल्स से RTTI जानकारी निकालने के लिए एक उपकरण, जो शुद्ध Python में लिखा गया है
यह टूल एक एक्ज़िक्यूटेबल फ़ाइल में Delphi डेटा खोजता है, जिसमें RTTI और वर्चुअल फंक्शन टेबल शामिल हैं। यह पहचानी गई क्लासों और फंक्शनों की जानकारी के साथ एक JSON फ़ाइल आउटपुट करता है, जिसका उपयोग अतिरिक्त विश्लेषण के लिए किया जा सकता है, उदाहरण के लिए:
एक IDAPython स्क्रिप्ट प्रदान की गई है जो आउटपुट को IDA में लोड कर सकती है।
यह स्क्रिप्ट Delphi के रिवर्स इंजीनियरिंग के लिए अन्य टूल्स को पूरक बनाने के लिए लिखी गई थी।
एनसीसी ग्रुप Plc द्वारा ओपन सोर्स के रूप में जारी - http://www.nccgroup.com/
डेविड कैनिंग्स (@edeca) [email protected] द्वारा विकसित
http://www.github.com/nccgroup/pythia
यह प्रोजेक्ट AGPL लाइसेंस के तहत जारी किया गया है। अधिक जानकारी के लिए LICENSE देखें।
उच्च स्तरीय प्रवाह इस प्रकार है:
Delphi vftables अच्छी तरह से प्रलेखित हैं। नवीनतम संस्करण की जानकारी Embarcadero से उपलब्ध है। Delphi 2005 के लिए अनौपचारिक दस्तावेज़ उपलब्ध है (यहाँ देखें)।
Free Pascal का स्रोत कोड भी उपयोगी है (Github mirror)।
vftable में पहला आइटम vmtSelfPtr होता है, जो वर्चुअल फंक्शन टेबल की शुरुआत की ओर संकेत करता है। स्क्रिप्ट PE फ़ाइल में प्रत्येक कोड सेगमेंट को आगे की ओर +0x4C बाइट्स इंगित करने वाले स्थान के लिए स्कैन करती है। ध्यान दें कि Delphi कंपाइलर vftables को 4 बाइट सीमा पर संरेखित करता है (अनुकूलन के लिए)।
उदाहरण के लिए, निम्नलिखित VA 0x0046E1C8 में ऑफसेट 0x0046E214 होता है, जो वर्तमान स्थान से 0x4C आगे है। जैसा कि IDA में दिखाया गया है:
.text:0046E1C8 ; Classes::TComponent *vftable_TDCP_misty1
.text:0046E1C8 14 E2 46 00 vftable_TDCP_misty1 dd offset off_46E214
यह दृष्टिकोण झूठे सकारात्मक (false positives) उत्पन्न कर सकता है, इसलिए vftable के अन्य फ़ील्ड्स को उचित मानों के लिए जाँचा जाता है। उदाहरण के लिए vmtInstanceSize की जाँच यह सुनिश्चित करने के लिए की जाती है कि यह अत्यधिक न हो और फंक्शन पॉइंटर्स को सत्यापित किया जाता है कि वे एक एक्ज़िक्यूटेबल सेक्शन में स्थित हों। परीक्षण के दौरान ब्रूट फोर्स खोज विधि के बावजूद झूठे सकारात्मक की दर बहुत कम थी।
vftable में पाया गया प्रत्येक फंक्शन यह जाँचने के लिए देखा जाता है कि क्या यह पैरेंट से इनहेरिट किया गया है या ओवरलोड किया गया है। Delphi एकाधिक इनहेरिटेंस का समर्थन नहीं करता, इसलिए इसे पैरेंट vftable में समान ऑफसेट वाले पॉइंटर की जाँच करके प्राप्त किया जा सकता है।
यदि दोनों पॉइंटर्स एक ही फंक्शन को संदर्भित करते हैं, तो यह इनहेरिट किया गया है। यदि चाइल्ड का पॉइंटर अलग है, तो इसे ओवरलोड किया गया है।
टूल का प्राथमिक आउटपुट एक JSON फ़ाइल है जिसे बाद की प्रोसेसिंग / टूल्स में डाला जा सकता है। हालाँकि, कुछ अन्य आउटपुट प्रारूप भी शामिल हैं।
एक फ़ाइल उत्पन्न करने के लिए --save-tree विकल्प का उपयोग करें, जैसे:
TObject (at 0x0040112c)
|-- Exception (at 0x004081f8)
| |-- EAbort (at 0x00408260)
| |-- EAbstractError (at 0x00408ad4)
| |-- EAssertionFailed (at 0x00408a74)
| |-- EBcdException (at 0x004bd110)
| | +-- EBcdOverflowException (at 0x004bd16c)
| |-- EBitsError (at 0x0041ab04)
| |-- EComponentError (at 0x0041abbc)
| |-- EConvertError (at 0x00408850)
| |-- EDCP_cipher (at 0x0046a0ac)
| | +-- EDCP_blockcipher (at 0x0046a29c)
| |-- EDCP_hash (at 0x00469f20)
.. etc ..
PACKAGEINFO या DVCLAL संसाधन से) और विभिन्न vftable लेआउट के लिए स्कैनिंग समायोजित करें।call [ecx+3Fh] का किसी इंस्टेंस मेथड से मिलान करें)TComparer<System.Bindings.EvalProtocol.TPair<System.IInterface,System.Pointer>> जैसे नामों का उपयोग करता है जो IDA में काफी दुर्बोध्य हैं।कृपया मुझे उन बायनेरिज़ के उदाहरण भेजें जहाँ यह टूल काम नहीं करता, ताकि इसे बेहतर बनाया जा सके।