दिलचस्प पोस्ट
सी – एक फ़ंक्शन में एक मैट्रिक्स आवंटित स्थानीय XML स्कीमा फ़ाइल को सही तरीके से संदर्भ कैसे करें? मैं ज्येथोन में विभिन्न पायथन लाइब्रेरी कैसे स्थापित कर सकता हूं? मुझे इनलाइन बनाम बाहरी जावास्क्रिप्ट का उपयोग कब करना चाहिए? कस्टम फ़्रेम में Array.prototype जोड़ना टाइमटेम्प्स ऑफसेट के साथ ऑफटाईट को टाइमटाइम कन्वर्ट करें मैं Node.js के साथ एक HTML पृष्ठ को कैसे पार्स कर सकता हूं? वेबफॉर्म्स UnobtrusiveValidationMode को 'jquery' के लिए एक ScriptResourceMapping की आवश्यकता है कृपया एक जेपीआरआरससोर्समैपिंग जेक्जरी (केस-संवेदी) नाम दें यह कैसे करें Laravel में, subquery जहां में क्या ऊंचाई और चौड़ाई अवधि के लिए लागू नहीं होती है? PHP पुनरावर्ती निर्देशिका पथ बाइनरी खोज की जटिलता की गणना कैसे करें एंड्रॉइड में जीएसओएन या किसी अन्य लाइब्रेरी का उपयोग किए बिना स्ट्रोरिंग के रूप में प्रतिक्रिया कैसे प्राप्त करें विजुअल स्टूडियो 2010 और VB.NET में वैश्विक चर की घोषणा करें नियमित अभिव्यक्तियों के साथ मिलान करने वाले नंबर – केवल अंक और अल्पविराम

डेल निर्यात फ़ंक्शन को एन्यूमरेट करने के लिए Win32 API?

मुझे भी इसी तरह के सवालों का जवाब मिला, लेकिन मैं जो कुछ देख रहा हूं उसका कोई जवाब नहीं मिला। तो यहाँ जाता है:

एक देशी Win32 dll के लिए, वहाँ एक Win32 एपीआई अपने निर्यात समारोह नामों की गणना करने के लिए है?

वेब के समाधान से एकत्रित समाधान "डेल निर्यात फ़ंक्शन को एन्यूमरेट करने के लिए Win32 API?"

dumpbin /exports बहुत ज्यादा है जो आप चाहते हैं, लेकिन यह एक डेवलपर टूल है, न कि Win32 API।

DONT_RESOLVE_DLL_REFERENCES साथ LoadLibraryEx को भारी चेतावनी दी गई है, लेकिन इस विशेष मामले के लिए उपयोगी साबित होता है – यह डीएलएल को मेमोरी में मैप करने का भारी भार DONT_RESOLVE_DLL_REFERENCES है (लेकिन आपको वास्तव में जरूरत नहीं है या पुस्तकालय से कुछ भी उपयोग करना है), जो इसे बनाता है आपके लिए हेडर को पढ़ने के लिए तुच्छ: मॉड्यूल संभाल LoadLibraryEx द्वारा उसके पास वापस आया।

 #include <winnt.h> HMODULE lib = LoadLibraryEx("library.dll", NULL, DONT_RESOLVE_DLL_REFERENCES); assert(((PIMAGE_DOS_HEADER)lib)->e_magic == IMAGE_DOS_SIGNATURE); PIMAGE_NT_HEADERS header = (PIMAGE_NT_HEADERS)((BYTE *)lib + ((PIMAGE_DOS_HEADER)lib)->e_lfanew); assert(header->Signature == IMAGE_NT_SIGNATURE); assert(header->OptionalHeader.NumberOfRvaAndSizes > 0); PIMAGE_EXPORT_DIRECTORY exports = (PIMAGE_EXPORT_DIRECTORY)((BYTE *)lib + header-> OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress); assert(exports->AddressOfNames != 0); BYTE** names = (BYTE**)((int)lib + exports->AddressOfNames); for (int i = 0; i < exports->NumberOfNames; i++) printf("Export: %s\n", (BYTE *)lib + (int)names[i]); 

पूरी तरह से untested, लेकिन मुझे लगता है कि यह अधिक या कम सही है (प्रसिद्ध अंतिम शब्द।)

