Este artículo describe el proceso de implementación del método de transferencia de archivos troyanos en Delphi en forma de ejemplos. Los pasos específicos son los siguientes:
Código del lado del servidor:
unidad ServerFrm; interfaz utiliza Windows, Mensajes, SysUtils, Variantes, Clases, Gráficos, Controles, Formularios, Diálogos, ComCtrls, StdCtrls, ExtCtrls, WinSock; tipo TfrmMain = clase (TForm) Panel1: TPanel Etiqueta1: TLabel: TEdit; : TPanel; barra de estado: TStatusBar; TSaveDialog; btnListen: TButton; btnReceive: TButton; btnStop: TButton; btnExit; procedimiento FormCreate(Remitente: TObject); procedimiento btnListenClick( Remitente: TObject); btnReceiveClick(Remitente: TObject); procedimiento btnStopClick(Remitente: TObject); private { Declaraciones privadas } public { Declaraciones públicas } StopTrans:Boolean //Si se debe detener la transmisión switchInTrans:Boolean; :TSocket; //Definir el identificador del socket en el lado del servidor//Proceso personalizado para recibir archivos procedimiento RecvFile(FileName:String;var frmMain); TfrmMain;const BlockLen=1024*4;implementación{$R *.dfm}procedimiento tfrmmain.RecvFile(FileName:String);var Ftrans:archivo de Byte; Blockbuf:array[0..BlockLen-1] de Byte; RecvSocket:TSocket;ra:Sockaddr_in; ra_len:integer;begin ra_len:=sizeof(ra); Recvsocket:=accept(server,@ra,@ra_len); asignarFile(Ftrans,filename); :=recv(recvsocket,Blockbuf,BlockLen,0); mientras (recelen>0) y (no); StopTrans) comience BlockWrite(Ftrans,Blockbuf[0],BlockLen); application.ProcessMessages; recelen:=recv(recvsocket,Blockbuf,Blocklen,0); =Falso; MessageBox(Manejar,'¡Detener transmisión!','Mensaje',MB_OK); EXIT; END; END; //Cerrar el archivo, recibido SOCKET CloseFile(Ftrans); Closesocket(recvsocket); InTrans:=False;'Preguntar' ,MB_OK) MÁS MESSAGEBOX(HANDLE,'El cliente ha cerrado la conexión 1, ¡es posible que el archivo haya sido transferido!','Prompt',MB_OK);end; procedimiento TfrmMain.FormCreate(Sender: TObject);var aWSAData:TWSAData;begin if WSAStartup($0101 ,aWSAData)<>0 luego genera Exception.Create('No se puede iniciar la biblioteca de enlaces dinámicos de WinSock'); messageBox(Handle,aWSAdata.szDescription,'Versión de la biblioteca de enlaces dinámicos de WinSock',mb_ok);end;procedure TfrmMain.btnExitClick(Sender: TObject);begin Close;end;procedure TfrmMain.FormClose(Sender: TObject; var Action: TCloseAction) ;comenzar si InTrans y luego si MessageBox(handle,'Recibiendo archivos, ¿detener? ','Prompt',MB_YESNO)=IDNO luego abortar; IF SERVER<>INVALID_SOCKET THEN CLOSESOCKET(SERVER); //Libera los recursos creados por la biblioteca de enlaces dinámicos de winsock si WSACleanup<>0 luego messagebox(handle,'Borrar el Winsock Error de biblioteca de enlace dinámico ','prompt',MB_OK) ELSE messagebox(handle,'¡Borrar la biblioteca de enlaces dinámicos de Winsock correctamente!','Preguntar',MB_OK);end;procedure TfrmMain.btnListenClick(Sender: TObject);var ca:SOCKADDR_IN;begin //Crear servidor SOCKET del lado del servidor:=Socket (PF_INET,SOCK_STREAM,IPPROTO_IP); IF server=invalid_socket luego comienza stabar.SimpleText :='Crear y recibir SOCKET error 1'; salir; finalizar; // Vincular SOCKET del lado del servidor :=PF_INET; ca.sin_addr :=htons(trim(edtPort.Text ))); S_addr :=INADDR_ANY; si bind(server,ca,sizeof(ca))=socket_error entonces comienza stabar.SimpleText. :='Error de socket de enlace, cambie el puerto de recepción'; closeSocket(server); end else stabar.SimpleText :='¡Conectando el socket de recepción exitosamente!'; //Comience a escuchar listen(server,5); Habilitado :=False; btnstop.Enabled :=true;end;procedimiento TfrmMain.btnReceiveClick(Remitente: TObject);comenzar si (servidor = INVALID_SOCKET) ENTONCES COMIENCE MESSAGEBOX (HANDLE, '¡Aún no estoy escuchando, escuche primero!', 'Preguntar', MB_OK); EXIT; IF SaveDialog.Execute THEN RECVFILE (SaveDialog.FileName); btnStopClick(Remitente: TObject);comenzar STOPTRANS:=TRUE; IF SERVER<>INVALID_SOCKET THEN cLOSESOCKET(SERVER); //Servidor:=INVALID_SOCKET debe indicarse aquí; bTNSTOP.Enabled :=fALSE;Enabled :=TRUE;end;end.
Código de cliente:
unidad ClientFrm; interfaz utiliza Windows, mensajes, SysUtils, variantes, clases, gráficos, controles, formularios, cuadros de diálogo, StdCtrls, ComCtrls, WinSock; tipo TfrmMain = clase (TForm) opendfile: TOpenDialog Label1: TLabel: TEdit; ; edtPort: TEdit; Barra de estado: TStatusBar; btnConnect: TButton; btnSend: TButton; btnStop: TButton; btnExit: TButton; ProgressBar: TProgressBar; var Acción: TCloseAction); btnConnectClick(Remitente: procedimiento TObject); btnSendClick(Remitente: TObject); procedimiento btnStopClick(Remitente: TObject); privado { Declaraciones privadas } Cliente:TSocket; público { Declaraciones públicas } StopTrans:Boolean //Si se debe dejar de enviar developmentInTrans:Boolean; en curso Procedimiento de archivo TransFile(FileName:String); //El proceso de transferencia de archivos finaliza const BlockLen=1024*4 //La cantidad máxima de datos enviados cada vez var; frmMain: TfrmMain;implementación{$R *.dfm}procedimiento TfrmMain.TransFile(FileName:String); //El proceso de transferencia de archivos var Ftrans:file of Byte:integer;RemainLen:integer; 0 ..BlockLen-1] de Byte; i:entero; SendLen:Integer;comenzar; asignarFile(Ftrans,nombre de archivo); reset(Ftrans); Flen:=FileSize(Ftrans); BlockNum:Flen div StopTrans:=False; =True; SendLen:=1; para i:=0 a BlockNum-1 comienza si (StopTrans) o (SendLen<=0) luego Break; BlockRead(Ftrans,Blockbuf[0],BlockLen); SendLen:=Send(Client,Blockbuf,BlockLen,0); ProgressBar.Position:=i; luego comience CloseFile(Ftrans:=FalseStatusBar.SimpleText :=''; MessageBox(Handle,'¡Detener transmisión!','Prompt',mb_ok); barra de progreso.Posición:=0; finalizar; si (SendLen<=0) luego comienza CloseFile(Ftrans):=False; :=''; messagebox(handle,'¡Terminación anormal saliente!','Pregunta',MB_OK.Position :=0 fin; luego comience BlockRead(Ftrans,BlockBuf[0],RemainLen); SendLen:=send(client,BlockBuf,Remainlen,0); si (sendLen<=0) luego comience closeFile(Ftrans:=False); :=''; messagebox(handle,'¡La transmisión finalizó anormalmente!','Pregunta',mb_ok); fin; fin; barra de progreso.Posición:=ProgressBar.Max; CerrarFile(Ftrans):=False; StatusBar.SimpleText:=''; Posición :=0;fin;procedimiento TfrmMain.FormCreate(Remitente: TObject);var aWSAData:TWSAData;comenzar si WSAStartup($0101,aWSAData)<>0 luego genera Exception.Create('No se puede iniciar la biblioteca de vínculos dinámicos de WinSock'); messageBox(Handle,aWSAdata.szDescription,'Versión de la biblioteca de vínculos dinámicos de WinSock',mb_ok);end;procedure TfrmMain.btnExitClick (Remitente: TObject);comenzar cerrar;finalizar;procedimiento TfrmMain.FormClose(Remitente: TObject; var Acción: TCloseAction);comenzar si InTrans y luego si MessageBox(manejar,'Transmitir archivos, ¿detener? ','Prompt',MB_YESNO)=IDNO luego abortar; //Libera los recursos creados por la biblioteca de vínculos dinámicos de Winsock si WSACleanup<>0 luego messagebox(handle,'¡Borrar el error de la biblioteca de vínculos dinámicos de Winsock!','Prompt',MB_OK) ELSE messagebox(handle,'¡Borrar correctamente la biblioteca de vínculos dinámicos de Winsock!','Mensaje', MB_OK(Cliente);end;procedimiento); 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 :='Crear COSKET para conectarse al control remoto ¡Error del servidor!'; salir; finalizar; ca.sin_family :=PF_INET; CA.sin_port :=HTONS(STRTOINT(TRIM(EDTpORT.Text ))); HOSTADDR:=INET_ADDR(PCHAR(TRIM(EDTIP.Text ))); //Juzga si la IP es legal si (hostaddr= -1 ) luego comience StatusBar.SimpleText :='Dirección IP del host:'+trim(edtip.Text)+'Error'; ca.sin_addr.S_addr :=hostaddr; //Conéctese al servidor si connect(Client,ca,sizeof(ca))<>0 luego comience StatusBar.SimpleText :='¡Error de SOCKET al conectar con el servidor!'; else StatusBar SimpleText :='¡Conéctese al SOCKET remoto exitosamente!';end;procedimiento TfrmMain.btnSendClick(Remitente: TObject);comenzar si. (opendfile.Execute) y (FileExists(opendfile.FileName)) luego transFile(opendfile.FileName); end;procedure TfrmMain.btnStopClick(Sender: TObject);begin Stoptrans:=True;end;end.