2012-06-10 13 views
5

Desensamblé una DLL y veo algunas funciones. Encontré la función que necesito y su dirección es 0x10001340.¿es posible cambiar la dirección de la función en DLL si se cargó en la aplicación?

¿Esta dirección se mantendría igual si cargaba esta dll en mi aplicación? Entonces, ¿sería posible llamar esa función por su dirección desde mi aplicación?

Lo estoy preguntando porque no estoy seguro: ¿qué pasa si cuando se carga este dll, alguna función en la aplicación principal ya tiene la misma dirección? Entonces, tal vez las funciones dentro de un dll pueden cambiar direcciones al cargar, etc.

+0

Lo tienes bien ... –

+0

¿qué opción? : La dirección D puede cambiar cuando se carga? – Kosmos

Respuesta

8

En Windows dlls tienen una dirección de carga preferencial, pero el cargador puede cambiar todas esas referencias si nota que dicha porción del espacio de direcciones virtuales es ya usado. Este proceso se llama "rebasamiento".

La dirección base "predeterminada" se especifica en el tiempo de vinculación (/BASE con el vinculador de Microsoft), y puede ser útil establecerlo en algo diferente al predeterminado si planea usar el dll junto con otro con el misma dirección base; esto acelera el proceso de carga, ya que el cargador no tiene que volver a basar uno de los dlls en cada carga. (IIRC también hay herramientas que pueden volver a establecer una base de datos existente y guardar el resultado en el disco)

Es bueno tener en cuenta que, desde Windows Vista en adelante, las DLL compiladas con una bandera especificada se cargan siempre al azar dirección base para evitar algún tipo de exploits.

3

Es extremadamente poco probable que termines con la misma dirección. El argumento predeterminado/BASE para el vinculador para DLL es 0x10000000, así es como su punto de entrada terminó en esa dirección. Pero hay muchos archivos DLL que están vinculados mediante la configuración predeterminada, solo uno puede cargarse realmente en esa dirección. Todos los demás que se carguen más tarde deben volver a basarse.

Puede obtener un mejor valor para/BASE, sin embargo, nunca es una garantía de que obtiene la dirección de carga que solicita.

2

Como dijo Matteo, una DLL tiene una dirección de carga preferida (especificada en el campo ImageBase de la estructura IMAGE_OPTIONAL_HEADER). Cuando el sistema intenta cargar una DLL, la cargará en esta dirección si es posible (a menos que la asignación al azar del espacio de direcciones esté habilitada) y no se requiere "parcheo". Si no se puede cargar en la dirección preferida, la DLL se reubica, lo que requerirá referencias absolutas en la DLL para parchear para compensar la reubicación.

Para responder a su pregunta: No hay garantía de que se cargue una DLL en su dirección preferida. Una vez cargadas, las cargas posteriores no cargarán más copias de la DLL, por lo que las direcciones no cambiarán. Sin embargo, una vez que se descargan (los archivos DLL son referencia contados) no hay garantía de que se cargarán en la misma dirección la próxima vez.

Cuestiones relacionadas