C’è un modo per trovare tutte le funzioni esposte da una DLL

Ho cercato un modo per ottenere tutte le stringhe che mappano i nomi delle funzioni in una DLL.

Intendo con questo tutte le stringhe per le quali puoi chiamare GetProcAddress. Se fai un dump esadecimale di una dll i simboli (stringhe) ci sono ma immagino che ci debba essere una chiamata di sistema per acquisire quei nomi.

Ci vuole un po ‘di lavoro, ma puoi farlo programmaticamente usando la libreria DbgHelp di Microsoft.

Debug delle applicazioni per Microsoft .Net e Microsoft Windows, di John Robbins è un eccellente (se un po ‘più vecchio) libro che contiene i dettagli sull’utilizzo e la fonte completa. E puoi prenderlo su Amazon a basso prezzo!

Se hai MS Visual Studio, c’è uno strumento da riga di comando chiamato DUMPBIN.

  dumpbin / exports  

Esistono tre diversi tipi di DLL in Windows:

  1. DLL classiche che espongono tutte le funzioni disponibili nella tabella delle esportazioni della DLL. È ansible utilizzare dumpbin.exe o depends.exe da Visual Studio o il walker della dipendenza gratuito per esaminare questi tipi. Matt Pietrek ha scritto molti articoli e utilità per scavare nei file Win32 PE. Dai un’occhiata ai suoi articoli classici su MSDN Magazine . Le DLL C ++ che contengono classi esportate esporranno ogni metodo nella class. Sfortunatamente esporta i nomi storti, quindi l’output di dumpbin è praticamente illeggibile. Sarà necessario utilizzare un programma come vc ++ _ filt.exe per demangular l’output.

  2. DLL COM che espongono oggetti COM. Queste DLL espongono una manciata di funzioni regolari esportate (DllRegisterServer ecc.) Che consentono al sistema COM di creare un’istanza di oggetti. Esistono molte utilità che possono esaminare queste DLL, ma a meno che non abbiano librerie di tipi incorporate possono essere abbastanza difficili da esaminare. 4 Gli sviluppatori hanno un numero di buoni strumenti COM / ActiveX

  3. DLL .NET che contengono assembly .NET. Tipicamente useresti uno strumento come .NET Reflector per scavare in questi.

Modifica: il collegamento 4Developers non funziona.

Inoltre c’è il programma DEPENDs all’indirizzo http://www.dependencywalker.com/

Prova questo codice (Linux) C:

 #include  #include  #include  #include  #include  #include  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 \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; } 

Segue riferimenti all’interno del file PE e infine chiama una funzione di callback per ogni simbolo esportato. Per una panoramica del formato di file PE vedere: http://www.openrce.org/reference_library/files/reference/PE%20Format.pdf

Non conosco un’API WIn32 per farlo: invece, tu (o uno degli strumenti menzionati in altri post) lo fai conoscendo il formato binario di un file PE e leggendo il file: vedi http: // msdn .microsoft.com / it / us / magazine / cc301808.aspx (e quell’articolo menzionava un’utilità “PEDUMP”).

Io uso dumpbinGUI , che ti dà la lista delle esportazioni (e molto altro) da un clic destro in Windows Explorer. dumpbin e depends ti daranno anche le liste.

È necessario controllare l’intestazione PE di .dll, poiché in fin dei conti è ciò che fa Windows.

Supponendo che tu abbia un puntatore IMAGE_OPTIONAL_HEADER di .dll (puoi utilizzare la funzione ImageNtHeader di ImageNtHeader con un handle per un dll caricato tramite LoadLibrary o LoadLibrary a trovarlo tu stesso se conosci il layout del file .dll), ti consigliamo per visualizzare optional_header->DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT] , trova la tabella di esportazione relativa all’intestazione opzionale con l’offset in là, quindi cammina nella tabella di esportazione (è un IMAGE_EXPORT_DIRECTORY ).

Per i funs, l’immagine PE compatibile con le versioni precedenti inizia con un IMAGE_DOS_HEADER ; l’offset di IMAGE_NT_HEADER è IMAGE_DOS_HEADER::e_lfanew e IMAGE_OPTIONAL_HEADER è incorporato nell’intestazione NT.

c’è un programma chiamato dll export viewer che puoi usare: http://www.nirsoft.net/utils/dll_export_viewer.html

Devo sempre farlo. Vado in uno di questi siti. Ospitano le informazioni che di solito abbiamo bisogno.

Informazioni sul file DLL di Windows 7

Informazioni sul file DLL di Windows XP

Puoi anche usare lo strumento linux “objdump” sotto windows, ma potresti dover installare prima cygwin.

Io uso i seguenti comandi:

 # 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 

Immagino che finirai per analizzare il file PE e fare il demangling se vuoi trovare i nomi delle funzioni di una dll sconosciuta nel runtime o in un sistema estremamente inutile (“dumpbin”); Magia.

Dovresti essere più chiaro su ciò che vuoi.

La libreria BFD fa quello che vuoi (e il lavello della cucina) che è il componente principale di diversi strumenti GNU binutils. Non posso essere sicuro che si adatti al tuo problema.

Non hai bisogno di nessuno strumento e non hai bisogno di analizzare PE. Basta usare lo standard Win32 api (D)

Il codice (in C) è stato pubblicato molte volte su Adv.Win32 api ng (news: //comp.os.ms-windows.programmer.win32) (dal 1992 …)