Seite 2 von 3

Verfasst: 27.06.2008 16:38
von orderinchaos
@ Kaeru Gaman
Danke für die tolle Erklärung! Nun macht das ganze für mich Sinn...

Ne Bedingung also... Gut werd's mir merken!

Also werd ich noch ne weitere Bedingung für Zahlen (und alle anderen Tasten) einbauen versuchen.

Mein Ziel bei der ganzen Sache ist folgender:
Ich möchte die gesamten Tastatureingaben im Hintergrund in eine Datei schreiben: Ein Keylogger halt... Jedoch möcht ich dies nicht mit einem Keyboard-Hook erreichen, da sonst alle Antiviren alarm schlagen! Deshalb mach ich es per GetKeyboardState.

WICHTIG
Das Resultat dient nicht irgendwelchen bösartigen Aktionen, sondern ausschliesslich meinem Wissenshunger. Wollte schon lange Mal einen Keylogger programmieren um zu verstehen wie es funktioniert.

@ Andreas (und alle die mir sonst Helfen können)
Ich hab versucht das Window-Fenster aus dem Code zu streichen und lediglich die Repeat-Schleife laufen zu lassen, da ich ja bei einem Keylogger kein Fenster gebrauchen kann. :lol:

Das sieht dann so aus:

Code: Alles auswählen

Macro GetBit(value,bit)
  (value>>bit&1)
EndMacro

