2010-02-17 22 views
5

कल्पना कीजिए कि आप एक प्रोग्राम लिखना चाहते हैं जो एक C++ dll फ़ाइल में फ़ंक्शंस का परीक्षण करता है। आपको उपयोगकर्ता को एक डीएलएल चुनने में सक्षम होना चाहिए (हम मानते हैं कि हम सी ++ डीएलएस के बारे में बात कर रहे हैं)। वह डीएल द्वारा निर्यात किए गए सभी कार्यों की एक सूची प्राप्त करने में सक्षम होना चाहिए। फिर, उपयोगकर्ता सूची से फ़ंक्शन नाम चुनने में सक्षम होना चाहिए, मैन्युअल रूप से तर्कों की एक सूची इनपुट करें (तर्क सभी मूल प्रकार हैं, जैसे int, double, bool या char arrays (जैसे c-type स्ट्रिंग्स)) और प्रयास निर्दिष्ट तर्क के साथ चयनित फ़ंक्शन को चलाने के लिए। वह जानना चाहता है कि फ़ंक्शन निर्दिष्ट तर्कों के साथ चलता है या नहीं, तो वे इसे क्रैश कर देते हैं (क्योंकि वे उदाहरण के लिए हस्ताक्षर से मेल नहीं खाते हैं)।क्या मैं सी ++ डीएल द्वारा उपयोग किए जाने वाले कॉलिंग सम्मेलन को प्रोग्रामिक रूप से कम कर सकता हूं?

मुख्य समस्या यह है कि सी ++, दृढ़ता से टाइप की गई भाषा होने के कारण, आपको संकलन समय पर फ़ंक्शन कॉल के लिए तर्कों की संख्या और प्रकार जानने की आवश्यकता होती है। और मेरे मामले में, मुझे बस यह नहीं पता कि ये तर्क क्या हैं हैं, जब तक कि उपयोगकर्ता उन्हें रनटाइम पर नहीं चुनता।

एकमात्र समाधान मैं के साथ आया था, विधानसभा उपयोग करने के लिए मैन्युअल रूप से कॉल स्टैक पर बहस पुश करने के लिए किया गया था।

हालांकि, मुझे यह समझाया गया है कि अगर मैं विधानसभा के साथ गड़बड़ करना चाहते हैं, मैं बेहतर लानत यकीन है कि मुझे पता है कि जो बुला सम्मेलन dll में फ़ंक्शन का उपयोग कर रहे हैं चाहते हैं आए हैं।

तो (अंत में :) यहाँ मेरे सवाल है: मैं बुला सम्मेलन programmaticaly यह मान सकते हैं? निर्भरता वॉकर मेरी मदद नहीं करेगा, और मुझे नहीं पता कि पीई प्रारूप को मैन्युअल रूप से कैसे पढ़ा जाए।

+0

आपके पास उपयोगकर्ता को कॉलिंग सम्मेलन क्यों निर्दिष्ट नहीं किया गया है? Stdcall के लिए डिफ़ॉल्ट (जो कि इन दिनों माइक्रोसॉफ्ट कंपाइलर्स द्वारा उत्पन्न डीएलएस पर है), लेकिन उपयोगकर्ता को इसे बदलने की अनुमति देता है। –

+0

ठीक है, डर्न.मैंने बस इसके बारे में सोचा नहीं था! मुझे यह जांचना है कि क्या मुझे ऐसा करने की इजाजत है, लेकिन यदि मैं हूं, तो यह एक वैध कामकाज होगा :)) –

उत्तर

3

उत्तर शायद है।

यदि फ़ंक्शंस नाम सी ++ सजाए गए हैं, तो आप नाम सजावट से तर्क गणना और प्रकार निर्धारित कर सकते हैं, यह आपका सबसे अच्छा केस परिदृश्य है, और काफी संभावना है कि एमएसवीसी को कोड को पहले स्थान पर लिखने के लिए इस्तेमाल किया गया था।

