[C/C++] Tastendruck ändern via API Hook

Dieses Thema im Forum "Programmierung & Entwicklung" wurde erstellt von MasterJulian, 30. April 2012 .

Schlagworte:
  1. 30. April 2012
    Tastendruck ändern via API Hook

    Wir haben von der FH ein Programm bekommen mit dem wir arbeiten müssen. Leider hält sich der Entwickler nicht an gängige Shortcuts wie Strg+C (im Programm Strg+Einf) oder Strg+V (im Programm Umschalt+Einf). Auch Fließkommazahlen werden mit "." anstatt mit "," getrennt. Ich wollte nun die Keys "remappen". Ich weiß es gibt globale Hooks aber ich würde das am liebsten auf das eine Programm/Prozess beschränken (via DLL injektion und API hooking). Das Programm ist in Delphi 7 geschrieben und verwendet laut IDA folgende Imports bzgl. des Keyboards:

    GetKeyNameTextA
    GetKeyState
    GetKeyboardLayout
    GetKeyboardLayoutList
    GetKeyboardState
    GetKeyboardType

    Ich hab also folgendes versucht:
    Code:
    SHORT WINAPI DetourGetKeyState(int nVirtKey)
    {
     logkey(nVirtKey); //log alle Aufrufe mit KeyCode
     switch (nVirtKey)
     {
     case (VK_OEM_PERIOD): //wird nie erreicht
     MessageBox(NULL,"Punkt abgefragt","Hook",0); 
     return fpGetKeyState(VK_OEM_COMMA);
     default:
     return fpGetKeyState(nVirtKey);
     }
    }
    fpGetKeyState ist hierbei der Pointer zur Originalfunktion. Der hook funktoinert zwar (Log wird gefüllt). Allerdings nur mit einer sehr begrenzten Anzahl an verschiedenen Keys und nie der Punkt (selbst wenn Punkt gedrückt und auch geschrieben wird).
    Ich hab dann versucht GetKeyboardState zu hooken:
    Code:
    BOOL WINAPI DetourGetKeyboardState(PBYTE lpKeyState)
    {
     BOOL tmpBool = fpGetKeyboardState(lpKeyState);
     logkeystate(lpKeyState); //log den Keystate
     return tmpBool;
    }
    Auch dieser Hook wird gecalled, jedoch ist der geloggte Wert immer der gleiche. Die Logging Funktionen sehen so aus (nur der vollständigkeit halber)
    Code:
    void logkeystate(PBYTE state){
     FILE * pFile;
     pFile = fopen ("C:\\Users\\Julian\\keystate.log","a");
     fprintf(pFile,"State: %Xh\n", state);
     fclose(pFile);
    }
    
    void logkey(int key){
     FILE * pFile;
     pFile = fopen ("C:\\Users\\Julian\\key.log","a");
     fprintf(pFile,"Key: %.2Xh\n",key);
     fclose(pFile);
    }
    Ich habe noch nicht viel mit API Hooking gemacht. Jemand eine Idee wie ich das lösen könnte?
     
  2. 30. April 2012
    Zuletzt bearbeitet: 30. April 2012
    AW: Tastendruck ändern via API Hook

    PBYTE isn Array und du gibst immer nur den Pointer zu diesem aus...

    //EDiT:
    Wenn ich die MSDN richtig verstehe, kann man SetWindowsHookEx auch für Thread-gebundene Hooks nutzen, siehe WH_KEYBOARD.
     
    1 Person gefällt das.
  3. 30. April 2012
    Zuletzt bearbeitet: 30. April 2012
    AW: Tastendruck ändern via API Hook

    FAIL
    Na klar typdef BYTE *PBYTE. Hab schon länger nichts mehr in C gemacht.
    Nungut jetzt loggt meine Funktion schon mal richtig. Mal sehen ob ich damit weiterkomme. Ansonsten schau ich mir mal die Sache mit den threadgebundenen Hooks an.

    //Edit:
    Ok ich kann erkennen ob eine Taste gedrück wird oder nicht aber überschreiben funktioniert leider nicht:
    Code:
    BOOL WINAPI DetourGetKeyboardState(PBYTE lpKeyState)
    {
     BOOL tmpBool = fpGetKeyboardState(lpKeyState);
     if(lpKeyState[VK_OEM_COMMA] & 0xF0)
     {
     lpKeyState[VK_OEM_PERIOD] = lpKeyState[VK_OEM_COMMA]; //funktioniert alleine leider nicht
     lpKeyState[VK_OEM_COMMA] = 0;
     SetKeyboardState(lpKeyState); //funktioniert aber auch nicht
     }
    
     return tmpBool;
    }
    jemand ne Idee?
     
  4. 30. April 2012
    AW: Tastendruck ändern via API Hook

    Evtl. nutzt das Programm diese Funktion nicht dafür?
    Weiterere Ansatzpunkte könnten auch GetMessage(), TranslateMessage() oder DispatchMessage() sein.
     
  5. 30. April 2012
    AW: Tastendruck ändern via API Hook

    Mhh könnte gut sein. Die Funktion wird definitiv aufgerufen wenn ich eine Taste drücke aber wohl anders ausgewertet. Ich werde (morgen) mal die anderen, von dir angesprochenen Funktionen hooken und sehen was dabei rum kommt.
     
  6. Video Script

    Videos zum Themenbereich

    * gefundene Videos auf YouTube, anhand der Überschrift.