माइक्रोसॉफ्ट रिसर्च पर जाएं और ऑटोरस लाइब्रेरी को पकड़ो। इसके उदाहरणों में से एक आप वास्तव में क्या पूछ रहे हैं। पूरी लाइब्रेरी मूल रूप से Win32 फ़ंक्शन कॉल को बेहद आसान बनाने और फिर से रोका जा रहा है। इसकी बहुत अच्छी चीजें

मार्ग-परिवर्तन

संपादित करें: यह भी ध्यान रखें कि यदि आप बस निर्यात तालिका देखना चाहते हैं, तो आप (कम से कम विज़ुअल स्टूडियो में) निर्यात / आयात सारणी प्रिंट करने के लिए अपनी प्रॉपर्टी प्रॉपर्टी सेट कर सकते हैं। मुझे सटीक विकल्प याद नहीं है, लेकिन Google के लिए आसान होना चाहिए

** संपादन 2: ** यह विकल्प परियोजना गुण-> लिंकर-> डिबगिंग-> जनरेट करें मेपाइल -> हां (/ एमएपी)

जबकि इहेमियेंग सही है कि DONT_RESOLVE_DLL_REFERENCES साथ LoadLibraryEx इस कार्य को बहुत आसान बना सकता है, आप उसे दिखाते हैं कि इससे भी सरल बना सकते हैं। डीएलएल की निर्यात निर्देशिका को खोजने और उसके बारे में जानने के बजाय, आप अपने लिए प्रतीकों की सूची के लिए SymEnumerateSymbols का उपयोग कर सकते हैं।

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

इसे इस्तेमाल करे:

 #include <stdio.h> #include <string.h> #include <stdlib.h> void EnumExportedFunctions (char *, void (*callback)(char*)); int Rva2Offset (unsigned int); typedef struct { unsigned char Name[8]; unsigned int VirtualSize; unsigned int VirtualAddress; unsigned int SizeOfRawData; unsigned int PointerToRawData; unsigned int PointerToRelocations; unsigned int PointerToLineNumbers; unsigned short NumberOfRelocations; unsigned short NumberOfLineNumbers; unsigned int Characteristics; } sectionHeader; sectionHeader *sections; unsigned int NumberOfSections = 0; int Rva2Offset (unsigned int rva) { int i = 0; for (i = 0; i < NumberOfSections; i++) { unsigned int x = sections[i].VirtualAddress + sections[i].SizeOfRawData; if (x >= rva) { return sections[i].PointerToRawData + (rva + sections[i].SizeOfRawData) - x; } } return -1; } void EnumExportedFunctions (char *szFilename, void (*callback)(char*)) { FILE *hFile = fopen (szFilename, "rb"); if (hFile != NULL) { if (fgetc (hFile) == 'M' && fgetc (hFile) == 'Z') { unsigned int e_lfanew = 0; unsigned int NumberOfRvaAndSizes = 0; unsigned int ExportVirtualAddress = 0; unsigned int ExportSize = 0; int i = 0; fseek (hFile, 0x3C, SEEK_SET); fread (&e_lfanew, 4, 1, hFile); fseek (hFile, e_lfanew + 6, SEEK_SET); fread (&NumberOfSections, 2, 1, hFile); fseek (hFile, 108, SEEK_CUR); fread (&NumberOfRvaAndSizes, 4, 1, hFile); if (NumberOfRvaAndSizes == 16) { fread (&ExportVirtualAddress, 4, 1, hFile); fread (&ExportSize, 4, 1, hFile); if (ExportVirtualAddress > 0 && ExportSize > 0) { fseek (hFile, 120, SEEK_CUR); if (NumberOfSections > 0) { sections = (sectionHeader *) malloc (NumberOfSections * sizeof (sectionHeader)); for (i = 0; i < NumberOfSections; i++) { fread (sections[i].Name, 8, 1, hFile); fread (&sections[i].VirtualSize, 4, 1, hFile); fread (&sections[i].VirtualAddress, 4, 1, hFile); fread (&sections[i].SizeOfRawData, 4, 1, hFile); fread (&sections[i].PointerToRawData, 4, 1, hFile); fread (&sections[i].PointerToRelocations, 4, 1, hFile); fread (&sections[i].PointerToLineNumbers, 4, 1, hFile); fread (&sections[i].NumberOfRelocations, 2, 1, hFile); fread (&sections[i].NumberOfLineNumbers, 2, 1, hFile); fread (&sections[i].Characteristics, 4, 1, hFile); } unsigned int NumberOfNames = 0; unsigned int AddressOfNames = 0; int offset = Rva2Offset (ExportVirtualAddress); fseek (hFile, offset + 24, SEEK_SET); fread (&NumberOfNames, 4, 1, hFile); fseek (hFile, 4, SEEK_CUR); fread (&AddressOfNames, 4, 1, hFile); unsigned int namesOffset = Rva2Offset (AddressOfNames), pos = 0; fseek (hFile, namesOffset, SEEK_SET); for (i = 0; i < NumberOfNames; i++) { unsigned int y = 0; fread (&y, 4, 1, hFile); pos = ftell (hFile); fseek (hFile, Rva2Offset (y), SEEK_SET); char c = fgetc (hFile); int szNameLen = 0; while (c != '\0') { c = fgetc (hFile); szNameLen++; } fseek (hFile, (-szNameLen)-1, SEEK_CUR); char* szName = calloc (szNameLen + 1, 1); fread (szName, szNameLen, 1, hFile); callback (szName); fseek (hFile, pos, SEEK_SET); } } } } } fclose (hFile); } } 

