Aufruf von GetProcAddressForCaller
-
Hallo,
die Funktion GetProcAddress scheint ein Wrapper für die Funktion GetProcAddressForCaller zu sein. Ich habe mir mal das in x32dbg angeguckt. Die beiden Parameter(Handle und Name der gewünschten Funktion) für GetProcAddress werden an diese Funktion durchgereicht und es kommt noch ein weiterer Parameter hinzu. Meine Frage ist aber, wie kann ich GetProcAddressForCaller aufrufen? In Visual Studio wird er nicht erkannt. Kann mir jemand einen Schubs in die richtige Richtung geben?
-
@asd1 sagte in Aufruf von GetProcAddressForCaller:
In Visual Studio wird er nicht erkannt.
Warum das wohl so sein wird? Was glaubst Du fehlt?
-
@asd1 sagte in Aufruf von GetProcAddressForCaller:
GetProcAddressForCaller
Die Adresse von
GetProcAddressForCaller
kannst du dir vermutlich mittelsGetProcAddress
holen -- implementiert sein sollte das ganze inkernelbase.dll
. Dann brauchst du nur noch die Signatur vonGetProcAddressForCaller
. Kannst ja mal googeln, ich hab auf die Schnelle nix gefunden.Ist aber u.U. ne riskante Sache - ist ja schliesslich keine offizielle Funktion.
-
@Swordfish Ehrlich gesagt habe ich keine Ahnung. GetProcAddressForCaller ist in kernelbase.dll drin. Diese dll wird anscheinend wie die kernel32.dll mitgeladen.Das sehe ich im Debugger. In der Importtabelle sehe ich, dass u.a. die kernel32.dll aufgelistet ist. Die kernelbase.dll ist jedoch nicht mit dabei. Laut den Infos von MS sind die Funktionalitäten von kernel32.dll und advapi32.dll in kernelbase32 ausgelagert worden. Es wird ein Forwarding gemacht, was ich auch im Debugger sehe. Eigentlich müsste der Aufruf von GetProcAddressForCaller ohne große Probleme von statten gehen, wenn ich mir das so im Debugger angucke.
-
Deklaration?? Eventuell import library??
-
@Swordfish Es gibt keine Import Library für
KernelBase.dll
im Windows SDK. Dass die meisten (alle?)Kernel32.dll
Funktionen dort implementiert sind, ist lediglich ein Implementierungsdetail. IIRC istKernelBase.dll
auch erst mit Windows 7/Server 2008 R2 gekommen. Davor war das Zeug direkt inKernel32.dll
.Programme müssen weiterhin einen Import gegen
Kernel32.dll
enthalten, der Loader verbiegt das dann entsprechend anhand der Forwarding-Einträge inKernel32.dll
.
-
@asd1
Wieso willst du überhauptGetProcAddressForCaller
direkt aufrufen? Was für ein Problem hast du mitGetProcAddress
?
-
@Swordfish Habe ich schon versucht.
-
@hustbaer Das ist eine Aufgabe, die ich bekommen habe. Soll GetProcAddress implementieren.
-
@asd1 sagte in Aufruf von GetProcAddressForCaller:
@Swordfish Habe ich schon versucht.
Was hast Du versucht?
-
@asd1
Hast du mal versucht die Funktion mittels LoadLibrary() und GetProcAddress() zu laden?Wie zum Beispiel
#include <windows.h> #include <iostream> typedef int(__stdcall *MyMsgBox)(HWND, LPCTSTR, LPCTSTR, UINT); // Testprogramm für LoadLibrary() und GetProcAddress() int main() { HINSTANCE hDLL = LoadLibrary("User32.dll"); if (!hDLL) { std::cout << "Konnte User32.dll nicht laden\n"; return EXIT_FAILURE; } //****************************** MyMsgBox MyMsgBoxInst = reinterpret_cast<MyMsgBox>(GetProcAddress(hDLL, "MessageBoxA")); if (!MyMsgBoxInst) { std::cout << "Konnte Funktion MessageBoxA nicht finden\n"; return EXIT_FAILURE; } MyMsgBoxInst(nullptr, "Hallo Welt", "Debug", MB_OK); return EXIT_SUCCESS; }
-
@asd1 Wenn du als Aufgabe bekommen hast
GetProcAddress
zu implementieren, dann ist damit ziemlich sicher nicht gemeint dass du es implementieren sollst indem duGetProcAddressForCaller
aufrufst.Also zumindest wenn ich dir die Aufgabe geben würde, dann würde ich wollen dass du es implementierst indem du den Export-Table der DLL durchsuchst. Also ohne dabei auf irgendwelche Funktionen des OS zurückzugreifen.
Das
HMODULE
zeigt auf den Anfang der in den Speicher gemappten DLL. Und die fängt mit einer PE Image Header an. Von der Header ausgehend kannst du dich mittels diverser Offsets weiterhanteln bis zum Export-Table. Und den durchsuchst du dann nach der gesuchten Funktion.
Und selbst wenn die Aufgabe nicht so formuliert ist... um an
GetProcAddressForCaller
zu kommen müsstest du ja schonGetProcAddress
verwenden. Und da beisst sich dann der Schwanz in den Hund.