यह एक संरचना में संग्रहीत फ़ंक्शन पॉइंटर का आविष्कार है।
यह पहली पंक्ति पते DS:xxxxxxxx
पर संग्रहीत सूचक प्राप्त करती है। वर्ग ब्रैकेट पते के पते को इंगित करते हैं, सी में *
की तरह। स्मृति से मूल्य को सूचक के रूप में उपयोग किया जाना है; इसे ecx
रजिस्टर में रखा गया है।
MOV ECX,DWORD PTR DS:[xxxxxxxx] ; xxxxxxxx is an address
दूसरी पंक्ति ऊपर प्राप्त सूचक को अस्वीकार करती है। ecx
से वह मान अब पता के रूप में उपयोग किया जाता है, जिसे अस्वीकृत किया गया है। स्मृति में पाया गया मान एक और सूचक है। यह दूसरा सूचक edx
रजिस्टर में रखा गया है।
MOV EDX,DWORD PTR DS:[ECX]
तीसरी पंक्ति फिर स्मृति को प्रस्तुत करती है; इस बार, 0x38660 बाइट्स से ऊपर प्राप्त सूचक से ऑफ़सेट पर पहुंच का पता होता है। यह चार से समान रूप से विभाजित नहीं है, इसलिए यह फ़ंक्शन पॉइंटर सी ++ vtable से नहीं दिखता है। स्मृति से प्राप्त मूल्य इस बार eax
रजिस्टर में संग्रहीत है।
MOV EAX,DWORD PTR DS:[EDX+116]
अंत में, कार्य करने के लिए द्वारा eax
निष्पादित किया जाता है ओर इशारा किया। यह बस फ़ंक्शन पॉइंटर के माध्यम से फ़ंक्शन को आमंत्रित करता है। फ़ंक्शन शून्य तर्क लेता प्रतीत होता है, लेकिन मेरे पास मेरे उत्तर के संशोधन पर एक प्रश्न है: क्या PUSH
निर्देश है जो इस स्निपेट से पहले है? वे समारोह तर्क होंगे। प्रश्न चिह्न बताते हैं कि यह फ़ंक्शन एक मूल्य वापस कर सकता है, हम अपने लाभ से नहीं बता सकते हैं।
CALL EAX
कुल मिलाकर, कोड स्निपेट प्लग-इन पुस्तकालय OllyDbg करने के लिए एक से एक विस्तार समारोह की एक मंगलाचरण की तरह दिखता है। OllyDbg एबीआई विभिन्न struct
एस निर्दिष्ट करता है जिसमें कुछ फ़ंक्शन पॉइंटर्स होते हैं। फ़ंक्शन पॉइंटर्स के सरणी भी हैं, लेकिन edx
-हेल्ड पॉइंटर (गैर-गठबंधन-द्वारा-यहां तक कि एकाधिक ऑफ़सेट) तक पहुंचने के लिए डबल-इंडिकेशन मुझे लगता है कि यह struct
है और फ़ंक्शन पॉइंटर्स की एक सरणी नहीं है या एक सी ++ वर्ग का vtable।
दूसरे शब्दों में, xxxxxxxx
एक पॉइंटर को struct
पर फ़ंक्शन पॉइंटर युक्त पॉइंटर है।
ओलीडीबीजी स्रोत फ़ाइल में प्लगइन.h कुछ उम्मीदवार struct
परिभाषाएं हैं। यहाँ एक उदाहरण है:
typedef struct t_sorted { // Descriptor of sorted table
char name[MAX_PATH]; // Name of table, as appears in error
int n; // Actual number of entries
int nmax; // Maximal number of entries
int selected; // Index of selected entry or -1
ulong seladdr; // Base address of selected entry
int itemsize; // Size of single entry
ulong version; // Unique version of table
void *data; // Entries, sorted by address
SORTFUNC *sortfunc; // Function which sorts data or NULL
DESTFUNC *destfunc; // Destructor function or NULL
int sort; // Sorting criterium (column)
int sorted; // Whether indexes are sorted
int *index; // Indexes, sorted by criterium
int suppresserr; // Suppress multiple overflow errors
} t_sorted;
उन उदाहरण NULL
होने की अनुमति दी जाती है, और अपने एएसएम टुकड़ा समारोह सूचक में NULL
सूचक की जांच नहीं करता। इसलिए, t_table
या SPECFUNC
t_dump
से DRAWFUNC
होना चाहिए।
आप एक छोटी परियोजना बना सकते हैं जिसमें हेडर फ़ाइल शामिल है और printf()
और offsetof()
का उपयोग यह निर्धारित करने के लिए करता है कि इनमें से कोई भी 0x116 के ऑफसेट पर है या नहीं।
अन्यथा, मुझे कल्पना है कि ओलीडीबीजी के अंदरूनी इस शैली में लिखे गए हैं। इसलिए ओलीडीबीजी के भीतर विभिन्न प्रयोजनों के लिए निजी struct
परिभाषाएं (प्लगइन.h फ़ाइल में प्रकाशित नहीं) होने की संभावना है।
मैं जोड़ना चाहता हूं, मुझे लगता है कि यह एक शर्म की बात है कि ओलीडीबीजी स्रोत उपलब्ध नहीं हैं। मैं इस धारणा के तहत था कि इसमें स्थिर रूप से जुड़े डिस्सेबलर का कुछ प्रकार का जीपीएल लाइसेंस था, लेकिन मुझे ओलीडीबीजी को स्रोत प्राप्त करने की कोई किस्मत नहीं मिली है।
@ x0n - होमवर्क टैग कहां से है? –
यह होमवर्क नहीं है, मैं असेंबली में अच्छा नहीं हूं। – Iron
होमवर्क टैग हटा दिया गया। – x0n