2009-01-12 10 views
50

द्वारा उजागर किए गए सभी कार्यों को खोजने का कोई तरीका है। मैं सभी तारों को प्राप्त करने का एक तरीका खोज रहा हूं जो एक डीएल में कार्य नामों के लिए मानचित्र हैं।क्या एक डीएल

मेरा मतलब यह है कि आप सभी स्ट्रिंग्स के लिए GetProcAddress को कॉल कर सकते हैं। यदि आप एक डीएलएल के हेक्स डंप करते हैं तो प्रतीकों (तार) वहां हैं लेकिन मुझे लगता है कि उन नामों को प्राप्त करने के लिए मुझे सिस्टम कॉल करना होगा।

+1

सिर्फ एक nitpick है, लेकिन मुझे लगता है कि आप मतलब> लेकिन मैं समझ एक सिस्टम कॉल –

+0

आप इसे programmaticly करने के लिए एक रास्ता के लिए देख रहे हैं वहाँ होना चाहिए, देखें मेरा जवाब आगे नीचे। – Aaron

+1

यह भी ध्यान रखें कि डीएलएल उन कार्यों को निर्यात कर सकता है जिनमें स्ट्रिंग नाम नहीं हैं, और इन्हें अपने ordinal के माध्यम से एक्सेस किया जाना चाहिए। –

उत्तर

7

यह काम का एक सा लगता है, लेकिन आप programmaticly Microsoft से DbgHelp लाइब्रेरी का उपयोग कर सकते हैं।

Debugging Applications for Microsoft .Net and Microsoft Windows, by John Robbins एक उत्कृष्ट (यदि छोटी पुरानी) किताब है जिसमें उपयोग विवरण और पूर्ण स्रोत शामिल है। और, आप सस्ते के लिए अमेज़ॅन पर इसे चुन सकते हैं!

66

यदि आपके पास एमएस विजुअल स्टूडियो है, तो डंपबिन नामक एक कमांड लाइन टूल है।

dumpbin /exports <nameofdll>
+2

... के रूप में भी जाना जाता है: link.exe/डंप/निर्यात – reuben

+0

आप नहीं करते वीएस की भी आवश्यकता नहीं है आप बस एमएस विंडोज एसडीके डाउनलोड कर सकते हैं, और इसमें सीएमडी शैल का उपयोग कर सकते हैं। बहुत उपयोगी। – MeanwhileInHell

+1

अद्भुत। इसे स्वीकृत उत्तर –

24

इसके अलावा http://www.dependencywalker.com/

+0

वैकल्पिक रूप से डी-मैंगल कर सकते हैं, निर्भरता प्लेटफ़ॉर्म एसडीके स्थापना में भी उपलब्ध है। –

+0

@ ग्रेग एसडीके में संस्करण वेबसाइट पर मौजूद कुछ संस्करण पुराने हैं। शायद इसके साथ ठीक है, लेकिन साथ ही स्रोत की पुन: सिफारिश कर सकते हैं .. – Aaron

7

पर निर्भर करता है कार्यक्रम मैं dumpbinGUI का उपयोग करें, जो आप (और एक बहुत अधिक) Windows Explorer में राइट क्लिक से निर्यात की सूची देता है। dumpbin और depends दोनों आपको सूचियां भी देंगे।

+0

डंपबिनगुई लिंक टूटा हुआ है .. –

+1

http://sourceforge.net/projects/c-sharp/files/dumpbinGUI/ –

10

मुझे ऐसा करने के लिए WIn32 API के बारे में पता नहीं है: इसके बजाय, आप (या अन्य पोस्ट में उल्लिखित टूल में से एक) पीई फ़ाइल के बाइनरी प्रारूप को जानकर और फ़ाइल को पढ़कर करते हैं: http://msdn.microsoft.com/en-us/magazine/cc301808.aspx देखें (और उस लेख में "पेडम्प" उपयोगिता का उल्लेख किया गया है)।

+0

एक उत्कृष्ट उत्तर, जिसे मैं मतदान कर रहा हूं, लेकिन मैं निश्चित संदर्भ दस्तावेज़ में लिंक जोड़ूंगा पीई फ़ाइल प्रारूप पर: http://www.microsoft.com/whdc/system/platform/firmware/PECOFF.mspx –

