getasynckeystate probleme/fragen

Windowsspezifisches Forum , API ,..
Beiträge, die plattformübergreifend sind, gehören ins 'Allgemein'-Forum.
Benutzeravatar
orderinchaos
Beiträge: 49
Registriert: 20.06.2008 16:19

Beitrag 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
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
orderinchaos
Beiträge: 49
Registriert: 20.06.2008 16:19

Beitrag 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
Benutzeravatar
hardfalcon
Beiträge: 3447
Registriert: 29.08.2004 20:46

Beitrag 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.
Benutzeravatar
orderinchaos
Beiträge: 49
Registriert: 20.06.2008 16:19

Beitrag 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??
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
netzcoder
Beiträge: 275
Registriert: 27.08.2009 14:14
Computerausstattung: Intel Quad Core 2.5 GHz; 8GB DDR2 RAM; NVIDIA GeForce GT 130 mit 1500 MB; 2TB HDD;
Kontaktdaten:

Re:

Beitrag 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
PB 4.40 Final Full Version
c4s
Beiträge: 1235
Registriert: 19.09.2007 22:18

Re: getasynckeystate probleme/fragen

Beitrag von c4s »

Lieber netzcoder, schau dich schlau:
http://msdn.microsoft.com/en-us/library/ms927178.aspx
"Menschenskinder, das Niveau dieses Forums singt schon wieder!" — GronkhLP ||| "ich hogffe ihr könnt den fehle endecken" — Marvin133 ||| "Ideoten gibts ..." — computerfreak ||| "Jup, danke. Gruss" — funkheld
netzcoder
Beiträge: 275
Registriert: 27.08.2009 14:14
Computerausstattung: Intel Quad Core 2.5 GHz; 8GB DDR2 RAM; NVIDIA GeForce GT 130 mit 1500 MB; 2TB HDD;
Kontaktdaten:

Re: getasynckeystate probleme/fragen

Beitrag von netzcoder »

Das hab ich schon gefunden aber es muss doch nen anderen Weg geben als 100 If Abfragen oder?

netzcoder
PB 4.40 Final Full Version
c4s
Beiträge: 1235
Registriert: 19.09.2007 22:18

Re: getasynckeystate probleme/fragen

Beitrag 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.
"Menschenskinder, das Niveau dieses Forums singt schon wieder!" — GronkhLP ||| "ich hogffe ihr könnt den fehle endecken" — Marvin133 ||| "Ideoten gibts ..." — computerfreak ||| "Jup, danke. Gruss" — funkheld
Antworten