Win32/Dll: ¿La dirección a la que se salta cuando se llama a una función DLL?

Cuando se ejecuta una instrucción de "llamada" para llamar a una función exportada de DLL, establece el EIP en la dirección de la función almacenada en la DLL. Si otro programa que se está ejecutando al mismo tiempo llama a esta misma función que pertenece a esta misma DLL, ¿la dirección de salto será la misma?

preguntado el 03 de mayo de 12 a las 09:05

¿Por qué eso importa? ¿Que problema estas tratando de resolver? -

¿Por qué preguntar esto? ¿Cómo podría beneficiarte este conocimiento? En el espacio de direcciones virtuales, la respuesta es "tal vez, pero no deberías contar con eso de todos modos". -

Porque quiero saber si la instancia de una DLL es algo que pertenece al proceso o algo más. Si muchos programas utilizan una DLL al mismo tiempo, ¿significa que esta DLL tendrá muchas instancias? -

2 Respuestas

La respuesta corta es eso depende.

Las DLL están organizadas en secciones y cada sección se puede compartir por muchos procesos. Por lo general, solo se comparten solo las secciones de código (cuando DLL se carga en la misma dirección base) y cada proceso tiene su sección de datos privados.

Una de las ventajas de DLL es que comparte su código entre muchos procesos (entonces ahorra memoria del sistema porque el sistema no cargará muchas instancias de ellos). Por supuesto, los datos no pueden (generalmente) compartirse, por lo que debe ser duplicada para cada instancia.

Esto significa que generalmente la memoria para el código DLL se comparte entre diferentes procesos, entonces puede tener la misma dirección. Dije "puede" por Espacio de direcciones virtual, incluso si se comparte la memoria, no se garantiza que tenga la misma dirección en todos los procesos. Para una prueba rápida de uso GetProcAddress y ejecute el proceso muchas veces para comparar la dirección de la función, puede usar este programa simple desde MSDN:

#include <windows.h>
#include <iostream>

void _tmain()
{
    typedef void (WINAPI *PGNSI)(LPSYSTEM_INFO);

   SYSTEM_INFO si;
   ZeroMemory(&si, sizeof(SYSTEM_INFO));

   PGNSI fnGetNativeSystemInfo = reinterpret_cast<PGNSI>(GetProcAddress(
       GetModuleHandle(TEXT("kernel32.dll")),  "GetNativeSystemInfo"));

   std::cout << fnGetNativeSystemInfo << std::endl;
}

Debería ver (generalmente) la misma dirección para cada función exportada, pero es posible que no. Nunca es una buena idea confiar en este comportamiento. Ok, esta es la historia, pero algo cambió en los últimos años debido a ASLR, echa un vistazo a esta publicación

Si tiene que compartir datos entre procesos usando la misma DLL, es mejor que use algo de memoria compartida, eche un vistazo a este artículo en MSDN para un ejemplo.

contestado el 23 de mayo de 12 a las 19:05

Como otros programas/procesos se asignan a su propio espacio de direcciones separado, dudo que la dirección sea la misma.

contestado el 03 de mayo de 12 a las 09:05

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.