0

मुझे लगता है कि आप पार्सिंग पीई फ़ाइल को समाप्त कर देंगे और अगर आप रनटाइम में अज्ञात डीएल के फ़ंक्शन नाम या बेहद बेकार सिस्टम ("डंपबिन") ढूंढना चाहते हैं तो खुद को बदनाम कर दें; जादू।

आपको जो चाहिए आप इसके बारे में और स्पष्ट होना चाहिए।

BFD लाइब्रेरी जो आप चाहते हैं (और रसोई सिंक) जो कई जीएनयू binutils उपकरण का मुख्य घटक है। मुझे यकीन नहीं है कि यह आपकी समस्या के अनुरूप होगा या नहीं।

5

आपको .dll के पीई हेडर का निरीक्षण करने की आवश्यकता है, क्योंकि आखिरकार विंडोज़ वैसे भी करता है।

आप .dll के IMAGE_OPTIONAL_HEADER के लिए सूचक मानते हुए है (यदि आप एक .dll लोड करने के लिए एक संभाल के साथ dbghelp के ImageNtHeader समारोह उपयोग कर सकते हैं LoadLibrary के माध्यम से या यदि आप अपने आप को .dll के लेआउट पता है कि यह अपने आप को खोजने का प्रयास), आप optional_header->DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT] पर देखना चाहते हैं, वहां ऑफ़सेट के साथ वैकल्पिक शीर्षलेख के सापेक्ष निर्यात तालिका ढूंढें, फिर निर्यात तालिका पर जाएं (यह IMAGE_EXPORT_DIRECTORY है)।

funsies के लिए, पिछली संगत पीई छवि IMAGE_DOS_HEADER के साथ शुरू होती है; IMAGE_NT_HEADER पर ऑफसेट IMAGE_DOS_HEADER::e_lfanew है, और IMAGE_OPTIONAL_HEADER एनटी हेडर में एम्बेड किया गया है।

0

आप किसी भी उपकरण की जरूरत नहीं है और आप पीई पार्स करने के लिए की जरूरत नहीं है। बस मानक Win32 एपीआई (डी) का उपयोग

