none
Detours x64 RRS feed

  • Frage

  • Hallo, ich habe folgenden Code im Internet gefunden, läuft auch perfekt...auf 32bit...

     

    #include <Windows.h>
    #include <TlHelp32.h>
    
    #define SIZE 6
    
    DWORD oldProtect, myProtect = PAGE_EXECUTE_READWRITE;
    
    typedef int (WINAPI *pMessageBoxA)(HWND, LPCSTR, LPCSTR, UINT);
    int WINAPI MyMessageBoxA(HWND, LPCSTR, LPCSTR, UINT);
    void BeginRedirect(LPVOID);
    
    pMessageBoxA pOrigMBAddress = NULL;
    
    BYTE oldBytes[SIZE] = {0};
    BYTE JMP[SIZE] = {0};
    
    BOOL WINAPI DllMain(HMODULE hModule, DWORD dwReason, LPVOID lpReserved)
    {
    	if(DLL_PROCESS_ATTACH == dwReason)
    	{
    		pOrigMBAddress = (pMessageBoxA)GetProcAddress(GetModuleHandle("user32.dll"), "MessageBoxA");
    		if(pOrigMBAddress != NULL)
    		{
                BeginRedirect(MyMessageBoxA);
    		}
    	}
    	return TRUE;
    }
    
    void BeginRedirect(LPVOID newFunction)
    {
        BYTE tempJMP[SIZE] ={0xE9, 0x90, 0x90, 0x90, 0x90, 0x90};
        memcpy(JMP, tempJMP, SIZE);
        DWORD JMPSize = ((DWORD)newFunction - (DWORD)pOrigMBAddress - 5);
        VirtualProtect((LPVOID)pOrigMBAddress, SIZE, 
                        PAGE_EXECUTE_READWRITE, &oldProtect);
    					
        memcpy(oldBytes, pOrigMBAddress, SIZE);
    	memcpy(&JMP[1], &JMPSize, 8);
        memcpy(pOrigMBAddress, JMP, SIZE);
    
        VirtualProtect((LPVOID)pOrigMBAddress, SIZE, oldProtect, NULL);
    }
    int WINAPI MyMessageBoxA(HWND hWnd, LPCSTR lpText, LPCSTR lpCaption, UINT uiType)
    {
        VirtualProtect((LPVOID)pOrigMBAddress, SIZE, myProtect, NULL);
        memcpy(pOrigMBAddress, oldBytes, SIZE);
        int retValue = MessageBoxA(hWnd, "MessageX", "CaptionX", uiType);
        memcpy(pOrigMBAddress, JMP, SIZE);
        VirtualProtect((LPVOID)pOrigMBAddress, SIZE, oldProtect, NULL);
        return retValue;
    }
    


    Jetzt möchte ich ihn aber auch bei 64bit verwenden...

    Habe natürlich dazu ein 64bit Testprogramm, sowie die passende 64bit Dll und den 64bit Injecter...

    Wenn ich den oben stehenden Code verwende, passiert einfach garnichts...

    Dann habe ich etwas experimentiert und irgendwann bekam ich wenigstens schonmal einen Crash...

     

    Ich weiß nicht wie lange ich schon an diesem Problem sitze, nichts funktioniert....:(

    Hoffe es findet jemand die Zeit mir zu helfen...

    Windows 7 x64; Visual Studio 2010;

    Gruß !

    Donnerstag, 22. September 2011 13:13

Antworten

Alle Antworten

  • Ich seh's auch nicht... aber ich frag mal ein paar Sachen (mit der richtigen Frage kommt die Antwort nämlich von selbst).

    1) schlägt irgendwas fehl bei der Aktion? ... oder funktionieren alle Aufrufe?

    2) wieso definierst du die Size auf 6? weil du von 44/48 relevanten Bits für die Adresse ausgehst?

    3) ... die 5 stört mich noch... wieso steht da - 5 bei der JMPSize Berechnung? abgesehen davon, dass ich nicht ganz verstehe, wieso es ausgerechnet 5 DWORD (mit so vielen nop) sein müssen, würde ich mich auch nicht zwingend drauf einlassen, dass es in der x64 Dll auch wieder 5 DWORD sind

    Rudolf

     

    Sonntag, 25. September 2011 15:07
  • Danke zunächst einmal für die Antwort!

    zu 1: Nein, nur VirtualProtect, weil ich den letzen Parameter NULL setze, das ist allerdings nicht wichtig...

    zu 2: Keine Ahnung, habe den Code wie gesagt übernommen...könnte ich mir folgendermaßen vorstellen (1 für JMP-Befehl, 4 für Adresse, 1 als Puffer)

    zu 3: -5 ? Weiß ich auch nicht, hab ich letztens noch irgendwo gelesen, das klang logisch und hat ja funktioniert....auf 32bit...

    Hoffe das bringt etwas Licht ins Dunkle ?

     

    Gruß

    Montag, 26. September 2011 10:02
  • Der Code wird nie unter x64 laufen, da die Befehle dort anders sind... auch ist diese Variante doch sehr simple und deckt bei weitem nicht alle Varianten ab...


    Jochen Kalmbach (MVP VC++)
    Montag, 26. September 2011 11:01
  • Okay, schonmal gut zu wissen... wie sähe denn die 64bit Variante aus (wenn es nicht zu viel Arbeit ist).

    Habe im Internet nirgendwo ein 64bit Code dafür gefunden, nur Leute, die auch einen suchen ;)

     

    Gruß

    Montag, 26. September 2011 11:03
  • Die 64-Bit Variante kannst Du bei MS für 10000$ kaufen...
    http://www.microsoftstore.com/store/msstore/en_US/pd/productID.216531800


    Jochen Kalmbach (MVP VC++)
    Montag, 26. September 2011 12:01
  • Oh, so günstig....

    gibts da keine "OpenSource"-Alternative?

    Montag, 26. September 2011 12:41
  • Wenn ich Google verwende und Deinen Titel dieses Threads angebe finde ich erstaunlicherweise diesen Artikel:
    http://www.codeproject.com/KB/system/mini_hook_engine.aspx

    ;)


    Martin Richter -- MVP for VC++ [Germany] -- http://blog.m-ri.de
    Montag, 26. September 2011 13:18
    Moderator
  • ...wo leider "diStorm64" benötigt wird... ich möchte halt alles in einem Modul, sodass ich keine Externen brauche...
    Montag, 26. September 2011 14:26
  • Dabnn musst Du Dir Deinen eigenen Disassembler schreiben und den einbinden. Ist ja nicht so schwer...


    Jochen Kalmbach (MVP VC++)
    Montag, 26. September 2011 15:58
  • Ich komme darauf zurück, wenn ich anfange zu studieren....danke ;)
    Montag, 26. September 2011 16:04
  • Hallo __Username,

    Ich gehe davon aus, dass die Antworten Dir weitergeholfen haben.
    Solltest Du noch "Rückfragen" dazu haben, so gib uns bitte Bescheid.

    Grüße,
    Robert

    Mittwoch, 28. September 2011 15:20
    Moderator
  • Ja, habe erfahren, dass das doch "etwas" mehr Aufwand ist, das reicht mir ;)

     

    Aber noch eine technische Frage:

    Wenn ich doch einen Jmp zu meiner Funktion mache, dann kommt es doch nicht auf x64 an, das ist doch immer gleich oder nicht?

    Das müsste doch auch auf 64bit gehen, jedenfalls soweit, dass meine Funktion aufgerufen wird:

     

    ErsteBytesDerFunktion = JMP + &MeineFunktion;
    
    __stdcall void MeineFunction(void)
    {
    Whatever...
    return
    }
    


    Das klappt allerdings irgendwie auch nicht, kann mir jemand erklären warum ?

     

     

    Gruß !

    Donnerstag, 29. September 2011 13:52