2010-08-10 20 views
5

की कुछ लाइनें गूढ़ रहस्य मैं OllyDbg में विधानसभा के इन कुछ पंक्तियों पाया है:सहायता विधानसभा

MOV ECX,DWORD PTR DS:[xxxxxxxx] ; xxxxxxxx is an address 
MOV EDX,DWORD PTR DS:[ECX] 
MOV EAX,DWORD PTR DS:[EDX+116] 
CALL EAX 

किसी के माध्यम से कदम और मुझे बताओ कि यहाँ क्या हो रहा है सकते हैं?

+0

@ x0n - होमवर्क टैग कहां से है? –

+0

यह होमवर्क नहीं है, मैं असेंबली में अच्छा नहीं हूं। – Iron

+0

होमवर्क टैग हटा दिया गया। – x0n

उत्तर

6

यह एक संरचना में संग्रहीत फ़ंक्शन पॉइंटर का आविष्कार है।

यह पहली पंक्ति पते 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 या SPECFUNCt_dump से DRAWFUNC होना चाहिए।

आप एक छोटी परियोजना बना सकते हैं जिसमें हेडर फ़ाइल शामिल है और printf() और offsetof() का उपयोग यह निर्धारित करने के लिए करता है कि इनमें से कोई भी 0x116 के ऑफसेट पर है या नहीं।

अन्यथा, मुझे कल्पना है कि ओलीडीबीजी के अंदरूनी इस शैली में लिखे गए हैं। इसलिए ओलीडीबीजी के भीतर विभिन्न प्रयोजनों के लिए निजी struct परिभाषाएं (प्लगइन.h फ़ाइल में प्रकाशित नहीं) होने की संभावना है।


मैं जोड़ना चाहता हूं, मुझे लगता है कि यह एक शर्म की बात है कि ओलीडीबीजी स्रोत उपलब्ध नहीं हैं। मैं इस धारणा के तहत था कि इसमें स्थिर रूप से जुड़े डिस्सेबलर का कुछ प्रकार का जीपीएल लाइसेंस था, लेकिन मुझे ओलीडीबीजी को स्रोत प्राप्त करने की कोई किस्मत नहीं मिली है।

+0

+1। :-) – Pretzel

+0

"यह * शायद * एक आमंत्रण ..." अधिक सटीक होगा, नहीं? आपको पता नहीं है कि यह वास्तव में क्या है। – x0n

+0

@ x0n। नहीं, मुझे लगता है कि मेरे पास बहुत अच्छा विचार है कि यह क्या है। मुझे OllyDbg के साथ कुछ अनुभव मिला है। उदाहरण के लिए, मैंने कभी भी "ओलीडीबीजी को अनिश्चित उच्च स्तर की भाषा में लिखा नहीं होगा" के साथ कुछ भी लिखा होगा। इसे एमएसवीसी 2005 के साथ संकलित किया गया था, और मेरे पास डोमेन-विशिष्ट ज्ञान है। बेशक, स्निपेट इनलाइन असेंबली हो सकता है, लेकिन ओलीडीबीजी प्लगइन या तीन और एक गलत ओलीडीबीजी प्लग-इन होस्ट टेस्ट हार्नेस लिखा है ... मुझे लगता है कि मुझे पता है कि यह क्या है। XOFF। –

0

यह तो भी मैं केवल कर रहा था थोड़ी देर गया है, क्योंकि मैं एएसएम (1997) किया था और है i386 एएसएम तो मुझे माफ कर दो, तो मेरा उत्तर यह सब उपयोगी नहीं है ...

दुर्भाग्य से, कोड डॉन के इन 4 लाइनों मुझे बहुत कुछ नहीं बताओ। यह ज्यादातर सीपीयू रजिस्टरों में सामान लोड कर रहा है और एक फ़ंक्शन कॉल कर रहा है।

विशेष रूप से, यह डेटा की तरह दिखता है या शायद उस पते से आपके सीएक्स रजिस्टर में एक पॉइंटर लोड किया जा रहा है। फिर उस मूल्य को सीएक्स से डीएक्स में कॉपी किया जा रहा है। तो आपके पास डीएक्स में स्थित सीएक्स के सूचक का मूल्य है। फिर डीएक्स और 116 के ऑफसेट में उस मूल्य को एएक्स रजिस्टर (आपके accumulator?)

में कॉपी किया जा रहा है तो उस पते पर स्थित जो भी फ़ंक्शन एएक्स में कॉपी किया जा रहा है उसे निष्पादित किया जा रहा है।

+0

क्या यह किसी भी तरह से इसे DWORD PTR में संशोधित करता है जो पहले से ही DWORD PTR'd रहा है? – Iron

