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 mittels GetProcAddress holen -- implementiert sein sollte das ganze in kernelbase.dll. Dann brauchst du nur noch die Signatur von GetProcAddressForCaller. 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 ist KernelBase.dll auch erst mit Windows 7/Server 2008 R2 gekommen. Davor war das Zeug direkt in Kernel32.dll.

    Programme müssen weiterhin einen Import gegen Kernel32.dll enthalten, der Loader verbiegt das dann entsprechend anhand der Forwarding-Einträge in Kernel32.dll.



  • @asd1
    Wieso willst du überhaupt GetProcAddressForCaller direkt aufrufen? Was für ein Problem hast du mit GetProcAddress?



  • @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 du GetProcAddressForCaller 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 schon GetProcAddress verwenden. Und da beisst sich dann der Schwanz in den Hund.


Anmelden zum Antworten