程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> 更多關於編程 >> Delphi完成木馬文件傳輸代碼實例

Delphi完成木馬文件傳輸代碼實例

編輯:更多關於編程

Delphi完成木馬文件傳輸代碼實例。本站提示廣大學習愛好者:(Delphi完成木馬文件傳輸代碼實例)文章只能為提供參考,不一定能成為您想要的結果。以下是Delphi完成木馬文件傳輸代碼實例正文


本文以實例方式講述了Delphi下木馬的文件傳輸辦法的完成進程,詳細步驟如下:

服務器端代碼:

unit ServerFrm;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, ComCtrls, StdCtrls, ExtCtrls,WinSock;

type
 TfrmMain = class(TForm)
  Panel1: TPanel;
  Label1: TLabel;
  edtPort: TEdit;
  Panel2: TPanel;
  stabar: TStatusBar;
  SaveDialog: TSaveDialog;
  btnListen: TButton;
  btnReceive: TButton;
  btnStop: TButton;
  btnExit: TButton;
  procedure FormCreate(Sender: TObject);
  procedure btnExitClick(Sender: TObject);
  procedure FormClose(Sender: TObject; var Action: TCloseAction);
  procedure btnListenClick(Sender: TObject);
  procedure btnReceiveClick(Sender: TObject);
  procedure btnStopClick(Sender: TObject);
 private
  { Private declarations }
 public
  { Public declarations }
  StopTrans:Boolean; //能否中止傳送開關
  InTrans:Boolean; //表示正在接納文件
  Server:TSocket; //定義服務器端的socket句柄
  //自定義進程接納文件
  procedure RecvFile(FileName:String);
 end;

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);
 assignFile(Ftrans,filename);
 rewrite(ftrans);
 stoptrans:=false;
 intrans:=true;
 recelen:=recv(recvsocket,Blockbuf,BlockLen,0);
 while (recelen>0) and (not StopTrans) do
 begin
  BlockWrite(Ftrans,Blockbuf[0],BlockLen);
  application.ProcessMessages;
  recelen:=recv(recvsocket,Blockbuf,Blocklen,0);
  if stoptrans then
  begin
   CloseFile(Ftrans);
   CloseSocket(RecvSocket);
   InTrans:=False;
   MessageBox(Handle,'中止傳輸!','提示',MB_OK);
   EXIT;
  END;
 END;
 //封閉文件,接納的SOCKET
 CloseFile(Ftrans);
 Closesocket(recvsocket);
 InTrans:=False;
 if (Recelen=SOCKET_ERROR) then
  messagebox(handle,'傳輸異常終止!','提示',MB_OK)
 ELSE
  MESSAGEBOX(HANDLE,'客戶端曾經封閉銜接1,文件能夠曾經傳送終了了!','提示',MB_OK);

end; 

procedure TfrmMain.FormCreate(Sender: TObject);
var
 aWSAData:TWSAData;
begin
 if WSAStartup($0101,aWSAData)<>0 then
  raise 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,'正在接納文件,中止嗎?','提示',MB_YESNO)=IDNO then
   abort;

 IF SERVER<>INVALID_SOCKET THEN
   CLOSESOCKET(SERVER);
  //釋放winsock靜態鏈接庫所創立的資源
 if WSACleanup<>0 then
  messagebox(handle,'肅清Winsock靜態鏈接庫錯誤!','提示',MB_OK)
 ELSE
  messagebox(handle,'肅清Winsock靜態鏈接庫成功!','提示',MB_OK);

end;

procedure TfrmMain.btnListenClick(Sender: TObject);
var
 ca:SOCKADDR_IN;
begin
 //創立服務器端SOCKET
 Server:=Socket(PF_INET,SOCK_STREAM,IPPROTO_IP);
 IF server=invalid_socket then
 begin
  stabar.SimpleText :='創立接納SOCKET錯誤1';
  exit;
 end;
 //綁定服務器端SOCKET
 ca.sin_family :=PF_INET;
 CA.sin_port :=htons(strtoint(trim(edtPort.Text )));
 ca.sin_addr.S_addr :=INADDR_ANY;
 if bind(server,ca,sizeof(ca))=socket_error then
 begin
  stabar.SimpleText :='綁定socket錯誤,請更改接納端口';
  closeSocket(server);
  exit;
 end
 else
  stabar.SimpleText :='綁定接納端socket成功!';

 //開端監聽
 listen(server,5);
 btnlisten.Enabled :=False;
 btnstop.Enabled :=true;

end;

procedure TfrmMain.btnReceiveClick(Sender: TObject);
begin
 if (server=INVALID_SOCKET) THEN
 BEGIN
  MESSAGEBOX(HANDLE,'還沒有停止監聽,請先停止監聽!','提示',MB_OK);
  EXIT;
 END;
 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;
 bTNSTOP.Enabled :=fALSE;
 BTNlISTEN.Enabled :=TRUE;
