Schrift
[thread]9099[/thread]

Tastatureingaben Einlesen

Leser: 1


<< >> 5 Einträge, 1 Seite
~Br4inP4in~
 2007-06-18 23:59
#77635 #77635
User since
2007-06-13
28 Artikel
BenutzerIn
[default_avatar]
Hi.

Ich stehe vor dem Problem, dass ich Eingaben, die mit der Tastatur gemacht werden, im Hintergrund einlesen will (im Prinzip ein gewöhnlicher Keylogger)... Hierzu soll das Perlfenster nicht aktiv sein müssen und es sollen alle Tasten gelesen werden (also auch "Funktionstasten" wie Esc, Strg, Entf, usw.
Ich habe dazu 2 interessante Module gefunden, die mir auf den 2. Blick beide nicht wirklich weiterhelfen...
1. Term::ReadKey: Liest anscheinend die Eingaben, aber nicht im Hintergrund, sprich es Liest scheinbar nur Eingaben im aktiven Perlfenster.
2. Win32::KeyState: Liest Eingaben von best. Tasten (wie ich auf Buchstabentasten zugreife, habe ich noch nicht herausgefunden), doch setzt diese Tasten nach der Eingabe in einen Status, beispiel: Tab drücken -> Tab aktiv, nochmal Tab drücken -> Tab inaktiv.
Der Code dafür:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
#!/usr/bin/perl -w

use strict;
use Win32::KeyState qw(:get);

while(1)
{
if (GetKeyState(0x09) & 1)
{
print "Tab = Pressed\n";
$_ = 0
}
}


Ich weiss einfach nicht, wie ich vorgehen soll.
Kennt vlt jemand ein besser geeignetes Modul als die genannten?
Hat möglicherweise jemand Erfahrung mit diesem Projekt?

GreetZ, ~Br4inP4in~
murphy
 2007-06-19 03:49
#77636 #77636
User since
2004-07-19
1776 Artikel
HausmeisterIn
[Homepage]
user image
Für einen echten Keylogger, der alle Tastatureingaben mitliest, egal für welches Programm sie bestimmt sind, wird man wohl zwangsläufig entweder Code in den Systemkernel oder in alle existierenden Prozesse laden müssen.

Unter Windows realisieren viele Schadprogramme Keylogging mit Hilfe der Win32-API-Funktion SetWindowsHookEx und mit einigen Tricks um wirklich systemweit die Tastenereignisse abfangen zu können. Zum Beispiel könnte man die entsprechende Funktion oder ganze DLL, die die Tastenereignisse mitloggen soll, anderen Prozessen unterschieben, indem man mit Hilfe der API zum Starten von Threads in fremden Prozessen den Ladecode einschleust. Das CPAN:Win32::API-Modul dürfte alle nötigen Funktionen bieten, um das Problem in ansonsten purem Perl zu lösen -- jedenfalls wenn man nicht davor zurückschreckt, Maschinencode direkt in Perlstrings einzutippen...

Um schnell etwas funktionierendes hinschreiben zu können, kenne ich mich aber zu schlecht mit Windows aus. Außerdem frage ich mich, ob es außer purem Interesse oder bösartigen Absichten noch andere sinnvolle Gründe für ein solches Programm geben könnte...
When C++ is your hammer, every problem looks like your thumb.
~Br4inP4in~
 2007-06-19 15:43
#77637 #77637
User since
2007-06-13
28 Artikel
BenutzerIn
[default_avatar]
Hi, danke für deine Antwort!

Quote
Außerdem frage ich mich, ob es außer purem Interesse oder bösartigen Absichten noch andere sinnvolle Gründe für ein solches Programm geben könnte...

Ich dachte mir schon, dass das kommt, aber es ist in dem Fall lediglich das Interesse... Wenn ich für "bösartige Absichten" einen Keylogger bräuchte, könnte ich mir 20 Stück runterladen, die genau das tun, was ich will und bräuchte mir die Arbeit nicht machen. Mir geht es lediglich darum, mich an diesem (anscheinend ziemlich Komplexen) Projekt zu versuchen, da ich es Interessant finde.

Quote
Das CPAN: Win32::API-Modul dürfte alle nötigen Funktionen bieten, um das Problem in ansonsten purem Perl zu lösen -- jedenfalls wenn man nicht davor zurückschreckt, Maschinencode direkt in Perlstrings einzutippen...

Also werde ich ohne ASM-Kenntnisse nicht weiterkommen?

Vlt fällt ja jemandem eine alternative Vorgehensweise ein?

GreetZ, ~Br4inP4in~
GwenDragon
 2007-06-19 15:59
#77638 #77638
User since
2005-01-17
14784 Artikel
Admin1
[Homepage]
user image
Du mußt nur wissen, welchen Win-API-Aufruf du für die Tastatur brauchst.
Und wie du das Perlskript mittles möglicherweise eines kleinen C-Programms in den Tastaturhandler des Betriebssystems einhängst.
Assembler ist nicht vonnöten.

Du musst dich nur einlesen in die Entwickler-Doku von Windows.

Schau mal auf MSDN: http://msdn.microsoft.com/library/default.asp
Da kannst du dann was über die Win-API finden.

Ich arbeite derzeit schon lange nicht mehr mit der Win-API, deswegen meine knappe Auskunft.\n\n

<!--EDIT|GwenDragon|1182255461-->
murphy
 2007-06-19 16:54
#77639 #77639
User since
2004-07-19
1776 Artikel
HausmeisterIn
[Homepage]
user image
[quote=GwenDragon,19.06.2007, 13:59][...] Assembler ist nicht vonnöten. [...][/quote]
Wenn ich das richtig im Kopf habe, kann man zwar mit der Win32-API einen Tastaturhook setzen, dieser wird dann aber nur für Eingaben an das aktuell laufende Programm aufgerufen. Deswegen ist die einfachste Möglichkeit, einen systemweiten Keylogger zu installieren, eine DLL zu schreiben, welche in ihrer Initialisierungsroutine den Tastaturhook setzt, und diese DLL dann allen laufenden Prozessen unterzuschieben.

Dieses Unterschieben ist aber nicht völlig trivial, denn es erfordert, dass man einen DLL-Ladecode in den Adressraum des Zielprozesses injiziert und dann auch ausführt. Das geht entweder, indem man einen Pufferüberlauf im Zielprozess ausnutzt oder einfacher indem man nach der Codeinjektion über Debuggerfunktionen die Laderoutine als ferngesteuerten Thread starten lässt.

Man braucht hier aber als Ladecode wenn möglich positionsunabhängigen Code, der auf keinerlei globale Objekte zugreift. Ich denke, dass es zwar möglich ist, diesen in C oder einer anderen Hochsprache zu erstellen, aber mit Assembler dürfte das fast einfacher gehen. (edit: Zum Beispiel muss man in diesem Ladecode alle Relokationen für benötigte Win32-API-Symbole von Hand ausführen, womit dann die Verwendung einer Hochsprache fast schon witzlos wird.)

Auf jeden Fall kommt man nicht mit purem Perl aus, wenn man den Maschinencode für die DLL und die injizierte Routine nicht von Hand erstellt.\n\n

<!--EDIT|murphy|1182257841-->
When C++ is your hammer, every problem looks like your thumb.
<< >> 5 Einträge, 1 Seite



View all threads created 2007-06-18 23:59.