+0

मुझे कोई संशोधित नहीं चल रहा है, लेकिन कॉलिंग ईएक्स कुछ ऐसा कह सकता है जो कुछ बदलता है। मैं यह जानने के बिना नहीं कह सकता कि वहां क्या स्थित है ... – Pretzel

+0

मुझे पूरा यकीन है कि यह डीएस द्वारा [* ईसीएक्स] द्वारा मूल्य * को इंगित कर रहा है, [ईसीएक्स] ईडीएक्स में, ईसीएक्स को ईडीएक्स में कॉपी नहीं कर रहा है, जैसे x0n ने कहा। – zwol

2

पता xxxxxxx से 32 बिट नंबर लें और इसे ईसीएक्स रजिस्टर में डालें, फिर इस मान का उपयोग एक पते के रूप में करें और मूल्य पढ़ें और इसे ईडीएक्स रजिस्टर में डाल दें, आखिरकार इस नंबर पर 116 जोड़ें और उस के मान को पढ़ें ईएक्स में पता। फिर यह ईएक्स में आयोजित पते पर कोड निष्पादित करना शुरू कर देता है। जब उस कोड को रिटर्न ऑपोड का सामना करना पड़ता है, तो कॉल निर्देश के बाद निष्पादन जारी रहेगा।

यह सुंदर मूल असेंबली है। यह मुझे आश्चर्यचकित करता है कि आप एक डीबगर के साथ कर रहे हैं और जब आपका असाइनमेंट देय है ;-)

+0

मैं डिबगिंग सामान के माध्यम से असेंबली सीख रहा हूं इसलिए इसमें कोई आश्चर्य की बात नहीं है कि यह मूल है। मुझे यह पता था कि उसने क्या किया था, लेकिन मुझे "एमओवी ईसीएक्स, ड्वॉर्ड पीटीआर [पता]" में एक बिंदु नहीं दिखाई दिया, फिर "एमओवी ईडीएक्स, ड्वॉर्ड पीटीआर [ईसीएक्स]" तो मैंने सोचा कि यह कुछ स्पष्ट नहीं हो रहा है । तो वैसे भी, क्या इसका मतलब यह है कि xxxxxxxx किसी फ़ंक्शन के लिए पॉइंटर है, या फ़ंक्शन पर पॉइंटर के लिए पॉइंटर है? – Iron

+0

इसका मतलब यह नहीं है कि इसका अर्थ क्या है। आप अनुमान लगा सकते हैं कि वहाँ एक "कार्य" है, या यहां तक ​​कि यदि कार्य किसी भी उच्च भाषा में संकलित किया गया था (या यहां तक ​​कि अगर उच्च स्तर की भाषा शामिल थी, तो भी टीएच) इस कोड को इंजीनियर करने के लिए, इसे उत्पन्न करने वाले संकलक के अंतरंग ज्ञान की आवश्यकता है। – x0n

+0

मुझे पता है कि यह एमएसवीसी ++ था, शायद 2005. – Iron

0

मुझे 99% यकीन है कि यह एक वर्चुअल विधि कॉल है, एमएसवीसी होने वाले कंपाइलर के बारे में टिप्पणियों पर विचार करते हुए।

MOV ECX,DWORD PTR DS:[xxxxxxxx] 

क्लास उदाहरण के लिए पॉइंटर वैश्विक चर से ईसीएक्स में लोड किया गया है। (एनबी: डिफ़ॉल्ट __thiscall कॉलिंग सम्मेलन उदाहरण सूचक को पास करने के लिए ईसीएक्स का उपयोग करता है, उर्फ ​​यह पॉइंटर)।

MOV EDX,DWORD PTR DS:[ECX] 

vftable (वर्चुअल फ़ंक्शन टेबल) पॉइंटर क्लास लेआउट में आमतौर पर पहला आइटम होता है। यहां सूचक ईडीएक्स में भरा हुआ है।

MOV EAX,DWORD PTR DS:[EDX+116] 

एक विधि सूचक पर ऑफसेट 116 (0x74) तालिका में EAX में भरी हुई है। चूंकि प्रत्येक सूचक 4 बाइट्स है, यह कक्षा का 30 वां आभासी तरीका है (116/4 + 1)।

CALL EAX 

विधि कहा जाता है।

मूल C++ में यह कुछ इस तरह दिखेगा:

g_pObject1->method30(); 

सी ++ आभासी उपाय अपना सकते हैं कक्षाएं, की MSVC के कार्यान्वयन के बारे में अधिक जानने के लिए मेरे लेख here देखते हैं।

संबंधित मुद्दे