end;

end.

客戶端代碼:

unit ClientFrm;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, 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;
  btnSend: TButton;
  btnStop: TButton;
  btnExit: TButton;
  ProgressBar: TProgressBar;
  procedure FormCreate(Sender: TObject);
  procedure btnExitClick(Sender: TObject);
  procedure FormClose(Sender: TObject; var Action: TCloseAction);
  procedure btnConnectClick(Sender: TObject);
  procedure btnSendClick(Sender: TObject);
  procedure btnStopClick(Sender: TObject);
 private
  { Private declarations }
   Client:TSocket;
 public
  { Public declarations }
  StopTrans:Boolean; //能否中止發送的開發
  InTrans:Boolean;  //表示能否正在傳送文件
  procedure TransFile(FileName:String); //傳遞文件的進程
 end;

 const BlockLen=1024*4; //每次發送的最大數據量

var frmMain: TfrmMain;

implementation{$R *.dfm}

procedure TfrmMain.TransFile(FileName:String); //傳遞文件的進程
var
 Ftrans:file of Byte;
 Flen:integer;
 BlockNum,RemainLen:integer;
 BlockBuf:array[0..BlockLen-1] of Byte;
 i:integer;
 SendLen:Integer;
begin
 assignFile(Ftrans,filename);
 reset(Ftrans);
 Flen:=FileSize(Ftrans);
 BlockNum:=Flen div BlockLen;
 progressBar.Max :=1+BlockNum;
 RemainLen:=Flen mod BlockLen;
 StopTrans:=False;
 InTrans:=True;
 SendLen:=1;
 for i:=0 to BlockNum-1 do
 begin
  if (StopTrans) or (SendLen<=0) then Break;
  BlockRead(Ftrans,Blockbuf[0],BlockLen);
  SendLen:=Send(Client,Blockbuf,BlockLen,0);
  ProgressBar.Position :=i;
  Application.processMessages;
 end;
 if StopTrans then
 begin
  CloseFile(Ftrans);
  InTrans:=False;
  StatusBar.SimpleText :='';
  MessageBox(Handle,'中止傳輸!','提示',mb_ok);
  progressbar.Position :=0;
  exit;
 end;
 if (SendLen<=0) then
 begin
  CloseFile(Ftrans);
  InTrans:=False;
  StatusBar.SimpleText :='';
  messagebox(handle,'傳出異常終止!','提示',MB_OK);
  progressBar.Position :=0;
  exit;
 end;
 if remainLen>0 then
 begin
  BlockRead(Ftrans,BlockBuf[0],RemainLen);
  SendLen:=send(client,BlockBuf,Remainlen,0);
  if (sendLen<=0) then
  begin
   closeFile(Ftrans);
   InTrans:=False;
   StatusBar.SimpleText :='';
   messagebox(handle,'傳輸異常終止!','提示',mb_ok);
   progressBar.Position :=0;
   exit;
  end;
 end;
 progressBar.Position :=ProgressBar.Max ;
 CloseFile(Ftrans);
 InTrans:=False;
 StatusBar.SimpleText :='';
 messagebox(handle,'傳輸完成!','提示',mb_ok);
 progressbar.Position :=0;

end;

procedure TfrmMain.FormCreate(Sender: TObject);
var
 aWSAData:TWSAData;
begin
 if WSAStartup($0101,aWSAData)<>0 then
  raise 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,'正在傳輸文件,中止嗎?','提示',MB_YESNO)=IDNO then
   abort;
  //釋放winsock靜態鏈接庫所創立的資源
  if WSACleanup<>0 then
   messagebox(handle,'肅清Winsock靜態鏈接庫錯誤!','提示',MB_OK)
  ELSE
   messagebox(handle,'肅清Winsock靜態鏈接庫成功!','提示',MB_OK);
  CloseSocket(Client);
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錯誤!';
  exit;
 end;
 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
 begin
  StatusBar.SimpleText :='主機IP地址:'+trim(edtip.Text )+'錯誤';
  exit;
 end
 else
  ca.sin_addr.S_addr :=hostaddr;
 //銜接服務器
 if connect(Client,ca,sizeof(ca))<>0 then
 begin
  StatusBar.SimpleText :='銜接服務器端SOCKET錯誤!';
  exit;
 end
 else
  StatusBar.SimpleText :='銜接近程SOCKET成功!';

end;

procedure TfrmMain.btnSendClick(Sender: TObject);
begin
 if (opendfile.Execute ) and (FileExists(opendfile.FileName )) then
  transFile(opendfile.FileName );
end;

procedure TfrmMain.btnStopClick(Sender: TObject);
begin
 Stoptrans:=True;
end;

end. 
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved