Delphi實(shí)現(xiàn)木馬文件傳輸代碼實(shí)例
更新時(shí)間:2014年07月25日 11:53:16 投稿:shichen2014
這篇文章主要介紹了Delphi實(shí)現(xiàn)木馬文件傳輸?shù)姆椒?對(duì)于了解木馬的運(yùn)行原理有一定的幫助,需要的朋友可以參考下
本文以實(shí)例形式講述了Delphi下木馬的文件傳輸方法的實(shí)現(xiàn)過程,具體步驟如下:
服務(wù)器端代碼:
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; //是否停止傳送開關(guān) InTrans:Boolean; //表示正在接收文件 Server:TSocket; //定義服務(wù)器端的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; //關(guān)閉文件,接收的SOCKET CloseFile(Ftrans); Closesocket(recvsocket); InTrans:=False; if (Recelen=SOCKET_ERROR) then messagebox(handle,'傳輸異常終止!','提示',MB_OK) ELSE MESSAGEBOX(HANDLE,'客戶端已經(jīng)關(guān)閉連接1,文件可能已經(jīng)傳送完畢了!','提示',MB_OK); end; procedure TfrmMain.FormCreate(Sender: TObject); var aWSAData:TWSAData; begin if WSAStartup($0101,aWSAData)<>0 then raise Exception.Create('不能啟動(dòng)WinSock動(dòng)態(tài)鏈接庫(kù)'); messageBox(Handle,aWSAdata.szDescription ,'WinSock動(dòng)態(tài)鏈接庫(kù)版本',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動(dòng)態(tài)鏈接庫(kù)所創(chuàng)建的資源 if WSACleanup<>0 then messagebox(handle,'清除Winsock動(dòng)態(tài)鏈接庫(kù)錯(cuò)誤!','提示',MB_OK) ELSE messagebox(handle,'清除Winsock動(dòng)態(tài)鏈接庫(kù)成功!','提示',MB_OK); end; procedure TfrmMain.btnListenClick(Sender: TObject); var ca:SOCKADDR_IN; begin //創(chuàng)建服務(wù)器端SOCKET Server:=Socket(PF_INET,SOCK_STREAM,IPPROTO_IP); IF server=invalid_socket then begin stabar.SimpleText :='創(chuàng)建接收SOCKET錯(cuò)誤1'; exit; end; //綁定服務(wù)器端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錯(cuò)誤,請(qǐng)更改接收端口'; closeSocket(server); exit; end else stabar.SimpleText :='綁定接收端socket成功!'; //開始監(jiān)聽 listen(server,5); btnlisten.Enabled :=False; btnstop.Enabled :=true; end; procedure TfrmMain.btnReceiveClick(Sender: TObject); begin if (server=INVALID_SOCKET) THEN BEGIN MESSAGEBOX(HANDLE,'還沒有進(jìn)行監(jiān)聽,請(qǐng)先進(jìn)行監(jiān)聽!','提示',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; //是否停止發(fā)送的開發(fā) InTrans:Boolean; //表示是否正在傳送文件 procedure TransFile(FileName:String); //傳遞文件的過程 end; const BlockLen=1024*4; //每次發(fā)送的最大數(shù)據(jù)量 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('不能啟動(dòng)WinSock動(dòng)態(tài)鏈接庫(kù)'); messageBox(Handle,aWSAdata.szDescription ,'WinSock動(dòng)態(tài)鏈接庫(kù)版本',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動(dòng)態(tài)鏈接庫(kù)所創(chuàng)建的資源 if WSACleanup<>0 then messagebox(handle,'清除Winsock動(dòng)態(tài)鏈接庫(kù)錯(cuò)誤!','提示',MB_OK) ELSE messagebox(handle,'清除Winsock動(dòng)態(tài)鏈接庫(kù)成功!','提示',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 :='為連接遠(yuǎn)程服務(wù)器端創(chuàng)建COSKET錯(cuò)誤!'; 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 :='主機(jī)IP地址:'+trim(edtip.Text )+'錯(cuò)誤'; exit; end else ca.sin_addr.S_addr :=hostaddr; //連接服務(wù)器 if connect(Client,ca,sizeof(ca))<>0 then begin StatusBar.SimpleText :='連接服務(wù)器端SOCKET錯(cuò)誤!'; exit; end else StatusBar.SimpleText :='連接遠(yuǎn)程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.
相關(guān)文章
Delphi實(shí)現(xiàn)碰撞球體完整實(shí)例代碼
這篇文章主要介紹了Delphi實(shí)現(xiàn)碰撞球體完整實(shí)例代碼,通過該實(shí)例,讀者可以完整的了解一個(gè)Delphi項(xiàng)目的創(chuàng)建過程,加深對(duì)Delphi運(yùn)行原理的了解,需要的朋友可以參考下2014-07-07delphi設(shè)置開機(jī)自動(dòng)啟動(dòng)函數(shù)具體實(shí)現(xiàn)
有些程序要設(shè)置為開機(jī)啟動(dòng),所以自己寫了個(gè)函數(shù)方便以后使用,實(shí)現(xiàn)比較簡(jiǎn)單,感興趣的朋友可以參考下哈2013-06-06截取指定符號(hào)之間的字符串(隨機(jī)讀取)delphi實(shí)例代碼
這篇文章主要介紹了截取指定符號(hào)之間的字符串(隨機(jī)讀取)delphi實(shí)例代碼,有需要的朋友可以參考一下2013-12-12Delphi用TActionList實(shí)現(xiàn)下載文件的方法
這篇文章主要介紹了Delphi用TActionList實(shí)現(xiàn)下載文件的方法,需要的朋友可以參考下2014-07-07Delphi實(shí)現(xiàn)Listbox中的item根據(jù)內(nèi)容顯示不同顏色的方法
這篇文章主要介紹了Delphi實(shí)現(xiàn)Listbox中的item根據(jù)內(nèi)容顯示不同顏色的方法,需要的朋友可以參考下2014-07-07