2012-03-03 8 views
10

Tengo un pequeño problema. He cargado DLL en el proceso (no es mío) y tengo que usar la función dentro de él. Tengo una compensación para esta función, así que lo único que tengo que hacer es obtener la dirección de las DLL y agregarla a la compensación para acceder a la función. GetModuleHandle() devuelve HMODULE variable pero en realidad no sé qué es HMODULE. ¿Es la dirección de la DLL cargada o algún tipo de otra marca?¿Qué es HMODULE?

Y si no es la dirección del lugar donde se carga la DLL, ¿cómo puedo obtener esta dirección? Espero ser claro.

Respuesta

8

El método que usted propone funcionará bien.

Parece que ha inyectado un dll en un proceso de destino y desea obtener la dirección de una función en ese dll en el proceso de destino del proceso que inyectó el dll.

Supongo que también tiene el dll cargado en el proceso que inyectó el dll en el proceso de destino y que desea crear un subproceso remoto en el proceso de destino y hacer que ejecute la función de destino en el proceso de destino.

Dado que la dll que ha inyectado puede no cargarse en la misma dirección en el proceso objetivo como en el proceso de inyección, no puede simplemente usar la dirección que obtendría al llamar a GetProcAddress en la función en el proceso de inyección .

Un HMODULE es solo la dirección base de la DLL (consulte this answer para obtener más información). De modo que puede tomar el HMODULE del dll en su proceso de inyección y restarlo de la dirección devuelta por GetProcAddress en su función. A continuación, puede agregar el HMODULE del dll inyectado en el proceso objetivo a este desplazamiento para obtener la dirección de la función objetivo en el dll inyectado en el proceso objetivo. Asumiendo que esta función tiene la firma correcta, páselo como la función de hilo a tu llamada para crear el hilo remoto y ahora estás ejecutando la función objetivo en el proceso objetivo.

Lo explico con más detalle en this answer.

+0

Gracias. Tengo otro problema. Cuando estoy haciendo esto -> http://wklej.org/id/700802/ me estoy equivocando. ¿Debo hacerlo así -> http://wklej.org/id/700803/? – Blood

+0

@ Sangre: Ninguna de esas cosas tiene sentido. Agregaste el desplazamiento (para pasar de la base a la función) pero olvidaste restarlo (para obtener la base en primer lugar). Ver mi respuesta Como tienes que hacer ambas cosas, y se cancelan, es mejor que no te molestes. –

+0

David, la única vez que se cancela es si el dll se carga en la misma dirección base en ambos procesos. De lo contrario, mi respuesta funciona y la tuya no :). –

4

Llame GetProcAddress. El desplazamiento se cancela, ya que tendría que agregarlo (para llegar a la función) y restarlo (para obtener la dirección base), por lo que no debería molestarse.

1

Es similar al void* devuelto por la función POSIX dlopen() (podría ser un typedef, pero no estoy seguro). Lo pasa como GetProcAddress como argumento. Cuando termines, también lo pasas al FreeLibrary para descargar la DLL.

+0

typedef void * HANDLE; typedef HANDLE HMODULE; entonces HMODULE es nulo *. – quantum