यदि निर्यात किए गए फ़ंक्शन stdcall कॉलिंग कन्वेंशन (विंडोज़ एपीआई के लिए डिफ़ॉल्ट) हैं, तो आप धक्का देने के लिए बाइट्स की संख्या निर्धारित कर सकते हैं, लेकिन तर्कों के प्रकार नहीं।

बुरी खबर यह है कि सी कॉलिंग सम्मेलन के लिए, प्रतीक नामों को देखकर बताने का कोई तरीका नहीं है। आपको स्रोत कोड या डीबग जानकारी तक पहुंच की आवश्यकता होगी।

http://en.wikipedia.org/wiki/X86_calling_conventions

नाम है कि एक समारोह एक निर्यात के रूप में दिया जाता है आवश्यक ऐसा नाम है जो लिंकर देखता है के साथ किसी भी संबंध है नहीं है, लेकिन समय, निर्यात नाम और प्रतीक नाम के सबसे कि लिंकर देखता है वही है।

+0

ठीक है, मैं इसे बहुत अधिक मानता हूं कि मुझे फ़ंक्शन तर्कों के बारे में कोई जानकारी नहीं मिल सकती है। मैं बस "बल फ़ीड" करने के लिए एक रास्ता खोजने के लिए खुश हैं एक फ़ंक्शन में सेर परिभाषित तर्क सूची और देखें कि यह क्रैश हो गया है या नहीं। –

+0

@Emil: आपको अवगत होना चाहिए कि कॉलर या कैली तर्कों को पॉप करता है या नहीं, कॉलिंग सम्मेलनों के बीच मतभेद हैं। –

2

संकलित कोड सिर्फ नहीं कहता है 'यहाँ इस समारोह एक fastcall है, और यहाँ यह एक stdcall है' दुर्भाग्य से।

आईडीए की तरह

भी आधुनिक नहीं disassemblers डिफ़ॉल्ट रूप से कॉल प्रकार अनुमान करने की कोशिश (वहाँ एक प्लगइन हो सकता है या एक विकल्प कहीं idk)।

मूल रूप से यदि आप एक मानव आप पहले कुछ निर्देश पर देखने के लिए और समय का 90% बता cn हैं। यदि वे पॉप और पुश हैं, तो इसका स्टडकॉल, यदि रजिस्टरों (विशेष रूप से एक्क्स) के माध्यम से गुज़रने वाले पैरामेट्स हैं तो इसका सीडीसीएल। फास्टकॉल भी रजिस्टरों का उपयोग करता है लेकिन कुछ खास करता है .. मेरे सिर के ऊपर से दूर है। लेकिन यह सारी जानकारी बेकार है क्योंकि आपका कार्यक्रम स्पष्ट रूप से मानव नहीं होगा।

यदि आप परीक्षण कर रहे हैं, तो कम से कम हेडर फाइलें नहीं हैं ?? यह एक बहुत मुश्किल तरीके से एक बिल्ली त्वचा के लिए है ..

+1

https://en.wikibooks.org/wiki/X86_Disassembly/Calling_Conventions की तुलना में आपके हेरिस्टिक को लगता है लागू करें। स्टैक पर stdcall और cdecl पास पैरामीटर दोनों। – jpa

0

आप को पता है कि सम्मेलन एक सी ++ फ़ंक्शन का उपयोग करता, अपने सबसे अच्छे आशा

  1. हैडर कि समारोह घोषणा करता है कि, और
  2. अध्ययन करने के लिए है बुला चाहते हैं
  3. आपके विशेष DLL को संकलित करने वाले संकलक के लिए प्रलेखन।

लेकिन यह पूरी चीज ईमानदारी से गड़बड़ की तरह लगती है। आपका मित्र ऐसा करने में सक्षम क्यों होना चाहता है, और प्रासंगिक कार्य घोषित करने वाले शीर्षलेख को पार्स करके उसे वह जानकारी क्यों नहीं मिल सकती है?