उदाहरण:

 void mycallback (char* szName) { printf ("%s\n", szName); } int main () { EnumExportedFunctions ("C:\\Windows\\System32\\user32.dll", mycallback); return 0; } 

उत्पादन:

 ActivateKeyboardLayout AddClipboardFormatListener AdjustWindowRect AdjustWindowRectEx AlignRects AllowForegroundActivation AllowSetForegroundWindow AnimateWindow AnyPopup AppendMenuA AppendMenuW ArrangeIconicWindows AttachThreadInput BeginDeferWindowPos BeginPaint BlockInput BringWindowToTop BroadcastSystemMessage BroadcastSystemMessageA BroadcastSystemMessageExA BroadcastSystemMessageExW BroadcastSystemMessageW BuildReasonArray CalcMenuBar .....etc 

यदि आप अपना कोड लिखने की परेशानी में नहीं जाना चाहते हैं और इस उद्देश्य के लिए पहले से मौजूद एक DLL का उपयोग करना चाहते हैं, तो मैं पीई फ़ाइल प्रारूप डीएलएल की सिफारिश करता हूं। स्रोत कोड के साथ आता है ताकि आप चाहें तो संशोधित कर सकें। कोई भी जीपीएल चिंता करने की नहीं।

इसके अलावा एक जीयूआई एप्लीकेशन भी उपलब्ध है जो दिखाती है कि डीएलएल का इस्तेमाल कैसे किया जाए।

यदि आप केवल DLL में कौन से फ़ंक्शन निर्यात किए जाने का तरीका ढूंढ रहे हैं, तो आप माइक्रोसॉफ्ट के निर्भरता वॉकर (निर्भर.एक्सए) का उपयोग कर सकते हैं। यदि आपको वास्तव में एक्सपोर्ट प्रोग्राम की खोज करने की ज़रूरत है तो यह आपकी मदद नहीं करेगी, यद्यपि।

मैं गलत हो सकता है, और मैंने ईमानदारी से दो बार जांच नहीं की है, लेकिन मेरा मानना ​​है कि कुछ संगतता समस्याएं उस मॉड्यूल पर उपेक्षित कोड का उपयोग कर सकती हैं जो आपकी प्रक्रिया के मुकाबले किसी अन्य आर्किटेक्चर के तहत बनाई गई है। (फिर से, मैं अभी अपने गधे से पूरी तरह से बोल सकता हूं)

गिटूब पर एक परियोजना है, जिसे dll2def कहा जाता है जो उसी तकनीक का उपयोग करता है (यद्यपि यह फ़ाइल को अपनी स्मृति में लोड करता है), लेकिन बाइनरी के आर्किटेक्चर के आधार पर निर्यात को खोजने के लिए कुछ चेक लगते हैं आपके द्वारा सबसे अधिक दिलचस्पी वाला कोड इस फ़ाइल में है