Test Foro de elhacker.net SMF 2.1

Programación => Programación C/C++ => Mensaje iniciado por: patilanz en 3 Mayo 2018, 14:25 PM

Título: Cargar función de una DLL solo con la dirección de memoria
Publicado por: patilanz en 3 Mayo 2018, 14:25 PM
Como puedo llamar a una función de una DLL de Windows sabiendo su dirección estática?

Por ejemplo:
Código (cpp) [Seleccionar]
HMODULE dll = LoadLibraryA("comDlg32.dll");
if (dll == 0){
printf("Failed to load Library");
exit(1);
}
PGetOpenFileName AGetOpenFileName = (PGetOpenFileName)GetProcAddress(dll, "GetOpenFileNameW");
GetProcAddress(dll, "GetOpenFileNameW");
if (AGetOpenFileName == 0){
printf("Failed to load function");
exit(1);
}


El codigo anterior funciona. Con DLL Export Viewer obtengo la direccion de la funcion y pense en algo asi:

Código (cpp) [Seleccionar]
PGetOpenFileName AGetOpenFileName = (PGetOpenFileName)0x000000018004dfc0;

Pero me salta con infracción de memoria.

Pistas?

Un saludo
Título: Re: Cargar función de una DLL solo con la dirección de memoria
Publicado por: MAFUS en 3 Mayo 2018, 15:52 PM
Creo que el S.O. no te permite salirte del marco de memoria de tu programa.
Título: Re: Cargar función de una DLL solo con la dirección de memoria
Publicado por: srWhiteSkull en 3 Mayo 2018, 17:17 PM
No creo que esa sea la dirección, porque date cuenta que cada vez que ejecutas el programa la dll no es alojada en el mismo sitio. Quizás si se podría tomar el puntero de la dll y sabiendo el desplazamiento extraer el puntero que apunte a la función usando aritmética de punteros...

... he buscado en Google y voilá es así como te digo. Échale un vistazo a esta recreación de GetProcAddress()... (no es el código original puesto que el API de Windows es de código cerrado)

https://github.com/arbiter34/GetProcAddress/blob/master/GetProcAddress/GetProcAddress.cpp