Cargar función de una DLL solo con la dirección de memoria

Iniciado por patilanz, 3 Mayo 2018, 14:25 PM

0 Miembros y 1 Visitante están viendo este tema.

patilanz

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

MAFUS

Creo que el S.O. no te permite salirte del marco de memoria de tu programa.

srWhiteSkull

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