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 BezeichnerMit 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 '=' deklariertIch 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.