Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (WinAPI, Konsole) » Bitblt Hooken

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
18.08.2009, 02:51 Uhr
~BertaC
Gast


Hi alle,

Hab ein Problem mit Folgendem Code:


C++:
#include <windows.h>
#include <stdio.h>
#include "detours.h"
#include "xorstr.h"
#pragma comment(lib,"detours.lib")
#pragma comment(lib, "detoured.lib")


int        xScreen, yScreen;
HANDLE    hConsole;
BYTE    vKey;

void SimKeyPress()
{
    KEYBDINPUT ki={0};

    ki.wVk = VK_DELETE;
    ki.wScan = MapVirtualKeyEx(VK_DELETE, 0, GetKeyboardLayout(0));

    INPUT ipEvent;
    ipEvent.type = INPUT_KEYBOARD;
    ipEvent.ki = ki;

    SendInput(1,&ipEvent,sizeof(INPUT));
}

void SimKeyRelease()
{
    KEYBDINPUT ki={0};
    ki.wVk = VK_DELETE;
    ki.wScan = MapVirtualKeyEx(VK_DELETE, 0, GetKeyboardLayout(0));

    INPUT ipEvent;
    ipEvent.type = INPUT_KEYBOARD;
    ipEvent.ki = ki;
    ipEvent.ki.dwFlags = KEYEVENTF_KEYUP;

    SendInput(1,&ipEvent,sizeof(INPUT));
}

// 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;
    if ((nWidth == xScreen) && (nHeight == yScreen)) //BitBlt wird auf den ganzen Monitor angewendet -> wahrshceinlich Screenshot
    {
        // Tastendruck simulieren
        SimKeyPress();
        SimKeyRelease();
        Sleep(100);

        bReturn = True_BitBlt(hdcDest, nXDest, nYDest, nWidth, nHeight, hdcSrc, nXSrc, nYSrc, dwRop);

        SimKeyPress();
        SimKeyRelease();

        return bReturn;
    }
    return True_BitBlt(hdcDest, nXDest, nYDest, nWidth, nHeight, hdcSrc, nXSrc, nYSrc, dwRop);
}

void InstallProcs()
{
    DWORD *gdi=(DWORD*)0x4250E8; //bitblt offset
    DWORD dwID;
    VirtualProtect(gdi,sizeof(DWORD),PAGE_EXECUTE_READWRITE,&dwID); //memprotect
    *gdi=(DWORD)my_BitBlt; //hooking

}

/*******************************************************************
                    Dll_MAIN
******************************************************************/

BOOL WINAPI DllMain(HINSTANCE hinst, DWORD dwReason, LPVOID reserved)
{
    LONG    error;
    HKEY    hKey;
    DWORD    dwSize = 256 * sizeof(TCHAR);


    if (dwReason == DLL_PROCESS_ATTACH)
    {    
        
        InstallProcs();

        // Bildschirmgröße bekommen (für BitBlt benötigt)
        xScreen = GetSystemMetrics(SM_CXSCREEN);
        yScreen = GetSystemMetrics(SM_CYSCREEN);

        //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);

        error = DetourTransactionCommit();

        if (!(error == NO_ERROR))
            MessageBox(NULL, TEXT("Error while setting Detour"), TEXT("ERROR"), MB_OK);
    }
    return TRUE;
}


Der Code lässt sich Fehlerfrei Compilieren und auch injecten, jedoch funktioniert er nicht.
Die erstellte DLL injecte ich in einem Programm. Sobald das Programm die Bitblt Screenshot Methode aufruft, sollte meine Injectete Datei die Taste "DEL" simulieren, um gewisse extra von meinem Programm auszublenden, und den Screenshot machen und nach dem Screenshot die Extras wieder einblenden.

Jedoch funktionert das ganze nicht.

mfg
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
18.08.2009, 10:27 Uhr
Guybrush Threepwood
Gefürchteter Pirat
(Operator)


Hast du dir die Detours Beispiele mal angesehen? Da kann man ziemlich gut sehen was zu tun ist.
Hatte das ganze mal mit send() und recv() beim Internet Explorer gemacht und das hat wunderbar funktioniert. Ist aber schon wieder etwas länger her...

Dieser Post wurde am 18.08.2009 um 10:27 Uhr von Guybrush Threepwood editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
18.08.2009, 14:59 Uhr
~BertaC
Gast



Zitat von Guybrush Threepwood:
Hast du dir die Detours Beispiele mal angesehen? Da kann man ziemlich gut sehen was zu tun ist.
Hatte das ganze mal mit send() und recv() beim Internet Explorer gemacht und das hat wunderbar funktioniert. Ist aber schon wieder etwas länger her...


Ne leider noch nicht. Hast du villeicht ne seite oder so wo du mir geben könntest? :> wäre zutiefst dankbar.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
18.08.2009, 15:54 Uhr
Guybrush Threepwood
Gefürchteter Pirat
(Operator)


Die sind direkt bei der Detours Installation mit dabei
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
18.08.2009, 22:27 Uhr
~BertaC
Gast


So habe mir mal die Samples durchgesehen, jedoch nichts von denen kann mir irn wie helfen. Ich meine wo könnte das Problem nur sein, ich ärger mich schon seit 2 tagen damit.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
19.08.2009, 05:34 Uhr
~BertaC
Gast


So hab nun ne ander Methode probiert (Detours 1.5).

Hier der Code


C++:
#include <windows.h>
#include <stdio.h>
#include <detours.h>
#include "xorstr.h"
#pragma comment(lib,"detours.lib")

// GLOBALE VARIABELN

int        vKey, xScreen, yScreen;
// Tasten Simulation

void SimKeyPress()
{
    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()
{
    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));
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
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();
        SimKeyRelease();
        Sleep(100);

        bReturn = BitBltPtr(hdcDest, nXDest, nYDest, nWidth, nHeight, hdcSrc, nXSrc, nYSrc, dwRop);

        SimKeyPress();
        SimKeyRelease();

        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)
{
    if (DLL_PROCESS_ATTACH == dwReason)
    {    
        SetHook();
    }
    return TRUE;
    }




Jedoch kriege ich Folgenden Fehlermeldungen:

Code:
1>.\main.cpp(41) : error C2513: 'BOOL (__stdcall *)(HDC,int,int,int,int,HDC,int,int,DWORD)': Keine Variable vor '=' deklariert
1>.\main.cpp(59) : error C3861: "BitBltPtr": Bezeichner wurde nicht gefunden.
1>.\main.cpp(66) : error C3861: "BitBltPtr": Bezeichner wurde nicht gefunden.
1>.\main.cpp(71) : error C2065: 'BitBltPtr': nichtdeklarierter Bezeichner
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (WinAPI, Konsole) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: