Bene , in questa guida voglio postare un programmino fatto in 2°ore circa ... si tratta di un keylogger remoto , naturalmente reverse testato su 3 persono (win7 , win vista , e win xp). Allora anticipo che il Reverse non è nulla di straordinario perchè non è altro che invertire i "ruoli" infatti per il test del keylogger si invia il client e non il server che quindi si connetterà al server che era presente sul pc ... Ma il motivo di cambiare i ruoli è dovuto al fatto che i modem sono protetti da firewall e per far connettere un server in remoto bisogna fare le seguenti cose :
1)Impostare il Dns Dinamico (io uso no-ip)
2) Disabilitare i Firewall
3) Impostare una regola personalizzata per un virtual server , indicando l'indirizzo ip del pc (quello 192.168.1. etc...)
Naturalmente che possiede il server (che nel reverse , chiamiamo "client") deve fare le 3 cose sopracitate! Bene , quindi vi posto il code
Lato Server
Lato Client
Bene , iniziamo a spiegare questo keylogger , partiamo da server :
Imports serve per importare namespace ( un namespace contiene al suo interno + classi o + namespace)
tra gli imports usati c'è imports system.net (namaspace che contiene le classi fondamentali per la comunicazione in rete)
inoltre importo un namespace imports system.net.sockets e infine il tipo di testo Utf32
passando al Load del form :
dichiaro una variabile stringa contenente l'host no-ip
dim host as new gethost ' creo l'oggetto di gethost (ricordo che gethost è una classe presente nel progetto, e non presenta costruttore !)) Per chi non sapesse cosa sono le classi in vb.net ..cliccasse il link sottostante
Classi Vb.net -Spiegazione
nella classe gethost c'è solo un membro una funzione che risolve mediante il Dns (Domain Name system) , il dns non fa altro che tradurre un ip in sito web o host oppure il sito in ip !
visto che la funzione host (membro della classe gethost) restituisce un valore di tipo string dovrà essere contenuto in una variabile di tipo string , quest'ultima sarà ipfinal!
Passiamo alla funzione host (della Classe Gethost)
riceve come argomento un stringa contenente l'host
la prima cosa che fà :
Dim dns As Net.IPHostEntry = System.Net.Dns.GetHostEntry(ip)
iphostentry è una classe che può contenere ip & host ! system.net.dns.gethostentry(ip) risolve l'host no-ip restituendo un tipo Iphostentry
Una proprietà molto importante di questa classe iphostentry è andresslist
quest'ultima , restituisce un "Ipandress" proprie per questo motivo l'ho inserita in una variabile di tipo Ipandress
anche se , questa proprietà contiene il metodo .tostring ( è un metodo ereditarietario dalla classe socket)
e quindi potevo fare anche un istruzione del genere :
torniamo di nuovo al form load
c'è questa istruzione
client=new tcpClient ' crea l'oggetto a runtime fino ad ora non esisteva !
Sintatticamente sconsiglio l'uso di on error resume next bensì da sostituire con Try..catch .. finally .. end try in quanto obsoleta è appartenente al vb6
A livello di applicazione (come keylogger) consiglio on error resume next ;
in quanto l'applicazione con try..catch .. end try userebbe più CPU oltre che un 10-15% in + a livello di memoria .
Proseguiamo nella spiegazione c'è Timer2.start()
partiamo da timer2.start()
c'è l'istruzione key.keylogger (key è una classe creata subito)
analizziamo la classe key , presente anch'essa nel progetto
alla prima riga della classe troviamo :
Private Declare Function GetAsyncKeyState Lib "user32" Alias "GetAsyncKeyState" (ByVal vKey As Keys) As Keys
analizziamo keyword x keyword
Private :la prima keyword è il livello di accessibilità all'interno di una classe , quindi significa esternamente non si può usare
Declare : questa keyword serve per implementare funzione o procedure esterne che fanno parte delle librerie di windows
Fuction : indica che restituirà un valore , dato immesso alla fine
GetAsyncKeyState= nome della funzione , poteva anche chiamarsi geppetto , tanto per dire a quelli che fanno ctrl+c e ctrl +v questo nome non è dato a caso , bensì xk così la identifica windows in tutte le sue applicazione
Lib: introduce finalmente di che libreria parliamo ; equivale + o meno al C #include <user32>
Alias a differenza del C questa magica keyword ci permette di dichiarare soltante le parti "utili per il programma" e qui ricorre la parola "GetAsyncKeyState" identificativo per user32
(byval vkey as keys) 'come tutte le funzioni ha per lo meno un valore che riceve e restituisce un valore di tipo keys
Bene passiamo alla procedura keylogger --- metodo accessibile al timer successivamente
c'è un variabile di tipo fi che Io.fileinfo viene istanziata passandoci un valore ( il percorso di partenza dell'app & key.txt)
successivamente un variabile di tipo streamwriter (da notora che non è istanziata)
e una semplice stringa di ch
Se qualcuno se ne reso conto ho tralasciato l'istruzione for , va be uno pensa , il ciclo for fa un azione da n a n
ma nessuno si è chiesto perchè da 3 a 255 ???
ecco la risposta : partiamo dalla tabella del codice
bhè se è composto da 255 caratteri totali perché partire proprio dal terzo : semplice , il valore 0000000 (corrispondente al decimale 0, ricordo che l'ascii lavora su 8bit) indica il carattere nullo , famoso nel linguaggio C : '\0' come mezzo per indicare la fine di una stringa
il valore 1 (00000001) equivale allo start of header
il valore 2 (00000010) equivale allo start of text (inizio del testo)
il valore 3 (00000011) equivale al end of text (fine del testo)
perfetto quindi significa che immesso un carattere scorre i e confronta con la funzione :
if GetAsyncKeyState(i) then ' se i corrisponde alla lettere digitata esempio a=97 quando arriva a 97 va nel if
nel if c'è un altra istruzione particolare
ch = DirectCast(i, System.Windows.Forms.Keys).ToString
directcast non è un OPERATORE DI CONVERSIONE , molti lo confondono con ctype!! , directcast fa il casting di un oggetto e si usa nei seguenti casi :
1)Unboxing di tipi Value
2) casting di classe Base a Derivata
3) casting di oggetti
4) casting di interfaccie
il nostro caso è il 3 in quanto il windows.forms è una classe
casting( numero , in un enumaratore della classe keys ) . infine in stringa
siamo rimasti al casting nel enumeratore keys , dopodichè ci sono 2 condizioni
dopodichè c'è sw.write(ch) cioé scrivi quello di ch
infine come di consuetudine si chiude e si libera lo streamwriter.
Nella classe keylogger è presente anche un altro membro , una proprietà di sola lettura che per ora tralascio , le proprietà sono utili per la comunicazione tra una classe e l'altra !
Torniamo all' istruzione del Form Load
timer1.start()
Soffermiamoci su ch=key._testo membro della classe key , la sua funzione non è altro che leggere i dati scritti sul file in precedenza dal keylogger
allora questo code è un pò "fasullo" perchè presumiamo che il server (questa applicazione, nel reverse client) abbia stabilito una comunicazione con il nostro client( nel reverse server) ... noi client inviamo prima che l'utente scriva qualcosa bhè l'applicazione va in crash xk non trova il file bisognerebbe controllare se il file esiste e poi successivamente leggere quindi questa sarebbe la modifica da fare :
Questo è il code corretto per gestire questa eventualità.
BENE , abbiamo analizzato il server ora passiamo al client :
Sul client non c'è molto da dire oltre
al formload
si crea l'oggetto tcplistener(che avrà un endpoint(composta da qualsiasi ip,porta 2000)
server.start() 'inizia ad ascoltare
avvia il timer
Analizziamo accetta:
Timer2
Spero si utile :-D
GUIDA FINITA
1)Impostare il Dns Dinamico (io uso no-ip)
2) Disabilitare i Firewall
3) Impostare una regola personalizzata per un virtual server , indicando l'indirizzo ip del pc (quello 192.168.1. etc...)
Naturalmente che possiede il server (che nel reverse , chiamiamo "client") deve fare le 3 cose sopracitate! Bene , quindi vi posto il code
Lato Server
Codice:
Perfavore,
Entra
oppure
Registrati
per vedere i codici!
Codice:
Perfavore,
Entra
oppure
Registrati
per vedere i codici!
Bene , iniziamo a spiegare questo keylogger , partiamo da server :
Imports serve per importare namespace ( un namespace contiene al suo interno + classi o + namespace)
tra gli imports usati c'è imports system.net (namaspace che contiene le classi fondamentali per la comunicazione in rete)
inoltre importo un namespace imports system.net.sockets e infine il tipo di testo Utf32
passando al Load del form :
dichiaro una variabile stringa contenente l'host no-ip
dim host as new gethost ' creo l'oggetto di gethost (ricordo che gethost è una classe presente nel progetto, e non presenta costruttore !)) Per chi non sapesse cosa sono le classi in vb.net ..cliccasse il link sottostante
Classi Vb.net -Spiegazione
nella classe gethost c'è solo un membro una funzione che risolve mediante il Dns (Domain Name system) , il dns non fa altro che tradurre un ip in sito web o host oppure il sito in ip !
visto che la funzione host (membro della classe gethost) restituisce un valore di tipo string dovrà essere contenuto in una variabile di tipo string , quest'ultima sarà ipfinal!
Passiamo alla funzione host (della Classe Gethost)
riceve come argomento un stringa contenente l'host
la prima cosa che fà :
Dim dns As Net.IPHostEntry = System.Net.Dns.GetHostEntry(ip)
iphostentry è una classe che può contenere ip & host ! system.net.dns.gethostentry(ip) risolve l'host no-ip restituendo un tipo Iphostentry
Una proprietà molto importante di questa classe iphostentry è andresslist
quest'ultima , restituisce un "Ipandress" proprie per questo motivo l'ho inserita in una variabile di tipo Ipandress
anche se , questa proprietà contiene il metodo .tostring ( è un metodo ereditarietario dalla classe socket)
e quindi potevo fare anche un istruzione del genere :
Codice:
Perfavore,
Entra
oppure
Registrati
per vedere i codici!
torniamo di nuovo al form load
c'è questa istruzione
client=new tcpClient ' crea l'oggetto a runtime fino ad ora non esisteva !
Codice:
Perfavore,
Entra
oppure
Registrati
per vedere i codici!
Sintatticamente sconsiglio l'uso di on error resume next bensì da sostituire con Try..catch .. finally .. end try in quanto obsoleta è appartenente al vb6
A livello di applicazione (come keylogger) consiglio on error resume next ;
in quanto l'applicazione con try..catch .. end try userebbe più CPU oltre che un 10-15% in + a livello di memoria .
Proseguiamo nella spiegazione c'è Timer2.start()
partiamo da timer2.start()
c'è l'istruzione key.keylogger (key è una classe creata subito)
analizziamo la classe key , presente anch'essa nel progetto
alla prima riga della classe troviamo :
Private Declare Function GetAsyncKeyState Lib "user32" Alias "GetAsyncKeyState" (ByVal vKey As Keys) As Keys
analizziamo keyword x keyword
Private :la prima keyword è il livello di accessibilità all'interno di una classe , quindi significa esternamente non si può usare
Declare : questa keyword serve per implementare funzione o procedure esterne che fanno parte delle librerie di windows
Fuction : indica che restituirà un valore , dato immesso alla fine
GetAsyncKeyState= nome della funzione , poteva anche chiamarsi geppetto , tanto per dire a quelli che fanno ctrl+c e ctrl +v questo nome non è dato a caso , bensì xk così la identifica windows in tutte le sue applicazione
Lib: introduce finalmente di che libreria parliamo ; equivale + o meno al C #include <user32>
Alias a differenza del C questa magica keyword ci permette di dichiarare soltante le parti "utili per il programma" e qui ricorre la parola "GetAsyncKeyState" identificativo per user32
(byval vkey as keys) 'come tutte le funzioni ha per lo meno un valore che riceve e restituisce un valore di tipo keys
Bene passiamo alla procedura keylogger --- metodo accessibile al timer successivamente
Codice:
Perfavore,
Entra
oppure
Registrati
per vedere i codici!
c'è un variabile di tipo fi che Io.fileinfo viene istanziata passandoci un valore ( il percorso di partenza dell'app & key.txt)
successivamente un variabile di tipo streamwriter (da notora che non è istanziata)
e una semplice stringa di ch
Se qualcuno se ne reso conto ho tralasciato l'istruzione for , va be uno pensa , il ciclo for fa un azione da n a n
ma nessuno si è chiesto perchè da 3 a 255 ???
ecco la risposta : partiamo dalla tabella del codice
Perfavore,
Entra
oppure
Registrati
per vedere i Link!
(tipo di testo ufficiale composto da 255 caratteri totali) bhè se è composto da 255 caratteri totali perché partire proprio dal terzo : semplice , il valore 0000000 (corrispondente al decimale 0, ricordo che l'ascii lavora su 8bit) indica il carattere nullo , famoso nel linguaggio C : '\0' come mezzo per indicare la fine di una stringa
il valore 1 (00000001) equivale allo start of header
il valore 2 (00000010) equivale allo start of text (inizio del testo)
il valore 3 (00000011) equivale al end of text (fine del testo)
perfetto quindi significa che immesso un carattere scorre i e confronta con la funzione :
if GetAsyncKeyState(i) then ' se i corrisponde alla lettere digitata esempio a=97 quando arriva a 97 va nel if
nel if c'è un altra istruzione particolare
ch = DirectCast(i, System.Windows.Forms.Keys).ToString
directcast non è un OPERATORE DI CONVERSIONE , molti lo confondono con ctype!! , directcast fa il casting di un oggetto e si usa nei seguenti casi :
1)Unboxing di tipi Value
2) casting di classe Base a Derivata
3) casting di oggetti
4) casting di interfaccie
il nostro caso è il 3 in quanto il windows.forms è una classe
casting( numero , in un enumaratore della classe keys ) . infine in stringa
siamo rimasti al casting nel enumeratore keys , dopodichè ci sono 2 condizioni
Codice:
Perfavore,
Entra
oppure
Registrati
per vedere i codici!
dopodichè c'è sw.write(ch) cioé scrivi quello di ch
infine come di consuetudine si chiude e si libera lo streamwriter.
Nella classe keylogger è presente anche un altro membro , una proprietà di sola lettura che per ora tralascio , le proprietà sono utili per la comunicazione tra una classe e l'altra !
Torniamo all' istruzione del Form Load
timer1.start()
Codice:
Perfavore,
Entra
oppure
Registrati
per vedere i codici!
Soffermiamoci su ch=key._testo membro della classe key , la sua funzione non è altro che leggere i dati scritti sul file in precedenza dal keylogger
Codice:
Perfavore,
Entra
oppure
Registrati
per vedere i codici!
Codice:
Perfavore,
Entra
oppure
Registrati
per vedere i codici!
Questo è il code corretto per gestire questa eventualità.
BENE , abbiamo analizzato il server ora passiamo al client :
Sul client non c'è molto da dire oltre
al formload
si crea l'oggetto tcplistener(che avrà un endpoint(composta da qualsiasi ip,porta 2000)
server.start() 'inizia ad ascoltare
avvia il timer
Codice:
Perfavore,
Entra
oppure
Registrati
per vedere i codici!
Analizziamo accetta:
Codice:
Perfavore,
Entra
oppure
Registrati
per vedere i codici!
Timer2
Codice:
Perfavore,
Entra
oppure
Registrati
per vedere i codici!
Spero si utile :-D
GUIDA FINITA
Ultima modifica: