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. 
(0)

相关推荐

  • Delphi建立、读取、存贮INI文件的方法《一》

    一.有必要了解INI文件的结构: ;注释 [小节名] 关键字=值 ... INI文件允许有多个小节,每个小节又允许有多个关键字, "="后面是该关键字的值. 值的类型有三种:字符串.整型数值和布尔值.其中字符串存贮在INI文件中时没有引号,布尔真值用1表示,布尔假值用0表示. 注释以分号";"开头. 二.定义 1.在Interface的Uses节增加IniFiles: 2.在Var变量定义部分增加一行: myinifile:Tinifile; 然后,就可以对变量my

  • Delphi中判断文件是否为文本文件的函数

    在自己编写文本文件读取函数的时候,你首先会遇到的第一个问题就是:对于给定的一个文件名,怎么知道它所代表磁盘文件的确是文本文件?这里有一个很简单的方法:把给定的那个文件看作是无类型的二进制文件,然后顺序地读出这个文件的每一个字节,如果文件里有一个字节的值等于0,那么这个文件就不是文本文件:反之,如果这个文件中没有一个字节的值是0的话,就可以判定这个文件是文本文件了.这是原理,下面看看在Delphi 中怎样编程来实现它-- 复制代码 代码如下: function IsTextFile(FileNam

  • Delphi用TActionList实现下载文件的方法

    Delphi中的TActionList有个标准动作TDownLoadURL,内部是使用的URLDownloadToFile,它下载文件时会定时产生OnDownloadProgress 事件,这样就可以用进度条显示. 本文讲述了Delphi用TActionList实现下载文件的方法,实现代码如下所示: uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtActns,

  • delphi建立、读取、存贮INI文件的方法《三》

    从.INI文件中获取字符串 var strResult:pchar; begin GetPrivateProfileString( ´windows´, // []中标题的名字 ´NullPort´, // =号前的名字 ´NIL´, // 如果没有找到字符串时,返回的默认值 strResult, //存放取得字符 100, //取得字符的允许最大长度 ´c:\forwin95\win.ini´ // 调用的文件名 ); edit1.text:=strResult; //显示取得字符串 从.IN

  • delphi制作wav文件的方法

    本文实例讲述了delphi制作wav文件的方法.分享给大家供大家参考.具体如下: 这里delphi用waveIn...函数制作wav文件 具体代码如下: //使用窗口接受音频设备发出的消息: unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Button

  • delphi建立、读取、存贮INI文件的方法《二》

    从.INI文件中获取字符串varstrResult:pchar;beginGetPrivateProfileString(´windows´, // []中标题的名字´NullPort´, // =号前的名字´NIL´, // 如果没有找到字符串时,返回的默认值strResult, //存放取得字符100, //取得字符的允许最大长度´c:\forwin95\win.ini´ // 调用的文件名);edit1.text:=strResult; //显示取得字符串从.INI文件中获取整数edit1

  • 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; Labe

  • java 实现局域网文件传输的实例

    java 实现局域网文件传输的实例 本文主要实现局域网文件传输的实例,对java 的TCP知识,文件读写,Socket等知识的理解应用,很好的实例,大家参考下, 实现代码: ClientFile.java /** * 更多资料欢迎浏览凯哥学堂官网:http://kaige123.com * @author 小沫 */ package com.tcp.file; import java.io.File; import java.io.FileInputStream; import java.io.

  • python单线程文件传输的实例(C/S)

    客户端代码: #-*-encoding:utf-8-*- import socket import os import sys import math import time def progressbar(cur, total): percent = '{:.2%}'.format(float(cur) / float(total)) sys.stdout.write('\r') sys.stdout.write("[%-50s] %s" % ( '=' * int(math.flo

  • java使用Apache工具集实现ftp文件传输代码详解

    本文主要介绍如何使用Apache工具集commons-net提供的ftp工具实现向ftp服务器上传和下载文件. 一.准备 需要引用commons-net-3.5.jar包. 使用maven导入: <dependency> <groupId>commons-net</groupId> <artifactId>commons-net</artifactId> <version>3.5</version> </depend

  • Java 读取excel 文件流代码实例

    这篇文章主要介绍了Java 读取excel 文件流代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 代码如下 public static void initType(String path) { try { //1 获取excel文件流 excel xls 文件 暂不支持xlsx if (path.contains("xlsx") || path.contains("XLSX")) { System.err.

  • java io读取文件操作代码实例

    这篇文章主要介绍了java io读取文件操作代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 主要分为字节读取和字符读取,字节读取可以一个一个读取和字节数组读取,字符读取同样之,字符读取适合文本读取,字节读取皆可以 这里直接上代码,读取文件的9个小demo package com.io; import org.junit.Test; import java.io.*; public class FileTest { //1.字节流字节一个

  • Python tcp传输代码实例解析

    socket是编程语言对tcp/ip协议的封装,使用其可以在两个主机之间传输文件,下面直接进入主题,下面示例是最简单的tcp传输代码示例,先启动server再启动client.需要注意python3socket只能传输byte类型,具体如何转换可以复习字符编码章节相关知识 sever端代码 # -*- coding:utf-8 -*- import socket server = socket.socket() server.bind(("0.0.0.0", 8888)) server

  • Python实现FTP文件传输的实例

    FTP一般流程 FTP对应PASV和PORT两种访问方式,分别为被动和主动,是针对FTP服务器端进行区分的,正常传输过程中21号端口用于指令传输,数据传输端口使用其他端口. PASV:由客户端发起数据传输请求,服务器端返回并携带数据端口,并且服务器端开始监听此端口等待数据,为被动模式: PORT:客户端监听端口并向服务器端发起请求,服务器端主动连接此端口进行数据传输,为主动模式. 其中TYPE分两种模式,I对应二进制模式.A对应ASCII模式: PASV为客户端发送请求,之后227为服务器端返回

  • python文件读写代码实例

    实验室导师又有任务,从一个.dat文件中读取波形数据,通过一个自编码网络进行异常检测.可是对我这种小白来说真的艰难.从最基础的文件读写开始吧. 先说数据,是一个int16型的数组.说是数组,但是读取也并不简单.众所周知,数据在计算机中是用二进制的形式储存的.int16型有符号整数.16位,16bit,也就是两个字节.那么自然而然的想到,读取两个字节(bytes)的数据(也就是16bit),然后把它转化成int16的整型(即十进制整型).数据就变得可以处理了. 先放一个不同位数的整型数据范围吧,经

  • 收集的多个ruby遍历文件夹代码实例

    一.遍历文件夹下所有文件,输出文件名 复制代码 代码如下: def traverse_dir(file_path)     if File.directory? file_path         Dir.foreach(file_path) do |file|             if file !="." and file !=".."                 traverse_dir(file_path+"/"+file)   

随机推荐