BitBlt Hooken über Detours



  • Hi Leute,

    Hab seit letzter Zeit nen Problem, ich habe mir nen Hook geschrieben der die BitBlt Funktion über Detours Hooken soll.

    Hier Mein Code:

    typedef BOOL (WINAPI *BitBltFunc)(HDC hdcDest, int nXDest, int nYDest, int nWidth, int nHeight, HDC hdcSrc, int nXSrc, int nYSrc, DWORD dwRop) = BitBlt;
    
    BOOL WINAPI BitBltHooked(HDC hdcDest, int nXDest, int nYDest, int nWidth, int nHeight, HDC hdcSrc, int nXSrc, int nYSrc, DWORD dwRop)
    {
    	BOOL bReturn;
    
    	xScreen = GetSystemMetrics(SM_CXSCREEN);
    	yScreen = GetSystemMetrics(SM_CYSCREEN);
    
    	if ((nWidth == xScreen) && (nHeight == yScreen))
    	{
    		// Tastendruck simulieren
    		vKey = VK_DELETE;
    
    		SimKeyPress(vKey);
    		SimKeyRelease(vKey);
    		Sleep(100);
    
    		bReturn = BitBltPtr(hdcDest, nXDest, nYDest, nWidth, nHeight, hdcSrc, nXSrc, nYSrc, dwRop);
    
    		SimKeyPress(vKey);
    		SimKeyRelease(vKey);
    
    		return bReturn;
    	}
    	return BitBltPtr(hdcDest, nXDest, nYDest, nWidth, nHeight, hdcSrc, nXSrc, nYSrc, dwRop);
    }
    
    void SetHook()
    {
    BitBltPtr = (BitBltFunc)DetourFunction((LPBYTE)DetourFindFunction(/*Gdi32.dll*/XorStr<0x2B,10,0xD0A951F1>("\x6C\x48\x44\x1D\x1D\x1E\x55\x5E\x5F"+0xD0A951F1).s, /*BitBlt*/XorStr<0xF5,7,0x95D8F86F>("\xB7\x9F\x83\xBA\x95\x8E"+0x95D8F86F).s),(LPBYTE)BitBltHooked); 
    }
    // DLL MAIN
    BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD dwReason, PVOID pvReserved)
    {
    	switch (dwReason) {
    	case DLL_PROCESS_ATTACH:
    		SetHook();
    		break;
    	case DLL_PROCESS_DETACH:
    		break;
    	}
    	return TRUE;
    }
    

    Jedoch kommen beim Compilieren folgende Fehler:

    1>.\main.cpp(42) : error C2513: 'BOOL (__stdcall *)(HDC,int,int,int,int,HDC,int,int,DWORD)': Keine Variable vor '=' deklariert
    1>.\main.cpp(60) : error C3861: "BitBltPtr": Bezeichner wurde nicht gefunden.
    1>.\main.cpp(67) : error C3861: "BitBltPtr": Bezeichner wurde nicht gefunden.
    1>.\main.cpp(72) : error C2065: 'BitBltPtr': nichtdeklarierter Bezeichner
    

    Mit Freundlichen Grüssen



  • 1. Einem typedef weist man nichts zu
    2. "BitBltPtr" ist nicht deklariert. Genauere Fehlbeschreibung geht kaum.



  • ja könntest du mir nen lösungsvorschlag geben ?



  • BertaC schrieb:

    ja könntest du mir nen lösungsvorschlag geben ?

    lol wie waeres mit einer Variable vom Typ BitBltFunc anlegen!?



  • Ok habs nun gemacht, wird auch Compiliert, jedoch crasht meine application die injectet wird mit der dll .... ( Es soll ne Taste Simuliert gedrückt werden um Programm Features auszuschalten und nach dem Screenshot wieder anzumachen)

    Hier mein bisheriger "Compilier- " barer Code:

    #include <windows.h>
    #include <stdio.h>
    #include <detours.h>
    #include "xorstr.h"
    #include <windef.h>
    #pragma comment(lib,"detours.lib")
    
    // GLOBALE VARIABELN
    
    int	vKey, xScreen, yScreen;
    HANDLE BitBltFunc;
    //Tasten Definition
    
    // Tasten Simulation
    void SimKeyPress(int vKey)
    {
        KEYBDINPUT ki={0};
    
        ki.wVk = vKey;
        ki.wScan = MapVirtualKeyEx(vKey, 0, GetKeyboardLayout(0));
    
        INPUT ipEvent;
        ipEvent.type = INPUT_KEYBOARD;
        ipEvent.ki = ki;
    
        SendInput(1,&ipEvent,sizeof(INPUT));
    }
    
    void SimKeyRelease(int vKey)
    {
        KEYBDINPUT ki={0};
        ki.wVk = vKey;
        ki.wScan = MapVirtualKeyEx(vKey, 0, GetKeyboardLayout(0));
    
        INPUT ipEvent;
        ipEvent.type = INPUT_KEYBOARD;
        ipEvent.ki = ki;
        ipEvent.ki.dwFlags = KEYEVENTF_KEYUP;
    
        SendInput(1,&ipEvent,sizeof(INPUT));
    }
    
    /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    static BOOL (WINAPI *BitBltPtr)(HDC hdcDest, int nXDest, int nYDest, int nWidth, int nHeight, HDC hdcSrc, int nXSrc, int nYSrc, DWORD dwRop) = BitBlt;
    
    BOOL WINAPI BitBltHooked(HDC hdcDest, int nXDest, int nYDest, int nWidth, int nHeight, HDC hdcSrc, int nXSrc, int nYSrc, DWORD dwRop)
    {
    	BOOL bReturn;
    
    	xScreen = GetSystemMetrics(SM_CXSCREEN);
    	yScreen = GetSystemMetrics(SM_CYSCREEN);
    
    	if ((nWidth == xScreen) && (nHeight == yScreen))
    	{
    		// Tastendruck simulieren
    		int vKey = VK_DELETE;
    
    		SimKeyPress(vKey);
    		Sleep(20);
    		SimKeyRelease(vKey);
    		Sleep(100);
    		bReturn = BitBltPtr(hdcDest, nXDest, nYDest, nWidth, nHeight, hdcSrc, nXSrc, nYSrc, dwRop);
    		SimKeyPress(vKey);
    		Sleep(20);
    		SimKeyRelease(vKey);
    		return bReturn;
    	}
    	return BitBltPtr(hdcDest, nXDest, nYDest, nWidth, nHeight, hdcSrc, nXSrc, nYSrc, dwRop); 
    
    }
    
    // DLL MAIN
    BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD dwReason, PVOID pvReserved)
    {
    	switch (dwReason) {
    	case DLL_PROCESS_ATTACH:
    		DetourFunction((LPBYTE)DetourFindFunction("Gdi32.dll", "BitBlt"),(LPBYTE)BitBltHooked); 
    		break;
    	case DLL_PROCESS_DETACH:
    		break;
    	}
    	return TRUE;
    }
    

    jemand ne idee ?



  • läuft BitBltPtr nicht ins leere 😕



  • wieso meinst ?

    Wie soll ich es deiner meinung machen ? währe echt froh über hilfe !



  • naja du erstellst zwar BitBltPtr als prototyp aber der zeigt auf nix, somit läuft er ins leere. das meinte ich.
    dein erster versuch war schon nicht schlecht.

    void SetHook()
    {
    BitBltPtr = (BitBltFunc)DetourFunction...; 
    }
    

    und Check0r gab dir die antwort was verkehrt läuft.

    als erstes must den prototyp der funktion definieren

    typedef BOOL (WINAPI *BitBltFunc)(HDC hdcDest, int nXDest, int nYDest, int nWidth, int nHeight, HDC hdcSrc, int nXSrc, int nYSrc, DWORD dwRop) = BitBlt;
    

    als zweites must du für den prototyp ne funktionsvariable deklarieren.

    BitBltFunc BitBltPtr = FALSE;
    

    dann erst kannst du damit arbeiten

    BitBltPtr = (BitBltFunc)DetourFunction((LPBYTE)DetourFindFunction("Gdi32.dll", "BitBlt"),(LPBYTE)BitBltHooked);
    

    ab diesem zeitpunkt zeigt BitBltPtr auf die ursprüngliche adresse der funktion BitBlt die mit detourfunction durch deine funktionsadresse (BitBltHooked) in der Gdi32.dll ersetzt wurde. 😉

    gecheckt 😕

    hoffe ich habe es verständlich erklärt.



  • Verwende Detours 2.1, dann kommen wir weiter.



  • Ok vielen Dank,

    nun denn nach dem ich das gemacht habe wie @rT!f@Ct es mir wundervoll erklärt hat, habe ich immer noch den Fehler:

    1>.\main.cpp(45) : error C2513: 'BOOL (__stdcall *)(HDC,int,int,int,int,HDC,int,int,DWORD)': Keine Variable vor '=' deklariert
    

    Ich meine versteht der Compiler nicht, das da was Deklariert ist vor dem '=' ??? :S



  • Der Ausdruck da oben stellt einen Funktionszeiger-Typen dar. Einem Typen weist man nichts zu, einer Variable schon.

    Schau dir doch mal Detours 2.1 an, wenn du willst, zeige ich dir dann sauberen Beispielcode.



  • Ok habs mal auf Detours 2.1 geschrieben, jedoch auch jetzt, er injected (application crasht auch nicht) jedoch macht er nix! Aufm Screenshot werden die Features nicht "gecleant"

    #include <windows.h>
    #include <stdio.h>
    #include "detours.h"
    
    #pragma comment(lib,"detours.lib")
    #pragma comment(lib, "detoured.lib")
    
    int		xScreen, yScreen;
    BYTE	vKey;
    
    // Target Pointers (Pointer to the real functions)
    static BOOL (WINAPI *True_BitBlt)
    	(HDC hdcDest, int nXDest, int nYDest, int nWidth, int nHeight, HDC hdcSrc, int nXSrc, int nYSrc, DWORD dwRop) = BitBlt;
    
    // Detour functions
    BOOL WINAPI my_BitBlt(HDC hdcDest, int nXDest, int nYDest, int nWidth, int nHeight, HDC hdcSrc, int nXSrc, int nYSrc, DWORD dwRop)
    {
    	BOOL bReturn;
    
    	xScreen = GetSystemMetrics(SM_CXSCREEN);
    	yScreen = GetSystemMetrics(SM_CYSCREEN);
    	if ((nWidth == xScreen) && (nHeight == yScreen)) //BitBlt wird auf den ganzen Monitor angewendet -> wahrshceinlich Screenshot
    	{
    		// Tastendruck simulieren
    
    		keybd_event(vKey, 0, 0, 0);
    		keybd_event(vKey, 0, KEYEVENTF_KEYUP, 0);
    		Sleep(100);
    
    		bReturn = True_BitBlt(hdcDest, nXDest, nYDest, nWidth, nHeight, hdcSrc, nXSrc, nYSrc, dwRop);
    
    		keybd_event(vKey, 0, 0, 0);
    		keybd_event(vKey, 0, KEYEVENTF_KEYUP, 0);
    
    		return bReturn;
    	}
    	return True_BitBlt(hdcDest, nXDest, nYDest, nWidth, nHeight, hdcSrc, nXSrc, nYSrc, dwRop);
    }
    
    /*******************************************************************
    					Dll_MAIN
     ******************************************************************/
    BOOL WINAPI DllMain(HINSTANCE hinst, DWORD dwReason, LPVOID reserved)
    {
        if (dwReason == DLL_PROCESS_ATTACH) 
    	{	
    		// ntdll laden für NtQuerySystemInformation
    		HMODULE hLib = LoadLibrary(TEXT("Gdi32.dll"));
    		True_BitBlt = (my_BitBlt);
    		GetProcAddress(hLib,"BitBlt");
    
    		//PanicKey in virtuellen Key umwandeln (unschön, aber mir fällt nichts besseres ein)
    		vKey = VK_DELETE;
    
    		// Mithilfe von MSDetours die Funktionen hooken
    		DetourRestoreAfterWith();
    
            DetourTransactionBegin();
            DetourUpdateThread(GetCurrentThread());
    		DetourAttach(&(PVOID &)True_BitBlt, my_BitBlt);
    
        return TRUE;
    	}
    }
    

    Würde wirklich nett von dir sein, wenn du mir nen Beispiel Code zeigen würdest.



  • Ah, hast eh schon bisschen was selbst gemacht. Na dann:

    int (__stdcall* RealBitBlt)(HDC hdcDest, int nXDest, int nYDest, int nWidth, int nHeight, HDC hdcSrc, int nXSrc, int nYSrc, unsigned long dwRop) = BitBlt;
    
    int (__stdcall* TramBitBlt)(HDC hdcDest, int nXDest, int nYDest, int nWidth, int nHeight, HDC hdcSrc, int nXSrc, int nYSrc, unsigned long dwRop);
    
    // ...
    
    int __stdcall HookBitBlt(HDC hdcDest, int nXDest, int nYDest, int nWidth, int nHeight, HDC hdcSrc, int nXSrc, int nYSrc, unsigned long dwRop)
    {
        // ...
    
        return TramBitBlt(hdcDest, nXDest, nYDest, nWidth, nHeight, hdcSrc, nXSrc, nYSrc, dwRop);
    }
    
    // ...
    
    DetourTransactionBegin();
    DetourUpdateThread(GetCurrentThread());
    DetourAttachEx(reinterpret_cast<void**>(&RealBitBlt), HookBitBlt, reinterpret_cast<DETOUR_TRAMPOLINE**>(&TramBitBlt), 0, 0);
    DetourTransactionCommit();
    

    Und vergiss die drei Zeilen bei "// ntdll laden für NtQuerySystemInformation".



  • Vielen Dank Check0r, jedoch was ich wissen will, wieso hast du "__stdcall" genommen anstatt "WINAPI" ?



  • Ist genau das gleiche

    #define WINAPI      __stdcall
    


  • Wenn du die Datei windef.h öffnest, findest du folgende Anweisung:

    #define WINAPI  __stdcall
    


  • Ah alles klar. Ich testes Gerade.



  • ach mensch, geht immer noch nicht 😞 injecten tut ehr ohne zu crashen, jedoch macht er nix, (werden nicht sauber die bilder)



  • Dann prüfe erst mal, ob HookBitBlt überhaupt aufgerufen wird (mit Beep(100, 10) zB.).
    Wenn ja, liegt der Fehler im Code darin.
    Wenn nein, dann poste mal wieder den ganzen Code.



  • BertaC schrieb:

    Es soll ne Taste Simuliert gedrückt werden um Programm Features auszuschalten und nach dem Screenshot wieder anzumachen

    ...

    BertaC schrieb:

    ach mensch, geht immer noch nicht 😞 injecten tut ehr ohne zu crashen, jedoch macht er nix, (werden nicht sauber die bilder)

    Du willst die Darstellungsparameter während eines Aufrufs zu BitBlt ändern - das kann doch gar nicht gehen, schon gar nicht wenn dein Zielprogramm BitBlt aus dem WndProc aufruft.


Anmelden zum Antworten