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.