BitBlt Hooken über Detours
-
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.
-
Ja mir fählt nur die Methode ein..Wie soll ich dan die Taste Simulieren ?
-
Du musst zuerst den Tastendruck simulieren und dann den Hook aktivieren bzw. verarbeiten - Das Prog. muss ja die Gelegenheit haben, sich mit geänderten Parametern neu zu zeichnen.
Um was für ein Prog. handelt es sich den? - Erklär mal genauer was du machen willst (Screenshot via Hotkey?)...
-
Bei uns in der Uni haben die ein Hauseigenes Überwachungstool, was von jeden Computer im LAN Bilder schiesst und am Professor aufm Bild zeigt. Ich habe eben Rausgefunden das es sich um ne BitBlt Funktion handelt. Da ich nicht direkt zugriff auf die DLL habe vom Überwachungstool wollte ich einfach den Clienten mit dem BitBlt Hook injecten und immer bei nem Screenshot, soll er zB. Je nach Funktionen die ich in ne ini schreib (das wird noch implementiert wenn alles funktioniert) die kurz ausblenden, und nach dem Screen wieder anmachen. Ich hab ein anderes Programm schon geschrieben, das wenn F6 gedrückt wird, der Internet Explorer versteckt wird oder halt die Programme die gewünscht sind (Ganz gut wenn der Prof. mal ein Rundgang macht.)
Darum will ich, das der Hook immer wenn das Überwachungstool ein Foto schiesst, die F6 Taste Simuliert.