Dla całkiem dobrego przykładu, spójrz na kod showkey.
W szczególności tutaj jest główna pętla. Wystarczy, że pobierze terminal, skopiuje go, przekieruje skopiowany do trybu nieprzetworzonego i dopóki nie zostanie wydana sekwencja klawiszy "quit" lub "interrupt", to po prostu wydrukuje klucz podany terminalowi.
/*
* showkey.c -- display cooked key sequences
*
* Invoke this (no arguments needed) to see keycap-to-keystrokes mappings.
*
* by Eric S. Raymond <[email protected]>, 1 Nov 88
* - fix for little-endian machines (version 1.1), 21 Oct 1996.
* - cleanup and modern packaging (version 1.2), 1 Aug 2002.
* - changed to use termios (version 1.3), 26 Aug 2002.
* See the RPM spec file changelog for more recent stuff.
*/
#include <stdio.h>
#include <termios.h>
#include <signal.h>
#include <string.h>
#include <stdbool.h>
static int signalled;
// ...
main()
{
struct termios cooked, raw;
unsigned char c;
unsigned int i, timeouts;
char intrchar[32], quitchar[32];
for (i = SIGHUP; i <= SIGIO; i++)
(void) signal(c, catcher);
// Get the state of the tty
(void) tcgetattr(0, &cooked);
// Make a copy we can mess with
(void) memcpy(&raw, &cooked, sizeof(struct termios));
// Turn off echoing, linebuffering, and special-character processing,
// but not the SIGINT or SIGQUIT keys.
raw.c_lflag &=~ (ICANON | ECHO);
// Ship the raw control blts
(void) tcsetattr(0, TCSANOW, &raw);
(void) printf("Type any key to see the sequence it sends.\n");
visualize(raw.c_cc[VINTR], intrchar);
visualize(raw.c_cc[VQUIT], quitchar);
(void) printf("Terminate with your shell interrupt %s or quit %s character.\n",
intrchar, quitchar);
signalled = 0;
while (!signalled)
{
char cbuf[32];
read(0, &c, 1);
visualize(c, cbuf);
(void)fputs(cbuf, stdout);
(void) fflush(stdout);
}
(void) printf("\nBye...\n");
// Restore the cooked state
(void) tcsetattr(0, TCSANOW, &cooked);
}
Należy [1] Stan ty problemem trochę jaśniej (można uzyskać dostęp do źródła aplikacji? The powłoki? Os? Tak czy owak, gdzie dokładnie jesteś zawieszony) i [2] nas przekonać, że robilibyśmy coś dobrego dla świata, zamiast pomagać ci pisać kolejny rootkit (widzisz, twoja rączka nie robi ci żadnych przysług w tym względzie). – dmckee
Chce napisać 52-gi keylogger dla Linuksa. Wielka rzecz. Twoja moralność go nie powstrzyma. Przynajmniej nie jest w superużytkowniku, pytając, gdzie go pobrać. ;) –
@dmckee Przypisanie keyloggera jest typowym przydziałem C/Asembler na uczelni. Mógłby być skryptowym kiddy, który chce się wkurzyć, ale co z tego? Zadaje pytanie i zasługuje na odpowiedź, niezależnie od jego intencji. –