+0

मुझे पता है, यह एक गड़बड़ी से थोड़ा अधिक लगता है :) मैं इस कंपनी के लिए ऐसा कर रहा हूं जिसके लिए मैं इंटर्न कर रहा हूं, और यह केवल एक कार्यक्षमता है जिसे उन्हें प्रदान करने की ज़रूरत है। शर्मनाक बात यह है कि मैंने देखा है हमारे प्रतिस्पर्धियों में से एक कार्यक्रम जो मैंने वर्णन किया है, वैसा ही करता है, इसलिए मुझे पता है कि यह करने योग्य है। मुझे यकीन नहीं है कि मेरी विधि जाने का तरीका है, लेकिन मेरे पास कोई अन्य विचार नहीं है :( –

+0

I कुछ समय पहले एक लेख पढ़ें कि कंपनी ए हमेशा अपने प्रतिस्पर्धियों को कैसे बढ़ा रहा था, क्योंकि वे एक अलग भाषा का उपयोग कर रहे थे। क्या यह संभव है कि वे कुछ ऐसा कर रहे हों? हो सकता है कि उनके पास एक स्क्रिप्टिंग परत या कुछ अन्य अजीबता हो? – Narfanator

+0

इसके अलावा, यदि आपके पास है एक नमूना, उस पर वैज्ञानिक विधि पर जाएं, और यह पता लगाने की कोशिश करें कि वे इसे कैसे कर रहे हैं। – Narfanator

3

आपने यह निर्दिष्ट नहीं किया है कि आप 32-बिट या 64-बिट से बात कर रहे हैं, और आपके और अन्य पोस्टर द्वारा उल्लिखित कठिनाइयों मुख्य रूप से 32-बिट कोड पर लागू होती हैं। 64-बिट विंडोज़ पर, अनिवार्य रूप से केवल एक कॉलिंग सम्मेलन है (यह जॉन नोवेलर द्वारा लिखित विकिपीडिया लेख में भी है), जिसका अर्थ है कि आप कॉलिंग सम्मेलन को जानते हैं (निश्चित रूप से किसी के स्वयं को खाना बनाने के अपवाद के साथ) ।

इसके अलावा, माइक्रोसॉफ़्ट एक्स 64 कॉलिंग सम्मेलन के साथ, फ़ंक्शन के पैरामीटर की संख्या को नहीं जानना आपको कॉल करने से नहीं रोकता है, जैसा कि आप चाहते हैं/जितना चाहें उतने पैरामीटर प्रदान करते हैं। ऐसा इसलिए है क्योंकि आप एक कॉलर के रूप में स्टैक स्पेस को अलग करते हैं और इसे बाद में साफ करते हैं। - बेशक, दाएं [संख्या] पैरामीटर प्रदान नहीं कर सकते हैं अभी भी बुलाया गया काम मूर्खतापूर्ण चीजें कर सकता है क्योंकि आप अमान्य इनपुट प्रदान कर रहे हैं, लेकिन यह एक और कहानी है।

+0

हाँ, क्षमा करें, मेरा मतलब 32 बिट था। –

0

यह पृष्ठ जिस तरह से कुलपति ++ 6 प्रतीक नाम में पैरामीटर और बुला सम्मेलन की जानकारी encodes वर्णन करता है: http://www.bottledlight.com/docs/mangle.html

मुझे लगता है कि कुलपति ++ के बाद के संस्करणों संगत हो जाएगा, लेकिन मैं इस बात की पुष्टि नहीं की है।

भी कुछ उपकरण है कि इस जो संकलक के साथ स्वचालित रूप से कर रहे हैं: http://msdn.microsoft.com/en-us/library/5x49w699.aspx

नाम mangling केवल सी ++ कार्यों के लिए लागू होता है; यदि कोई फ़ंक्शन 'बाहरी' सी '' है तो यह काम नहीं करेगा।

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

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