Este artigo descreve o processo de implementação do método de transferência de arquivos Trojan em Delphi na forma de exemplos. As etapas específicas são as seguintes:
Código do lado do servidor:
unit ServerFrm;faz interface com Windows, Mensagens, SysUtils, Variantes, Classes, Gráficos, Controles, Formulários, Diálogos, ComCtrls, StdCtrls, ExtCtrls,WinSock;tipo TfrmMain = class(TForm) Panel1: TPanel1: TLabel: TEdit; : TPanel; TSaveDialog; btnListen: TButton; procedimento btnExitClick(Sender: TObject; var Action: TCloseAction); Remetente: procedimento TObject); btnReceiveClick(Sender: TObject); procedimento btnStopClick(Sender: TObject); private { Declarações privadas } public { Declarações públicas } StopTrans:Boolean;Se deve parar a transmissão switchInTrans:Boolean; :TSocket; / /Definir o identificador do soquete no lado do servidor//Processo personalizado para receber arquivos procedimento RecvFile(FileName:String end;var frmMain: TfrmMain;const BlockLen=1024*4;implementação{$R *.dfm}procedimento tfrmmain.RecvFile(FileName:String);var Ftrans:arquivo de Byte; Byte: RecvSocket:TSocket; ra_len:integer;begin ra_len:=sizeof(ra); recvsocket:=accept(server,@ra,@ra_len); :=recv(recvsocket,Blockbuf,BlockLen,0); while (recelen>0) e (não). StopTrans) comece BlockWrite(Ftrans,Blockbuf[0],BlockLen); application.ProcessMessages;=recv(recvsocket,Blockbuf,Blocklen,0); se stoptrans então comece CloseFile(Ftrans); =Falso; MessageBox(Handle,'Parar transmissão!','Prompt',MB_OK); EXIT; END; END; //Fecha o arquivo, recebeu SOCKET CloseFile(Ftrans); Closesocket(recvsocket); ,MB_OK) ELSE MESSAGEBOX(HANDLE,'O cliente fechou a conexão 1, o arquivo pode ter sido transferido!','Prompt',MB_OK);end; procedimento TfrmMain.FormCreate(Sender: TObject);var aWSAData:TWSAData;begin if WSAStartup($0101 ,aWSAData)<>0 então aumenta Exception.Create('Não é possível iniciar a biblioteca de link dinâmico WinSock'); messageBox(Handle,aWSAdata.szDescription,'versão da biblioteca de vínculo dinâmico WinSock',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,'Recebendo arquivos, pare? ','Prompt',MB_YESNO)=IDNO então abortar; IF SERVER<>INVALID_SOCKET THEN CLOSESOCKET(SERVER); //Libere os recursos criados pela biblioteca de link dinâmico do Winsock se WSACleanup<>0 then messagebox(handle,'Clear the Winsock Erro de biblioteca de link dinâmico ','prompt',MB_OK) ELSE messagebox(handle,'Limpar biblioteca de link dinâmico Winsock com sucesso!','Prompt',MB_OK);end;procedure TfrmMain.btnListenClick(Sender: TObject);var ca:SOCKADDR_IN;begin //Criar servidor SOCKET do lado do servidor:=Socket ( PF_INET,SOCK_STREAM,IPPROTO_IP); IF server=invalid_socket então comece stabar.SimpleText :='Criar e receber erro SOCKET 1'; exit end; //Vincular SOCKET do lado do servidor ca.sin_family :=PF_INET :=htons(strtoint(trim(edtPort.Text ))); .S_addr :=INADDR_ANY; se bind(server,ca,sizeof(ca))=socket_error então comece stabar.SimpleText :='Erro de soquete de ligação, altere a porta de recebimento'; closeSocket(server); end else stabar.SimpleText :='Vinculando o soquete de recebimento com sucesso!'; Habilitado :=Falso; btnstop.Habilitado :=true;end;procedure TfrmMain.btnReceiveClick(Sender: TObject); (servidor=INVALID_SOCKET) THEN BEGIN MESSAGEBOX(HANDLE,'Ainda não estou ouvindo, por favor ouça primeiro!','Prompt',MB_OK END; btnStopClick(Remetente: TObject);início STOPTRANS:=TRUE; IF SERVER<>INVALID_SOCKET THEN cLOSESOCKET(SERVER); //Server:=INVALID_SOCKET precisa ser declarado aqui;
Código do cliente:
unit ClientFrm;faz interface com Windows, Mensagens, SysUtils, Variantes, Classes, Gráficos, Controles, Formulários, Diálogos, StdCtrls, ComCtrls,WinSock;tipo TfrmMain = class(TForm) opendfile: TOpenDialog; ;edtPort:TEdit;StatusBar:TStatusBar; btnConnect: TButton: TButton; btnStop: TButton; btnExit: TButton; TProgressBar; procedimento TCloseAction; btnConnectClick(Remetente: procedimento TObject); btnSendClick(Sender: TObject); procedimento btnStopClick(Sender: TObject); private { Declarações privadas } Client:TSocket; public { Declarações públicas } StopTrans:Boolean; em andamento Procedimento de arquivo TransFile(FileName:String); //O processo de transferência de arquivos termina const BlockLen=1024*4; frmMain: TfrmMain;implementação{$R *.dfm}procedimento TfrmMain.TransFile(FileName:String); //O processo de transferência de arquivos var Ftrans:file of Byte;integer;RemainLen:integer; 0 ..BlockLen-1] de Byte; i:integer; atribuaArquivo(Ftrans,nome do arquivo reset(Ftrans:=FileSize(Ftrans);=Flen div BlockLen;Max :=1+BlockNum; =True; SendLen:=1; para i:=0 para BlockNum-1 comece se (StopTrans) ou (SendLen<=0) então Break; ProgressBar.Position :=i; então comece CloseFile(Ftrans:=False; MessageBox(Handle,'Parar transmissão!','Prompt',mb_ok); progressbar.Position :=0 end; :=''; messagebox(handle,'Encerramento anormal!','Prompt',MB_OK :=0; então comece BlockRead(Ftrans,BlockBuf[0],RemainLen:=send(client,BlockBuf,Remainlen,0); então comece closeFile(Ftrans:=False; :=''; messagebox(handle,'Transmissão finalizada de forma anormal!','Prompt',mb_ok); end; end; progressBar.Position :=ProgressBar.Max ; CloseFile(Ftrans);'Prompt',mb_ok); Posição :=0;fim;procedimento TfrmMain.FormCreate(Sender: TObject);var aWSAData:TWSAData;começo se WSAStartup($0101,aWSAData)<>0 então aumenta Exception.Create('Não é possível iniciar a biblioteca de link dinâmico WinSock'); messageBox(Handle,aWSAdata.szDescription,'Versão da biblioteca de link dinâmico WinSock',mb_ok);end;procedimento TfrmMain.btnExitClick (Remetente: TObject);início Fechar;fim;procedimento TfrmMain.FormClose(Sender: TObject; var Action: TCloseAction);begin if InTrans then if MessageBox(handle,'Transmitindo arquivos, pare? ','Prompt',MB_YESNO)=IDNO então abortar; //Libere os recursos criados pela biblioteca de link dinâmico do Winsock se WSACleanup<>0 então messagebox(handle,'Limpar erro da biblioteca de link dinâmico do Winsock!','Prompt',MB_OK) ELSE messagebox(handle,'Limpar biblioteca de link dinâmico Winsock com sucesso!','Prompt',MB_OK); TfrmMain.btnConnectClick(Sender: TObject);var ca:SOCKADDR_IN; hostaddr:u_long;begin Client:=Socket(PF_INET,SOCK_STREAM,IPPROTO_IP); Erro do servidor!'; exit end; :=PF_INET; CA.sin_port :=HTONS(STRTOINT(TRIM(EDTpORT.Text ))); HOSTADDR:=INET_ADDR(PCHAR(TRIM(EDTIP.Text ))); -1) então comece StatusBar.SimpleText :='Endereço IP do host:'+trim(edtip.Text)+'Error'; ca.sin_addr.S_addr :=hostaddr; //Conecte-se ao servidor se connect(Client,ca,sizeof(ca))<>0 então comece StatusBar.SimpleText :='Erro de SOCKET ao conectar ao servidor!'; else StatusBar. SimpleText :='Conectar ao SOCKET remoto com sucesso!';end;procedure TfrmMain.btnSendClick(Sender: TObject);begin if (opendfile.Execute ) e (FileExists(opendfile.FileName )) então transFile(opendfile.FileName );end;procedure TfrmMain.btnStopClick(Sender: TObject);begin Stoptrans:=True;end;end.