Dieser Artikel beschreibt den Implementierungsprozess der Trojaner-Dateiübertragungsmethode unter Delphi anhand von Beispielen. Die spezifischen Schritte sind wie folgt:
Serverseitiger Code:
unit ServerFrm;interfaceuses Windows, Messages, Graphics, Controls, Forms, Dialogs, ComCtrls, StdCtrls, ExtCtrls,WinSock;type TfrmMain = class(TForm) Panel1: TPanel; Label1: TLabel; edtPort: TEdit; : TPanel; stabar: TStatusBar; TSaveDialog; btnReceive: TButton; btnExit: TButton; procedure btnExitClick(Sender: TObject; var Action: TCloseAction); Absender: TObject); Prozedur btnReceiveClick(Sender: TObject); procedure btnStopClick(Sender: TObject); private { Private Deklarationen } StopTrans:Boolean; //Gibt an, dass die Datei empfangen wird :TSocket; / /Definieren Sie das Socket-Handle auf der Serverseite//Angepasster Prozess zum Empfangen von Dateien procedure RecvFile(FileName:String;var frmMain); TfrmMain;const BlockLen=1024*4;implementation{$R *.dfm}procedure tfrmmain.RecvFile(FileName:String);var Ftrans:file of Byte; Recelen:Integer; Blockbuf:array[0..BlockLen-1] of Byte; RecvSocket:TSocket; ra:Sockaddr_in; ra_len:integer;begin ra_len:=sizeof(ra); Recvsocket:=accept(server,@ra,@ra_len); stoptrans:=false; :=recv(recvsocket,Blockbuf,BlockLen,0); while (recelen>0) und (not StopTrans) do begin BlockWrite(Ftrans,Blockbuf[0],BlockLen); =False; MessageBox(Handle,'Übertragung stoppen!','Prompt',MB_OK); EXIT; END; END; //Datei schließen, empfangen SOCKET CloseFile(recvsocket); ,MB_OK) ELSE MESSAGEBOX(HANDLE,'Der Client hat Verbindung 1 geschlossen, die Datei wurde möglicherweise übertragen!','Prompt',MB_OK);end; procedure TfrmMain.FormCreate(Sender: TObject);var aWSAData:TWSAData;begin if WSAStartup($0101 ,aWSAData)<>0 dann auslösen Exception.Create('WinSock Dynamic Link Library kann nicht gestartet werden'); messageBox(Handle,aWSAdata.szDescription,'WinSock Dynamic Link Library Version',mb_ok);end;procedure TfrmMain.btnExitClick(Sender: TObject);begin Close;end;procedure TfrmMain.FormClose(Sender: TObject; var Action: TCloseAction) ;begin if InTrans then if MessageBox(handle,'Empfangen von Dateien, stoppen? ','Prompt',MB_YESNO)=IDNO then abort; IF SERVER<>INVALID_SOCKET THEN CLOSESOCKET(SERVER); //Geben Sie die von der Winsock Dynamic Link Library erstellten Ressourcen frei, wenn WSACleanup<>0 then messagebox(handle,'Clear the Winsock dynamischer Link Bibliotheksfehler! ','prompt',MB_OK) ELSE messagebox(handle,'Winsock Dynamic Link Library erfolgreich löschen!','Prompt',MB_OK);end;procedure TfrmMain.btnListenClick(Sender: TObject);var ca:SOCKADDR_IN;begin //Serverseitigen SOCKET Server erstellen:=Socket ( PF_INET,SOCK_STREAM,IPPROTO_IP); IF server=invalid_socket dann beginne stabar.SimpleText :='SOCKET-Fehler 1 erstellen und empfangen; //Serverseitigen SOCKET ca.sin_family :=PF_INET;=htons(trim(edtPort.Text))); . S_addr :=INADDR_ANY; if bind(server,ca,sizeof(ca))=socket_error then begin stabar.SimpleText :='Binding-Socket-Fehler, bitte ändern Sie den Empfangsport'; closeSocket(server); Enabled :=False; btnstop.Enabled :=true;end;procedure TfrmMain.btnReceiveClick(Sender: TObject);begin if (server=INVALID_SOCKET) THEN BEGIN MESSAGEBOX(HANDLE,'Noch nicht zuhören, bitte zuerst zuhören!','Prompt',MB_OK);IF SaveDialog.Execute THEN RECVFILE(SaveDialog.FileName); end;procedure TfrmMain. btnStopClick(Sender: TObject);begin STOPTRANS:=TRUE; IF SERVER<>INVALID_SOCKET THEN cLOSESOCKET(SERVER); //Server:=INVALID_SOCKET muss hier angegeben werden; bTNSTOP.Enabled :=TRUE;end;end.
Kundencode:
unit ClientFrm;interfaceuses Windows, Messages, Graphics, Controls, Forms, Dialogs, StdCtrls, ComCtrls,WinSock;type TfrmMain = class(TForm) opendfile: TOpenDialog; Label1: TLabel; edtIP: TEdit; Label2: TLabel ; edtPort: TEdit; StatusBar: TStatusBar; btnConnect: TButton; btnStop: TButton; btnExit: TProgressBar; procedure btnExitClick(Sender: TObject); btnConnectClick(Sender: TObject); btnSendClick(Sender: TObject); procedure btnStopClick(Sender: TObject); private { Private reporting } StopTrans:Boolean; in Bearbeitung Dateiprozedur TransFile(FileName:String); //Der Prozess der Dateiübertragung endet; const BlockLen=1024*4; //Die maximale Datenmenge, die jedes Mal gesendet wird var frmMain: TfrmMain;implementation{$R *.dfm}procedure TfrmMain.TransFile(FileName:String); //Der Prozess der Dateiübertragung var Ftrans:file of Byte; 0 ..BlockLen-1] of Byte; i:integer; SendLen:Integer;begin askFile(Ftrans,filename); reset(Ftrans:=Flen div BlockLen; progressBar:=Flen mod BlockLen; =True; SendLen:=1; for i:=0 to BlockNum-1 do begin if (StopTrans) or (SendLen<=0) then Break; BlockRead(Ftrans,Blockbuf[0],BlockLen:=Send(Client,Blockbuf,BlockLen,0); if StopTrans dann beginne CloseFile(Ftrans); InTrans:=False; StatusBar.SimpleText :=''; MessageBox(Handle,'Prompt',mb_ok); progressbar.Position :=0; end; :=''; messagebox(handle,'Outgoing anormaletermination!','Prompt',MB_OK); then begin BlockRead(Ftrans,BlockBuf[0],RemainLen); if (sendLen<=0) then begin closeFile(Ftrans:=False); :=''; messagebox(handle,'Übertragung abnormal beendet!','Prompt',mb_ok); end; end; progressBar.Max ; CloseFile(Ftrans:=False; StatusBar.SimpleText)(handle,'Prompt',mb_ok); Position :=0;end;procedure TfrmMain.FormCreate(Sender: TObject);var aWSAData:TWSAData;begin if WSAStartup($0101,aWSAData)<>0 dann auslösen Exception.Create('WinSock Dynamic Link Library kann nicht gestartet werden'); messageBox(Handle,aWSAdata.szDescription,'WinSock Dynamic Link Library Version',mb_ok);end;procedure TfrmMain.btnExitClick (Sender: TObject);begin Close;end;prozedur TfrmMain.FormClose(Sender: TObject; var Action: TCloseAction);begin if InTrans then if MessageBox(handle,'Übertragung von Dateien, stoppen? ','Prompt',MB_YESNO)=IDNO then abort; //Die von der Winsock Dynamic Link Library erstellten Ressourcen freigeben, wenn WSACleanup<>0 then messagebox(handle,'Clear Winsock Dynamic Link Library Error!','Prompt',MB_OK) ELSE messagebox(handle,'Winsock Dynamic Link Library erfolgreich löschen!','Prompt',MB_OK);Ende;Prozedur 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 :='Erstelle COSKET für die Verbindung mit der Fernbedienung Serverfehler!'; beenden; ca.sin_family :=PF_INET; CA.sin_port :=HTONS(STRTOINT(TRIM(EDTpORT.Text))); HOSTADDR:=INET_ADDR(PCHAR(TRIM(EDTIP.Text))); -1) dann beginnen StatusBar.SimpleText :='Host-IP-Adresse:'+trim(edtip.Text)+'Error'; ca.sin_addr.S_addr :=hostaddr; //Mit dem Server verbinden if connect(Client,ca,sizeof(ca))<>0 then begin StatusBar.SimpleText :='SOCKET error connected to the server!'; else StatusBar. SimpleText :='Verbindung zum Remote-SOCKET erfolgreich herstellen!';end;procedure TfrmMain.btnSendClick(Sender: TObject);begin if (opendfile.Execute ) und (FileExists(opendfile.FileName )) then transFile(opendfile.FileName );end;procedure TfrmMain.btnStopClick(Sender: TObject);begin Stoptrans:=True;end;end.