[resuelto] Ayuda con GetProcAddress

Iniciado por xiruko, 27 Noviembre 2012, 02:02 AM

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

xiruko

hola a todos,

llevo toda la tarde con un problema que no consigo resolver y ojala alguien pueda arrojarme un poco de luz. se que podria resumir este codigo en pocas lineas usando directamente LoadLibrary pero la idea es jugar un poco para intentar entender todo lo que pasa.

la idea es que ejecuto un exe y este busca la direccion de LoadLibraryA en la dll Kernel32, para luego crear un hilo pasandole como funcion principal el puntero a LoadLibraryA y como parametro una dll creada por mi. en esta dll hay una callback function donde solo tira un messagebox, y luego otra funcion que es la que intento ejecutar despues, y es aqui donde esta el problema. el messagebox me lo tira bien, pero luego cuando intento obtener la direccion de MyFunction me tira el error de "Could not retrieve the address function".

en fin, este es el codigo de mi dll:

#include <stdio.h>
#include <windows.h>

BOOL APIENTRY DllMain (HINSTANCE hInstDLL, DWORD reason, LPVOID reserved) {

BOOL dllSuccess = FALSE;

if (reason == DLL_PROCESS_ATTACH) {
dllSuccess = MessageBox (NULL, "Funciona! :)", NULL, MB_OK);
}

return dllSuccess;
}

__declspec(dllexport) void __stdcall MyFunction (void) {

printf ("Hello world!\n");
}


y el siguiente codigo es el del ejecutable:

#include <stdio.h>
#include <windows.h>

int main (int argc, char **argv) {

HMODULE hKernel32 = GetModuleHandle ("Kernel32");
FARPROC lpLoadLib = GetProcAddress (hKernel32, "LoadLibraryA");

HANDLE hThread = CreateThread (NULL, 0, (LPTHREAD_START_ROUTINE) lpLoadLib, (void*) argv[1], 0, NULL);
WaitForSingleObject (hThread, INFINITE);

DWORD hLibModule=0;
GetExitCodeThread (hThread, &hLibModule);
if (!hLibModule) {
fprintf (stderr, "ERROR: Could not retrieve the module handle.\n");
return 1;
}

FARPROC myFunc = GetProcAddress ((void*) hLibModule, "MyFunction");
if (!myFunc) {
fprintf (stderr, "ERROR: Could not retrieve the function address.\n");
return 1;
}

       myFunc();
CloseHandle (hThread);
return 0;
}


y eso es todo... alguien puede ayudarme?

muchas gracias!

edito: perdonad cometi un error, mi problema no es con esa funcion sino con la de GetProcAddress del final. llevo demasiado rato metido en esto y pasa lo que pasa... xD

x64core

Te esta diciendo claro que no pudo obtener la direccion de la funcion, verifica que tu funcion sea exportable y que se encuentre.
y usa GetLastError despues de Getprocaddress, con eso sabras cual es tu problema.

Eternal Idol

Usa WinDbg y asegurate que hLibModule sea la direccion base de tu DLL, si eso es correcto comproba tus funciones exportadas con: Dependency Walker.

PD. Todo lo del hilo es una perdida de tiempo y cuando uno tiene un problema lo logico es reducirlo a la minima expresion.
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

xiruko

CitarTe esta diciendo claro que no pudo obtener la direccion de la funcion, verifica que tu funcion sea exportable y que se encuentre.
y usa GetLastError despues de Getprocaddress, con eso sabras cual es tu problema.

hasta ahi llego, ese aviso lo he escrito yo xD y gracias por lo de GetLastError, lo he usado en varios sitios y no se por que no se me ocurrio usarlo aqui.

CitarUsa WinDbg y asegurate que hLibModule sea la direccion base de tu DLL, si eso es correcto comproba tus funciones exportadas con: Dependency Walker.

perfecto gracias, no sabia con que herramientas podia ver eso. ahora me pondre con ello.

un saludo y duda resuelta!

x64core

Cita de: xiruko en 27 Noviembre 2012, 19:04 PM
hasta ahi llego, ese aviso lo he escrito yo xD y gracias por lo de GetLastError, lo he usado en varios sitios y no se por que no se me ocurrio usarlo aqui.

Y entonces porque escribiste eso entonces? es porque GetProcAddress te devuelve el valor esperado? o simplemente lo
escribiste por escribir algo.

xiruko

CitarY entonces porque escribiste eso entonces? es porque GetProcAddress te devuelve el valor esperado? o simplemente lo escribiste por escribir algo.

lo escribi pues para que el programa me avisara de si hay algun fallo, y vale, sabia que GetProcAddress fallaba, por eso lo puse aqui para ver si me podiais ayudar en ver por que fallaba. no se no entiendo tu pregunta la verdad, es como muy obvia xD

y ya probe lo de GetLastError y me devuelve 127 que corresponde a que no se pudo obtener la direccion del procedimiento. estoy informandome sobre windbg y sobre dependency walker para ver porque falla, asi que considero que el tema esta resuelto. si quieres decirme algo mas enviame un mp.

un saludo!