2009-02-16 6 views
13

Me gustaría llamar a un método desde un dll, pero no tengo el origen ni el archivo de encabezado. Intenté usar dumpbin/exports para ver el nombre del método, pero ¿puedo encontrar la firma de los métodos?Función de llamada en C++ dll sin encabezado

¿Hay alguna manera de llamar a este método?

Gracias,

+0

¿Cuál es el nombre exacto del método mostrado por dumpbin/exports? – ChrisW

Respuesta

3

Es posible determinar una firma de función C analizando el inicio de su desmontaje. Los argumentos de la función estarán en la pila y la función hará algunos "pops" para leerlos en orden inverso. No encontrará los nombres de los argumentos, pero debería poder averiguar su número y los tipos. Las cosas pueden volverse más difíciles con el valor de retorno, puede ser a través del registro 'eax' o mediante un puntero especial pasado a la función como el último pseudoargumento (en la parte superior de la pila).

10

Si la función es un C++ uno, usted puede ser capaz de derivar la firma de la función del nombre revuelto. Dependency Walker es una herramienta que hará esto por usted. Sin embargo, si el archivo DLL se creó con un enlace C (Dependency Walker le dirá esto), entonces no tendrá suerte.

6

El lenguaje C++ no sabe nada sobre dlls.

¿Esto es en Windows? Una forma sería a:

  • abrir el archivo DLL en depends.exe enviado con (Visual Studio)
  • verificar la firma de la función que desea llamar
  • uso LoadLibrary() para conseguir cargar esta DLL (tenga cuidado sobre el camino)
  • uso GetProcAddress() para obtener un puntero a la función que desea llamar
  • uso de este puntero a función para hacer una llamada con argumentos válidos
  • uso FreeLibrary() para liberar el asa

Por cierto: Este método también se conoce comúnmente como la vinculación dinámica en tiempo de ejecución en lugar de en tiempo de compilación vinculación dinámica en la que compile las fuentes con el archivo asociado lib.

Existe algún mecanismo similar para * nix con dlopen, pero mi memoria empieza a fallar después de eso. Algo llamado objdump o nm debería comenzar con la inspección de la (s) función (es).

1

Si de hecho sabe o sospecha que la función está allí, puede cargar dinámicamente la DLL con loadLibrary y obtener un puntero a la función con getProcAddress. Consulte MSDN

Tenga en cuenta que esta es una forma manual y dinámica de cargar la biblioteca; aún tendrá que saber la firma de la función correcta para asignarla al puntero de función para usarla. AFAIK no hay forma de usar el dll en una capacidad de tiempo de carga y usar las funciones sin un archivo de encabezado.

6

Como ha encontrado, la lista de exportaciones en una DLL solo almacena nombres, no firmas. Si su DLL exporta funciones C, probablemente tendrá que desarmar e invertir las funciones para determinar las firmas de método. Sin embargo, C++ codifica la firma del método en el nombre de la exportación. Este proceso de combinación del nombre del método y la firma se llama "name mangling". This Stackoverflow question tiene una referencia para determinar la firma del método del nombre de exportación mutilado.

Probar la utilidad "Dependency Walker" (a.k.a. "depends") gratuita. La opción "Undecorate C++ Functions" debe determinar la firma de un método C++.

1

Llamar a funciones no externas es una excelente manera de romper su programa cada vez que se actualice la DLL de terceros.

Dicho esto, la utilidad undname también puede ser útil.

Cuestiones relacionadas