कोड (सी में) Adv.Win32 पर कई बार प्रकाशित किया गया है एपीआई एनजी ( खबर: //comp.os.ms-windows.programmer.win32) (के बाद से 1992 ...)

+0

क्या आप ऐसा करने के लिए कोड दिखा सकते हैं? यहां तक ​​कि विशिष्ट समारोह के लिए एक लिंक मदद मिलेगी। – minty

30

वहाँ DLLs के पास तीन अलग प्रकार Windows के तहत कर रहे हैं:

  1. क्लासिक DLLs कि DLL के निर्यात तालिका में हर उपलब्ध समारोह का पर्दाफाश। आप dumpbin.exe का उपयोग कर सकते हैं या निर्भर करता है।इन प्रकारों की जांच के लिए विजुअल स्टूडियो से बाहर निकलें, या मुफ्त dependency walker। मैट Pietrek Win32 पीई फाइलों में खुदाई के लिए कई लेख और उपयोगिता लिखी। अपने क्लासिक MSDN Magazine articles पर एक नज़र डालें। निर्यातित कक्षाएं रखने वाले सी ++ डीएलएल कक्षा में हर विधि निर्यात करेंगे। दुर्भाग्य से यह उलझन वाले नाम निर्यात करता है, इसलिए डंपबिन का उत्पादन लगभग अपठनीय है। आउटपुट को डिमंगल करने के लिए आपको vC++ _ filt.exe जैसे प्रोग्राम का उपयोग करने की आवश्यकता होगी।

  2. COM DLLs जो COM ऑब्जेक्ट्स का पर्दाफाश करते हैं। ये डीएलएल नियमित रूप से निर्यात किए गए कार्यों (DllRegisterServer आदि) का एक मुट्ठी भर खुलासा करते हैं जो COM सिस्टम को ऑब्जेक्ट्स को चालू करने में सक्षम बनाता है। ऐसी कई सुविधाएं हैं जो इन डीएलएल को देख सकती हैं, लेकिन जब तक वे एम्बेडेड टाइप लाइब्रेरी नहीं रखते हैं, तो उन्हें जांचना मुश्किल हो सकता है। 4Developers में कई अच्छे COM/ActiveX उपकरण

  3. .NET DLLs जिनमें .NET असेंबली शामिल हैं। आमतौर पर आप इन्हें खोदने के लिए .NET Reflector जैसे टूल का उपयोग करेंगे।

11

इस (लिनक्स) सी कोड का प्रयास करें:

#include <fcntl.h> 
#include <stdio.h> 
#include <sys/mman.h> 
#include <sys/stat.h> 
#include <sys/types.h> 
#include <unistd.h> 

unsigned int vpe2offset(void * base, unsigned int vpe) { 
    unsigned int * ptr = base; 
    unsigned int pe_offset; 
    unsigned short num_sections; 

    pe_offset = ptr[0x3c/4];        //PE header offset 
    ptr = base + pe_offset;        //PE header address 
    num_sections = ((unsigned short*)ptr)[6/2];   //Section count 
    ptr = ((void*)base) + 0x18 + 0x60 + 16*8 + pe_offset;//Address of first section 

    while (num_sections--) { 
     if (vpe >= ptr[0x0c/4] && vpe < ptr[0x0c/4] + ptr[0x10/4]) { 
      return vpe - ptr[0x0c/4] + ptr[0x14/4]; 
     } 
     ptr += 0x28/4; 
    } 

    return 0; 
} 

void iterate_exports(void * base, int(*iterator)(char*)) { 
    unsigned int * ptr = base; 
    unsigned int pe_offset, 
       exports_offset, 
       number_of_names, 
       address_of_names; 

    pe_offset = ptr[0x3c/4]; 
    ptr = base + pe_offset; 
    exports_offset = ptr[0x78/4]; 
    ptr = base + vpe2offset(base, exports_offset); 
    number_of_names = ptr[0x18/4]; 
    address_of_names = ptr[0x20/4]; 
    ptr = base + vpe2offset(base, address_of_names); 
    while (number_of_names-- && iterator((char*)(base + vpe2offset(base, ptr++[0])))) { 
     /* Do nothing */ 
    } 
} 

int print_symbol_name(char * name) { 
    printf("%s\n", name); 
    return 1; 
} 

int main(int argc, char const *argv[]) { 
    int fd; 
    struct stat st; 
    void * base; 

    if (argc == 1) { 
     printf("Usage: %s <dll>\n", argv[0]); 
    } else if (stat(argv[1], &st) == 0 && (fd = open(argv[1], O_RDONLY)) >= 0) { 
     base = mmap(NULL, st.st_size, PROT_READ, MAP_PRIVATE, fd, 0); 
     if (base != MAP_FAILED) { 
      iterate_exports(base, print_symbol_name); 
      munmap(base, st.st_size); 
     } else { 
      fprintf(stderr, "Could not map \"%s\".\n", argv[1]); 
     } 
     close(fd); 
    } else { 
     fprintf(stderr, "Could not open \"%s\" for reading.\n", argv[1]); 
    } 
    return 0; 
} 

यह पीई फ़ाइल के अंदर संदर्भ अनुसरण करता है और अंत में प्रत्येक निर्यात प्रतीक के लिए एक कॉलबैक फ़ंक्शन कॉल करता है। पीई फ़ाइल प्रारूप के एक सिंहावलोकन के लिए यह देखें: http://www.openrce.org/reference_library/files/reference/PE%20Format.pdf

+0

यह वास्तव में मेरे जीवन में पढ़ा जाने वाला सबसे अच्छा जवाब है। –

0

आप विंडोज़ के तहत "objdump" linux टूल का भी उपयोग कर सकते हैं, लेकिन आपको पहले साइगविन इंस्टॉल करना पड़ सकता है।

मैं निम्न कमांड का उपयोग करें:

# feed the output to less 
objdump -x nameOfThe.Dll| less 
# or use egrep to filter 
objdump -x /cygdrive/c/Windows/system32/user32.dll | \ 
    egrep "^\s*\[[ [:digit:]]{4}\] \w{1,}" | less 
संबंधित मुद्दे