В данной статье в виде примеров описан процесс реализации метода передачи файлов трояном под Delphi. Конкретные шаги заключаются в следующем:
Код на стороне сервера:
модуль ServerFrm; интерфейс использует Windows, сообщения, SysUtils, варианты, классы, графику, элементы управления, формы, диалоговые окна, ComCtrls, StdCtrls, ExtCtrls, WinSock; тип TfrmMain = класс (TForm) Panel1: TPanel1: TLabel: TEdit; : TPanel: TStatusBar; TSaveDialog; btnReceive: TButton; btnExit: TButton; процедура FormCreate (Отправитель: TObject); процедура FormClose (Отправитель: TObject; var Action: TCloseAction); Отправитель: процедура TObject); btnReceiveClick(Sender: TObject); процедура btnStopClick(Sender: TObject); public { Частные объявления } Public { Публичные объявления } StopTrans:Boolean; //Остановить ли передачу switchInTrans:Boolean; //Указывает, что файл принимается. :TSocket; //Определение дескриптора сокета на стороне сервера//Настраиваемый процесс получения файлов процедура RecvFile(FileName:String end;var frmMain); TfrmMain;const BlockLen=1024*4;реализация{$R *.dfm}процедуры tfrmmain.RecvFile(FileName:String);var Ftrans:файл байта; Recelen:Integer; Blockbuf:array[0..BlockLen-1] of Байт RecvSocket: TSocket ra: Sockaddr_in; ra_len:integer;begin ra_len:=sizeof(ra); Recvsocket:=accept(server,@ra,@ra_len); AssignFile(Ftrans,filename); stoptrans:=false; :=recv(recvsocket,Blockbuf,BlockLen,0); while (recelen>0) и (не StopTrans) do start BlockWrite(Ftrans,Blockbuf[0],BlockLen); =False; MessageBox(Handle, «Остановить передачу!», «Подсказка», MB_OK); EXIT; END; END; // Закрываем полученный файл SOCKET CloseFile(Ftrans); Closesocket(recvsocket); InTrans:=False; if (Recelen=SOCKET_ERROR) then messagebox(handle,'Передача прервана ненормально!','Prompt' ,MB_OK) ЕЩЕ MESSAGEBOX(HANDLE, «Клиент закрыл соединение 1, возможно, файл был передан!», «Подсказка», MB_OK); end; процедура TfrmMain.FormCreate(Sender: TObject);var aWSAData:TWSAData;begin if WSAStartup($0101 ,aWSAData)<>0, затем вызывает Exception.Create('Невозможно запустить динамическую библиотеку WinSock'); messageBox(Handle,aWSAdata.szDescription,'Версия динамической библиотеки 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,'Reception files, stop? ','Prompt',MB_YESNO)=IDNO, затем прервать; IF SERVER<>INVALID_SOCKET THEN CLOSESOCKET(SERVER); //Освободить ресурсы, созданные библиотекой динамической компоновки winsock, if WSACleanup<>0 then messagebox(handle,'Очистить Winsock Ошибка библиотеки динамической ссылки ','подсказка',MB_OK) ELSE messagebox(handle,'Очистить динамически подключаемую библиотеку Winsock успешно!','Prompt',MB_OK);end;procedure TfrmMain.btnListenClick(Sender: TObject);var ca:SOCKADDR_IN;begin //Создаем серверный SOCKET Server:=Socket ( PF_INET,SOCK_STREAM,IPPROTO_IP); ЕСЛИ server=invalid_socket, затем начните stabar.SimpleText :='Создать и получить ошибку SOCKET 1'; выход; //Привязка SOCKET на стороне сервера ca.sin_family :=PF_INET; CA.sin_port :=htons(strtoint(trim(edtPort.Text ))); . S_addr :=INADDR_ANY; если связывание(server,ca,sizeof(ca))=socket_error, то начните stabar.SimpleText :='Ошибка привязки сокета, измените принимающий порт'; closeSocket(server); end else stabar.SimpleText :='Привязка принимающего сокета успешно!'; //Начало прослушивания list(server,5); Включено :=False; btnstop.Enabled :=true;end;procedure TfrmMain.btnReceiveClick(Sender: TObject);begin if (server=INVALID_SOCKET) THEN BEGIN MESSAGEBOX(HANDLE, 'Пока не слушаем, пожалуйста, сначала прослушайте!','Prompt',MB_OK EXIT; IF SaveDialog.Execute THEN RECVFILE(SaveDialog.FileName); procedure TfrmMain. btnStopClick (Отправитель: TObject); начать STOPTRANS:=TRUE; IF SERVER<>INVALID_SOCKET THEN clOSESOCKET(SERVER); //Здесь необходимо указать сервер:=INVALID_SOCKET; bTNSTOP.Enabled :=fALSE;Enabled :=TRUE;end;end.
Код клиента:
модуль ClientFrm;интерфейс использует Windows, сообщения, SysUtils, варианты, классы, графику, элементы управления, формы, диалоговые окна, StdCtrls, ComCtrls, WinSock;тип TfrmMain = класс (TForm) opendfile: TOpenDialog; Label1: TLabel; edtIP: TEdit Label2: TLabel; edtPort: TEdit; СтатусБар: ТСтатусБар; btnConnect: TButton; btnStop: TButton; ProgressBar: TProgressBar; процедура FormCreate (Отправитель: TObject); процедура FormClose (Sender: TObject; var Action: TCloseAction); btnConnectClick (Отправитель: процедура TObject); btnSendClick(Sender: TObject); процедура btnStopClick(Sender: TObject); Private { Частные объявления } Client:TSocket; public { Публичные объявления } StopTrans:Boolean; //Прекратить ли отправку developmentInTrans:Boolean; в процессе Файловая процедура TransFile(FileName:String); //Процесс передачи файлов завершен; const BlockLen=1024*4 //Максимальный объем данных, отправляемых каждый раз var; frmMain: TfrmMain;реализация{$R *.dfm}procedure TfrmMain.TransFile(FileName:String); //Процесс передачи файлов var Ftrans:file of Byte; Flen:integer; BlockNum,RemainLen:Integer; 0 ..BlockLen-1] байта я: целое число SendLen: целое число; начало; AssignFile(Ftrans,filename); сброс(Ftrans); Flen:=FileSize(Ftrans);=Flen div BlockLen; ProgressBar.Max:=1+BlockNum; RemainLen:=Flen mod BlockLen; =True; SendLen:=1; для i:=0 до BlockNum-1 начать, если (StopTrans) или (SendLen<=0) then Break;BlockRead(Ftrans,Blockbuf[0],BlockLen);=Send(Client,Blockbuf,BlockLen,0); ProgressBar.Position:=i; Application.processMessages; затем начните CloseFile(Ftrans):=False.SimpleText :=''; MessageBox(Handle,'Остановить передачу!','Prompt',mb_ok); :=''; messagebox(handle,'Исходящее аварийное завершение!','Prompt',MB_OK); ProgressBar.Position:=0; выход; затем начать BlockRead(Ftrans,BlockBuf[0],RemainLen); SendLen:=send(client,BlockBuf,Remainlen,0); if (sendLen<=0) then start closeFile(Ftrans:=False); :=''; messagebox(handle,'Передача прервана ненормально!','Prompt',mb_ok); ProgressBar.Position :=0; конец; ProgressBar.Position: = ProgressBar.Max; CloseFile (Ftrans); Позиция:=0;конец;процедура TfrmMain.FormCreate(Sender: TObject);var aWSAData:TWSAData;begin if WSAStartup($0101,aWSAData)<>0 затем вызывает Exception.Create('Невозможно запустить динамически подключаемую библиотеку WinSock'); messageBox(Handle,aWSAdata.szDescription,'Версия динамически подключаемой библиотеки WinSock',mb_ok);end;procedure TfrmMain.btnExitClick (Отправитель: TObject);begin Close;end;procedure TfrmMain.FormClose (Отправитель: TObject; var Action: TCloseAction); начать, если InTrans, затем, если MessageBox (обработка, «Передача файлов, остановить? ','Prompt',MB_YESNO)=IDNO then abort; //Освободить ресурсы, созданные библиотекой динамической компоновки Winsock if WSACleanup<>0 then messagebox(handle,'Очистить ошибку библиотеки динамической компоновки Winsock!','Prompt',MB_OK) ELSE messagebox(handle, «Успешно очистить динамически подключаемую библиотеку Winsock!», «Приглашение», 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 :='Создайте COSKET для подключения к удаленному устройству Ошибка сервера!'; выход; ca.sin_family :=PF_INET; CA.sin_port :=HTONS(STRTOINT(TRIM(EDTpORT.Text ))); HOSTADDR:=INET_ADDR(PCHAR(TRIM(EDTIP.Text )))); //Оцениваем, является ли IP-адрес допустимым if (hostaddr= -1 ) then start StatusBar.SimpleText :='IP-адрес хоста:'+trim(edtip.Text)+'Error end else; ca.sin_addr.S_addr :=hostaddr; //Подключаемся к серверу if Connect(Client,ca,sizeof(ca))<>0 then Begin StatusBar.SimpleText :='Ошибка соединения с сервером!'; else StatusBar. SimpleText :='Подключение к удаленному SOCKET успешно!';end;procedure TfrmMain.btnSendClick(Sender: TObject);begin if (opendfile.Execute ) и (FileExists(opendfile.FileName )) затем transFile(opendfile.FileName );end;procedure TfrmMain.btnStopClick(Sender: TObject);begin Stoptrans:=True;end;end.