Cet article décrit le processus d'implémentation de la méthode de transfert de fichiers du cheval de Troie sous Delphi sous forme d'exemples. Les étapes spécifiques sont les suivantes :
Code côté serveur :
unité ServerFrm ; interface utilise Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ComCtrls, StdCtrls, ExtCtrls, WinSock ; type TfrmMain = class (TForm) Panel1 : TPanel ; Label1 : edtPort : TEdit ; : TPanel ; barre d'état : TStatusBar ; TSaveDialog ; btnListen : TButton ; btnReceive : TButton ; btnStop : TButton ; procédure FormCreate (Expéditeur : TObject); procédure btnExitClick ; Expéditeur : TObject ); btnReceiveClick(Sender: TObject); procédure btnStopClick(Sender: TObject); private { Déclarations privées } public { Déclarations publiques } StopTrans:Boolean; //S'il faut arrêter la transmission switchInTrans:Boolean; //Indique que le fichier est en cours de réception. :TSocket; / /Définir le handle du socket côté serveur//Processus personnalisé pour recevoir les fichiers, procédure RecvFile(FileName:String end;var frmMain: TfrmMain;const BlockLen=1024*4;implémentation{$R *.dfm}procédure tfrmmain.RecvFile(FileName:String);var Ftrans:file of Byte; Blockbuf:array[0..BlockLen-1] of Octet ; RecvSocket : TSocket ; ra : Sockaddr_in ; ra_len:integer;begin ra_len:=sizeof(ra); Recvsocket:=accept(server,@ra,@ra_len); assignFile(Ftrans,filename); :=recv(recvsocket,Blockbuf,BlockLen,0); while (recelen>0) et (pas StopTrans) commence BlockWrite(Ftrans,Blockbuf[0],BlockLen); application.ProcessMessages; recelen:=recv(recvsocket,Blockbuf,Blocklen,0); =False ; MessageBox(Handle, 'Arrêter la transmission !', 'Prompt',MB_OK); EXIT; END; END; //Ferme le fichier, reçu SOCKET CloseFile(Ftrans); Closesocket(recvsocket); if (Recelen=SOCKET_ERROR) then messagebox(handle,'Transmission terminée anormalement!','Prompt' ,MB_OK) AUTRE MESSAGEBOX(HANDLE,'Le client a fermé la connexion 1, le fichier a peut-être été transféré !','Prompt',MB_OK);end; procédure TfrmMain.FormCreate(Sender: TObject);var aWSAData:TWSAData;begin if WSAStartup($0101 ,aWSAData)<>0 puis déclenche Exception.Create('Impossible de démarrer la bibliothèque de liens dynamiques WinSock'); messageBox(Handle,aWSAdata.szDescription,'Version de la bibliothèque de liens dynamiques WinSock',mb_ok);end;procedure TfrmMain.btnExitClick(Expéditeur: TObject);begin Close;end;procedure TfrmMain.FormClose(Expéditeur: TObject; var Action: TCloseAction) ;commencer si InTrans puis si MessageBox(handle,'Recevoir des fichiers, arrêter ? ','Prompt',MB_YESNO)=IDNO then abort; IF SERVER<>INVALID_SOCKET THEN CLOSESOCKET(SERVER); //Libère les ressources créées par la bibliothèque de liens dynamiques winsock si WSACleanup<>0 then messagebox(handle,'Clear the Winsock erreur de bibliothèque de lien dynamique ! ','prompt',MB_OK) ELSE messagebox(handle,'Effacer la bibliothèque de liens dynamiques Winsock avec succès !','Prompt',MB_OK);end;procedure TfrmMain.btnListenClick(Sender: TObject);var ca:SOCKADDR_IN;begin //Créer un SOCKET côté serveur Server:=Socket ( PF_INET,SOCK_STREAM,IPPROTO_IP); SI server=invalid_socket puis commencez stabar.SimpleText :='Créer et recevoir l'erreur SOCKET 1'; exit; end; // Lier le SOCKET côté serveur ca.sin_family :=CA.sin_port :=htons(strtoint(trim(edtPort.Text ))); . S_addr :=INADDR_ANY; si bind(server,ca,sizeof(ca))=socket_error alors commencez stabar.SimpleText. :='Erreur de socket de liaison, veuillez changer le port de réception'; closeSocket(server exit; end else stabar.SimpleText :='Liaison du socket de réception réussie !'; Enabled :=False; btnstop.Enabled :=true;end;procedure TfrmMain.btnReceiveClick(Sender: TObject);begin if (server=INVALID_SOCKET) THEN BEGIN MESSAGEBOX(HANDLE,'Pas encore d'écoute, veuillez d'abord écouter !','Prompt',MB_OK END; IF SaveDialog.Execute THEN RECVFILE(SaveDialog.FileName end;procedure TfrmMain); btnStopClick(Expéditeur : TObject);commencer STOPTRANS:=TRUE; IF SERVER<>INVALID_SOCKET THEN cLOSESOCKET(SERVER); //Server:=INVALID_SOCKET doit être indiqué ici ; bTNSTOP.Enabled :=fALSE;
Code client :
unité ClientFrm ; interface utilise Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ComCtrls, WinSock ; tapez TfrmMain = class (TForm) opendfile : TOpenDialog ; Label1 : edtIP : TEdit ; ; edtPort : TEdit ; Barre d'état : TStatusBar ; btnConnect : TButton ; btnSend : TButton ; btnStop : TButton ; btnExit : TButton ; procédure FormCreate (Expéditeur : TObject) ; procédure btnExitClick (Expéditeur : TObject) ; btnConnectClick(Expéditeur : TObject); btnSendClick(Sender: TObject); procédure btnStopClick(Sender: TObject); private { Déclarations privées } Client:TSocket; public { Déclarations publiques } StopTrans:Boolean; //S'il faut arrêter l'envoi developmentInTrans:Boolean; en cours Procédure de fichier TransFile(FileName:String); //Le processus de transfert des fichiers se termine; const BlockLen=1024*4; //La quantité maximale de données envoyées à chaque fois var frmMain: TfrmMain;implémentation{$R *.dfm}procédure TfrmMain.TransFile(FileName:String); //Le processus de transfert de fichiers var Ftrans:file of Byte; BlockNum,RemainLen:integer; 0 ..BlockLen-1] d'octet ; i : entier ; SendLen : entier ; début assignFile(Ftrans,filename); reset(Ftrans); Flen:=FileSize(Ftrans); BlockNum:=Flen div BlockLen; progressBar.Max :=1+BlockNum; =True ; SendLen:=1 ; pour i:=0 à BlockNum-1, commencez si (StopTrans) ou (SendLen<=0) puis BlockRead(Ftrans,Blockbuf[0],BlockLen:=Send(Client,Blockbuf,BlockLen,0); puis commencez CloseFile(Ftrans); InTrans:=False; StatusBar.SimpleText :=''; MessageBox(Handle,'Arrêter la transmission !','Prompt',mb_ok); progressbar.Position :=0; exit; if (SendLen<=0) then start CloseFile(Ftrans:=False; :=''; messagebox(handle,'Terminaison anormale sortante!','Prompt',MB_OK); progressBar.Position :=0; puis commencez BlockRead(Ftrans,BlockBuf[0],RemainLen); SendLen:=send(client,BlockBuf,Remainlen,0); if (sendLen<=0) alors commencez closeFile(Ftrans:=FalseStatus); :=''; messagebox(handle,'La transmission s'est terminée anormalement !','Prompt',mb_ok); end; end; progressBar.Position :=ProgressBar.Max ; CloseFile(Ftrans);=False; StatusBar.SimpleText :=''; Position :=0;end;procédure TfrmMain.FormCreate(Sender: TObject);var aWSAData:TWSAData;begin if WSAStartup($0101,aWSAData)<>0 puis déclenche Exception.Create('Impossible de démarrer la bibliothèque de liens dynamiques WinSock'); messageBox(Handle,aWSAdata.szDescription,'Version de la bibliothèque de liens dynamiques WinSock',mb_ok);end;procedure TfrmMain.btnExitClick (Expéditeur : TObject);début Fermer;fin;procédure TfrmMain.FormClose(Expéditeur : TObject ; var Action : TCloseAction);commencer si InTrans puis si MessageBox(handle,'Transmission de fichiers, arrêter ? ','Prompt',MB_YESNO)=IDNO then abort; //Libérez les ressources créées par la bibliothèque de liens dynamiques Winsock si WSACleanup<>0 puis messagebox(handle,'Effacer l'erreur de la bibliothèque de liens dynamiques Winsock !','Prompt',MB_OK) ELSE messagebox(handle,'Effacer la bibliothèque de liens dynamiques Winsock avec succès !','Prompt',MB_OK);end;procedure); TfrmMain.btnConnectClick(Sender: TObject);var ca:SOCKADDR_IN; hostaddr:u_long;begin Client:=Socket(PF_INET,SOCK_STREAM,IPPROTO_IP); IF CLIENT=INVALID_SOCKET THEN BEGIN StatusBar.SimpleText :='Créer un COSKET pour la connexion à la télécommande Erreur du serveur ! » ; quitter ; fin ; :=PF_INET; CA.sin_port :=HTONS(STRTOINT(TRIM(EDTpORT.Text ))); HOSTADDR:=INET_ADDR(PCHAR(TRIM(EDTIP.Text ))); -1 ) puis commencez StatusBar.SimpleText :='Adresse IP de l'hôte :'+trim(edtip.Text)+'Error'; ca.sin_addr.S_addr :=hostaddr; //Connectez-vous au serveur si connect(Client,ca,sizeof(ca))<>0 puis commencez StatusBar.SimpleText :='Erreur de SOCKET lors de la connexion au serveur !'; else StatusBar.='Connectez-vous au SOCKET distant avec succès !';fin;procédure TfrmMain.btnSendClick(Expéditeur : TObject);commencez si (opendfile.Execute ) et (FileExists(opendfile.FileName )) puis transFile(opendfile.FileName );end;procedure TfrmMain.btnStopClick(Sender: TObject);begin Stoptrans:=True;end;end.