Dim States.b(255)

  Repeat
    If EventID = #WM_KEYUP
      If EventwParam() > 64 And EventwParam() < 91
        GetKeyboardState_(@States(0))
        Select GetBit(States(#VK_CAPITAL),0)
          Case 0
          Select GetBit(States(#VK_SHIFT),7)
            Case 0
              Debug LCase(Chr(EventwParam()))
            Case 1
              Debug UCase(Chr(EventwParam()))
          EndSelect 
            Case 1
              Select GetBit(States(#VK_SHIFT),7)
                Case 0
                  Debug UCase(Chr(EventwParam()))
                Case 1
                  Debug LCase(Chr(EventwParam()))
              EndSelect
          EndSelect
        EndIf
    EndIf
  Delay(1)
  Until GetAsyncKeyState_(#VK_ESCAPE)&0001
End 
==> Das Problem ist nur, dass es jetzt keinen einzigen Buchstaben mehr im Debugger anzeigt!

Kann mir einer sagen wieso? Müsste doch eigentlich funktionieren... :freak:

thx, orderinchaos

Verfasst: 27.06.2008 16:43
von Kaeru Gaman
hihi...

du prüfst hier ne EventID variable, der du nirgens einen Wert zuweist.
aber weil du kein window hast und deshalb keine event-queue, kannst du auch nicht das KeyUp-event verarbeiten.

ohne Window musst du ohne Events zurechtkommen.
das geht auch, z.b. könntest du ne zeitgesteuerte schleife bauen, die alle 100ms alle tasten checkt.

Verfasst: 27.06.2008 17:14
von orderinchaos
:mrgreen: ja, das ist in der tat nicht sehr klug...

werd mich mal an einen lösungsansatz machen mit ner zeitgesteuerten schleife, wie du sagtes...

wenn ich was hab, werd ich s posten!


kannst du mir noch erleutern was dieses marko genau macht und wie es aufgebaut ist... hatte bis jetzt die finger von makros gelassen und versteh das noch nicht:

Code: Alles auswählen

Macro GetBit(value,bit)
  (value>>bit&1)
EndMacro
thx

Verfasst: 27.06.2008 17:17
von hardfalcon
Ein AV-Scanner schlägt nicht automatisch Alarm wenn in deinem Programm ein globaler Keyboard-Hook steckt (die Dinger werden von sehr vielen Programmen, v.a. von Spielen, verwendet).

Davon abgesehen ist ein Keyboard-Hook wesentlich effektiver und ressourcenschonender als ein ständiges Abfragen von GetKeyboardState_(), weil du wirklich alle Tastendrücke mitkriegst, und dir nicht z.B.Zeichen, die mehrfach eingegeben wurden durch gedrückt halten einer Taste, durch die Lappen gehen.

Wenn du vermeiden willst, dass dein Programm von der Heuristik eines AV-Scanners gemeldet wird, dann lass es z.B. bei virustotal.com überprüfen. Und wenn da irgendein Scanner anschlägt, dann nimmst du so lange API-Funktion für API-Funktion aus deinem Code raus, bis kein Treffer mehr gemeldet wird. Und dann überlegst du dir ne Methode, die Benutzung der "auslösenden" API-Funktion zu vermeiden, oder du versuchst sonst irgendwie um das Problem herumzuprogrammieren...

//EDIT: Das Macro GetBit() überprüft, ob ein bestimmtes Bit in ner Variable gesetzt ist oder nicht, d.h. es liefert den Wert des abzufragenden Bits zurück.

Verfasst: 27.06.2008 17:22
von orderinchaos
@ hardfalcon

Danke für deine Informationen! Ich muss jedoch dazu sagen, dass dies nicht der einzige Grund ist weshalb ich auf Keyboard-Hooks verzichte.... :oops:

Der eigentliche Grund ist wohl, dass ich davon noch nicht's verstehe und mich deshalb noch nicht daran probiert habe! Ich wüsste nicht Mal wie ich beginnen sollte... Kenn mich leider einfach noch viel zu wenig mit der WinAPI aus....

Hab deshalb gedacht, dass ich mit GetKeyboardState_ arbeite, da ich mich damit wenigstens schon beschäftigt habe... :wink:

Aber wenn du einen tollen Ansatz für mich hättest, wäre mir natürlich sehr geholfen!

//EDIT
Danke für die Erklärung! In diesem Falle wird mit dieser Zeile einem Bit einen Wert zugeordnet, richtig? Den wert der gedrückten Taste, oder?

Code: Alles auswählen

GetKeyboardState_(@States(0))
Jedoch handelt es sich doch um die "Bit-Nummer" 0... Wird dann der Tastencode nicht nur dem Bit "0" zugeordnet??

Verfasst: 27.06.2008 20:02
von Kaeru Gaman
orderinchaos hat geschrieben:In diesem Falle wird mit dieser Zeile einem Bit einen Wert zugeordnet, richtig? Den wert der gedrückten Taste, oder?

Code: Alles auswählen

GetKeyboardState_(@States(0))
Jedoch handelt es sich doch um die "Bit-Nummer" 0... Wird dann der Tastencode nicht nur dem Bit "0" zugeordnet??
ganz falsch.

@States(0) ist der pointer auf den Anfang des 256byte-Arrays.
der wird der API-Funktion GetKeyboardState übergeben,
damit diese weiß, wohin sie die tabelle für den Tastaturstatus schreiben soll.
danach befinden sich im Array States() die Tastenzustände.

so kannst du mit States(#VK_SHIFT) den zustand der Shift-Taste erfragen.
der kann aber "gedrückt", "nicht gedrückt", "gerade erst gedrückt" oder "soeben losgelassen" sein,
das wird durch unterschiedliche Bits ausgedrückt.

Andreas prüft hier GetBit(States(#VK_SHIFT),7),
also das Bit nummer 7 des Zustandes von Shift der im Array steht.
weil bit 7 eben bei shift dafür zuständig ist.
er könnte genausogut States(#VK_SHIFT)&128 auf #True prüfen,
das käme auf desselbe raus.

Re:

Verfasst: 01.03.2010 22:52
von netzcoder
Andreas hat geschrieben:

Code: Alles auswählen

Macro GetBit(value,bit) 
  (value>>bit&1) 
EndMacro

Dim States.b(255)

If OpenWindow(0, 100, 200, 195, 260, "PureBasic Window", #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget)
  Repeat
    EventID = WaitWindowEvent()
    If EventID = #WM_KEYUP
    If EventwParam() > 64 And EventwParam() < 91
    GetKeyboardState_(@States(0))
    Select GetBit(States(#VK_CAPITAL),0)
      Case 0
      Select GetBit(States(#VK_SHIFT),7)
        Case 0
          Debug LCase(Chr(EventwParam()))
        Case 1
          Debug UCase(Chr(EventwParam()))
      EndSelect  
      Case 1
      Select GetBit(States(#VK_SHIFT),7)
        Case 0
          Debug UCase(Chr(EventwParam()))
        Case 1
          Debug LCase(Chr(EventwParam()))
    EndSelect
    EndSelect
    EndIf
    EndIf
    If EventID = #PB_Event_CloseWindow
      Quit = 1
    EndIf
  Until Quit = 1
EndIf
End
Hallo,

bin über diesen Code gestolpert. Gibt's den auch mit Zahlen und Sonderzeichen?

Euer netzcoder

Re: getasynckeystate probleme/fragen

Verfasst: 01.03.2010 23:43
von c4s
Lieber netzcoder, schau dich schlau:
http://msdn.microsoft.com/en-us/library/ms927178.aspx

Re: getasynckeystate probleme/fragen

Verfasst: 02.03.2010 08:20
von netzcoder
Das hab ich schon gefunden aber es muss doch nen anderen Weg geben als 100 If Abfragen oder?

netzcoder

Re: getasynckeystate probleme/fragen

Verfasst: 02.03.2010 13:20
von c4s
netzcoder hat geschrieben:Das hab ich schon gefunden aber es muss doch nen anderen Weg geben als 100 If Abfragen oder?
Tja, da hast du recht.

Nach wie vor:
c4s hat geschrieben:Lieber netzcoder, schau dich schlau:
http://msdn.microsoft.com/en-us/library/ms927178.aspx
msdn: GetKeyboardState hat geschrieben:Pointer to the 256-byte array that receives the status data for each virtual key.

Und sofern es darauf hinauslaufen soll: Keylogger gibt es schon genug - Lass es lieber sein oder beschäftige dich mehr mit der Materie.