¿Hay alguna forma de encontrar todas las funciones expuestas por un dll?

He estado buscando una forma de obtener todas las cadenas que se asignan a los nombres de funciones en un dll.

Quiero decir con esto todas las cadenas para las que puedes llamar a GetProcAddress. Si haces un volcado hexadecimal de un dll, los símbolos (cadenas) están ahí, pero supongo que debe haber una llamada al sistema para adquirir esos nombres.

Toma un poco de trabajo, pero puede hacerlo programáticamente utilizando la biblioteca DbgHelp de Microsoft.

Depuración de aplicaciones para Microsoft .Net y Microsoft Windows, por John Robbins es un excelente (si es un poco más antiguo) libro que contiene detalles de uso y fuente completa. ¡Y puedes comprarlo en Amazon por poco dinero!

Si tiene MS Visual Studio, hay una herramienta de línea de comandos llamada DUMPBIN.

  dumpbin / exports  

Hay tres tipos distintos de DLL en Windows:

  1. DLL clásicos que exponen todas las funciones disponibles en la tabla de exportaciones de la DLL. Puede usar dumpbin.exe o depends.exe desde Visual Studio, o el caminador de dependencias gratuito para examinar estos tipos. Matt Pietrek escribió muchos artículos y utilidades para profundizar en archivos Win32 PE. Eche un vistazo a sus artículos clásicos de MSDN Magazine . C ++ DLL que contienen clases exportadas exportará todos los métodos en la clase. Desafortunadamente, exporta los nombres destrozados, por lo que la salida de dumpbin es prácticamente ilegible. Deberá usar un progtwig como vc ++ _ filt.exe para exigir la salida.

  2. DLL COM que exponen objetos COM. Estas DLL exponen un puñado de funciones exportadas regularmente (DllRegisterServer, etc.) que permiten que el sistema COM cree instancias de objetos. Hay muchas utilidades que pueden ver estos archivos DLL, pero a menos que tengan bibliotecas de tipos incrustados, pueden ser bastante difíciles de examinar. 4 Los desarrolladores tienen una serie de buenas herramientas COM / ActiveX

  3. .NET DLL que contienen ensamblados .NET. Típicamente usaría una herramienta como .NET Reflector para profundizar en estos.

Editar: el enlace 4Desarrolladores no funciona.

También está el progtwig DEPENDs en http://www.dependencywalker.com/

Pruebe este código C (Linux):

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

Sigue las referencias dentro del archivo PE y finalmente llama a una función de callback para cada símbolo exportado. Para obtener una descripción general del formato de archivo PE, consulte esto: http://www.openrce.org/reference_library/files/reference/PE%20Format.pdf

No conozco una API WIn32 para hacerlo: en su lugar, usted (o una de las herramientas mencionadas en otras publicaciones) lo hace conociendo el formato binario de un archivo PE y leyendo el archivo: consulte http: // msdn .microsoft.com / es-us / magazine / cc301808.aspx (y ese artículo menciona una utilidad “PEDUMP”).

Yo uso dumpbinGUI , que le da la lista de exportaciones (y mucho más) de un clic derecho en el Explorador de Windows. dumpbin y depends te darán las listas también.

Debes inspeccionar el encabezado PE de .dll, ya que, en última instancia, eso es lo que Windows hace de todos modos.

Suponiendo que tiene un puntero al .dll IMAGE_OPTIONAL_HEADER (puede usar la función ImageNtHeader de ImageNtHeader con un controlador para un .dll cargado a través de LoadLibrary o intentar encontrarlo usted mismo si conoce el diseño del .dll por su cuenta), querrá para ver optional_header->DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT] , encuentre la tabla de exportación relativa al encabezado opcional con el desplazamiento allí, luego recorra la tabla de exportación (es un IMAGE_EXPORT_DIRECTORY ).

Para los juegos, una imagen PE compatible con versiones anteriores comienza con un IMAGE_DOS_HEADER ; el desplazamiento a IMAGE_NT_HEADER es IMAGE_DOS_HEADER::e_lfanew , y IMAGE_OPTIONAL_HEADER está incrustado en el encabezado NT.

hay un progtwig llamado dll export viewer que puede usar: http://www.nirsoft.net/utils/dll_export_viewer.html

Siempre tengo que hacer esto. Solo voy a uno de estos sitios. Ellos alojan la información que generalmente necesitamos.

Información del archivo DLL de Windows 7

Información del archivo DLL de Windows XP

También puede usar la herramienta de Linux “objdump” en Windows, pero es posible que primero tenga que instalar cygwin.

Yo uso los siguientes comandos:

 # 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 

Supongo que terminarás analizando el archivo PE y te exigirás si quieres encontrar los nombres de las funciones de un dll desconocido en el sistema de ejecución o extremadamente inútil (“dumpbin”); magia.

Deberías ser más claro sobre lo que quieres.

La biblioteca de BFD hace lo que quiere (y el fregadero de la cocina) que es el componente principal de varias herramientas de binutils de GNU. No puedo estar seguro de si se ajustará a tu problema.

No necesita ninguna herramienta y no necesita analizar PE. Solo use la api estándar de Win32 (D)

El código (en C) ha sido publicado muchas veces en Adv.Win32 api ng (news: //comp.os.ms-windows.programmer.win32) (desde 1992 …)