`
yidongkaifa
  • 浏览: 4052670 次
文章分类
社区版块
存档分类
最新评论

c++实现文件传输之一:框架结构和界面实现

 
阅读更多

在木马中文件管理的重要性,是无需质疑的,对于文件的管理,做到并不难,但做好却也不易在我们编写一个功能完整的“文件木马”
其实现效果如图所示。为了文章的完整性,我们将分为数篇来介绍,本文主要介绍程序的整体框架和界面实现,在以后的文章中将以此框架为基础实现详细的功能。


实现:枚举磁盘,枚举目录,获取文件信息
上传文件,下载文件,执行文件,创建目录,删除目录等

传输控制结构


要实现客户端与服务端的通信,设计一个合理的传输控制结构,会使后面的工作轻松很多,为了使代码易读
首先对要使用的命令进行预定义其各个命令定义如下

#define GetDriver 0x01 //磁盘信息
#define GetDirInfo 0x02 //目录信息
#define ExecFile 0x03 //执行文件
#define GetFile 0x04 //下载文件
#define PutFile 0x05 //上传文件
#define DelFile 0x06 //删除文件
#define DelDir 0x07 //删除目录
#define CreateDir 0x08 //创建目录
#define FileInfo 0x09 //文件信息
#define GetScreen 0x10 //查看屏幕


在程序的网络通信中主要有 操作命令 ,命令对像,和具体数据三部分,对于命令的传输定义如下结构

typedef struct
{
int ID; //操作命令
BYTE lparam[BUF_LEN*2]; //命令对像

}COMMAND;


因为在程序中打交道最多的就是文件,对文件的详细属性定义如下结构


typedef struct
{
char FileName[MAX_PATH]; //文件名称
int FileLen; //文件长度
char Time[50]; //时间信息
BOOL IsDir; //为目录否
BOOL Error; //错误信息
HICON hIcon; //图标句柄

}FILEINFO;


服务端结构


服务端还是比较简单的其整体思路如下


1.服务端循环接受连接,并把连接交给线程处理
2.线程接受"命令数据",并跟据命令ID将命令对像和SOCKET句柄传给处理函数
3.函数执行指定功能,并返回执行结果

对整体结构的描述,我们用伪代码表述如下

main()
{ /*初示化设置......*/

while(true)
{
if(client=accept(server,(sockaddr *)&clientaddr,&len))//循环接受连接
{
CreateThread(NULL,NULL,SLisen,(LPVOID)client,NULL,NULL);//传递线程处理
}
}
/*清理释放资源......*/

WSACleanup();
}

服务端程序运行后循环接受连接,如果有新的连接就传递给新的线程处理,线程代码如下

DWORD WINAPI SLisen(LPVOID lparam)
{
SOCKET client=(SOCKET)lparam;
COMMAND command;
while(1)
{
if(recv(client,(char*)&command,sizeof(command),0)==SOCKET_ERROR)//接受命令数据
{
cout<<"The Clinet Socket is Closed\n";
break;
}else
{
switch(command.ID)//判断命令ID
{
case GetDriver://将命令对像和SOCKET句柄传递给处理函数
GetDriverProc (command,client);
break;
case DelFile:
DelFileProc (command,client);
break;
/*其它命令......*/
}
}
}
}

线程式的功能是接受客户端的"命令数据",并跟跟据命令ID 将命令对像传递给处理函数,由函数完成指定的功能
以删除文件命令为例其函数格式如下

DWORD DelFileProc (COMMAND command,SOCKET client)
{
if(DeleteFile((char*)command.lparam)==0)//command.lparam为命令对像,这里为要删除的文件路径
{
send(client,"删除失败...");
}
else
{
send(client,"删除成功...");
}
}

很容易看出,处理函数接受"命令对像"和客户端SOCKET句柄,执行后会把结果传递回去....

客户端结构


客户端结构的实现思路如下

1.跟服务端建立连接
2.发送用户命令
3.启动一个线程,用于接受服务端的返回信息

对整体结构的描述,我们用伪代码表述如下

void CMyDlg::OnConnect()
{
if(connect(server,(SOCKADDR*)&serveraddr,sizeof(serveraddr))<0)//连接....
{
return ;
}
CreateThread(NULL,NULL,CLisen,this,NULL,NULL);//创建线程用于接受SERVER返回信息
}


对于用户发送的命令我们仍以删除文件为例说明其代码如下

void CMyDlg::OnMenuDelFile()
{
HTREEITEM CurrentNode = m_tree.GetSelectedItem(); //取得选择的节点
CString FullPath =GetFullPath(CurrentNode); //取得节点全目录
COMMAND command;
command.ID=DelFile; //设置命令为删除文件 //删除文件
command.lparam=FullPath.LockBuffer()); //将路径加入命令对像
send(server,command);
}


用于接受SERVER返回信息的线程,和服务端接受命令线程相似,这里就不再说明了,有兴趣可以看下源代码

到这里程序的流程框架就介绍完了,下面我们再看一下程序的界面设置.


界面实现

程序的主界面如上图所示,主程序是一个对话框,主要包括一个树控件m_tree和列表控件m_list分别
用于显示磁盘目录和文件,在对话框初示化时用以下代码设置树控件的属性

DWORD dwStyle = GetWindowLong(m_tree.m_hWnd,GWL_STYLE);
dwStyle |=TVS_HASBUTTONS | TVS_HASLINES | TVS_LINESATROOT;
SetWindowLong(m_tree.m_hWnd,GWL_STYLE,dwStyle);

对于列表框控件则没有太多要求,要留意的是,如果显示图标应该把Styles显示属性设置为ICON

VC的做出的界面,常常让人有种摔键盘的冲动。其实稍微留意一下其设置,也可以让它漂亮一些
比如上图所示的界面就是经过简单设置得到的,而没有用其它类库,有点兴趣?其设置方法为:

1.在对话框属性中设置Styles 的Border属性为Thin
2.选重More Styles "可见" 属性
3.选重Extended Styles的"静态边"属性

这样再运行一下程序是不是感觉清新不少?

到这里程序的主要结构框架和界面实现就介绍完了,下一篇将详细介绍其各种功能的实现

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/zhengkangchen/archive/2009/02/27/3942235.aspx

分享到:
评论

相关推荐

    基于C++实现的HTTP服务器改进版源码+项目使用说明+详细注释.zip

    **客户端**:一方面可以通过浏览器直接进行服务器访问,一方面可以使用自己创建的客户端进行连接和消息互传(使用方案如下): ~~~c g++ simclient.cpp ./a.out ip port ~~~ ![](./image/out.jpg) 4、呈现效果 上...

    Visual C++2010开发权威指南(共三部分).part1.rar

    第一部分 Visual C++ 2010开发与新特性 第1章 Visual C++ 2010开发环境简介 1 1.1 Visual C++ 2010简介 1 1.2 Visual C++ 2010下载安装指南 1 1.3 Visual C++ 2010主要特点与新特性 3 1.4 Visual C++ 2010开发环境...

    C++网络爬虫项目

    引擎简单界面背后的技术原理其实对每一个希望在互联网行业有所建树的信息 技术人员都很重要。 1.1. 搜索引擎 作为互联网应用中最具技术含量的应用之一,优秀的搜索引擎需要复杂的架构 和算法,以此来支撑对海量数据...

    JAVA上百实例源码以及开源项目

    2个目标文件,FTP的目标是:(1)提高文件的共享性(计算机程序和/或数据),(2)鼓励间接地(通过程序)使用远程计算机,(3)保护用户因主机之间的文件存储系统导致的变化,(4)为了可靠和高效地传输,虽然用户...

    JAVA上百实例源码以及开源项目源代码

    2个目标文件,FTP的目标是:(1)提高文件的共享性(计算机程序和/或数据),(2)鼓励间接地(通过程序)使用远程计算机,(3)保护用户因主机之间的文件存储系统导致的变化,(4)为了可靠和高效地传输,虽然用户...

    java开源包3

    ftp4j是一个FTP客户端Java类库,实现了FTP客户端应具有的大部分功能文件(包括上传和下 载),浏览远程FTP服务器上的目录和文件,创建、删除、重命,移动远程目录和文件。ftp4j提供多种方式连接到远程FTP服务器包括...

    java开源包4

    ftp4j是一个FTP客户端Java类库,实现了FTP客户端应具有的大部分功能文件(包括上传和下 载),浏览远程FTP服务器上的目录和文件,创建、删除、重命,移动远程目录和文件。ftp4j提供多种方式连接到远程FTP服务器包括...

    基于J2EE框架的个人博客系统项目毕业设计论文(源码和论文)

    Blog 作为一种新的生活方式、新的工作方式、新的学习方式已经被越来越多的人所接受,并且在改变传统的网络和社会结构:网络信息不再是虚假不可验证的,交流和沟通更有明确的选择和方向性,单一的思想和群体的智慧...

    深入解析MFC

    如果做到以下几点,你就可以成为一位透彻理解MFC实现细节的专家:探索MFC文档/视图结构的内幕,从而学习视图同步、打印和打印预览;更深入地了解MFC序列化中那些没有文档记录的方面和一些没有文档记录的类,例如...

    asp.net知识库

    C++ 泛型编程系列讲座之实施 泛型技巧系列:简单类型选择器 C# 泛型简介 我眼中的C#2.0新功能特性 泛型技巧系列:避免基类及接口约束 New Article 不该用Generics实现Abstract Factory的理由 C#2.0-泛型 C#2.0-...

    程序设计教程 陈家骏等编著

    --用C++语言实现 或 --用C++语言描述 或 --用C++语言编程 南京大学计算机科学与技术系 陈家骏,郑滔 编著 前 言 i 第1章 概述 1 1.1 计算机的工作模型 1 1.1.1 硬件结构 1 1.1.2 软件 3 1.2 程序设计 4 ...

    java开源包1

    ftp4j是一个FTP客户端Java类库,实现了FTP客户端应具有的大部分功能文件(包括上传和下 载),浏览远程FTP服务器上的目录和文件,创建、删除、重命,移动远程目录和文件。ftp4j提供多种方式连接到远程FTP服务器包括...

    java开源包11

    ftp4j是一个FTP客户端Java类库,实现了FTP客户端应具有的大部分功能文件(包括上传和下 载),浏览远程FTP服务器上的目录和文件,创建、删除、重命,移动远程目录和文件。ftp4j提供多种方式连接到远程FTP服务器包括...

    java开源包2

    ftp4j是一个FTP客户端Java类库,实现了FTP客户端应具有的大部分功能文件(包括上传和下 载),浏览远程FTP服务器上的目录和文件,创建、删除、重命,移动远程目录和文件。ftp4j提供多种方式连接到远程FTP服务器包括...

    Visual C++实践与提高——串口通信与工程应用篇1

    2.5.9 实际传输文件截图 45 2.6 程序发布问题 45 2.7 小结 45 第3章 使用WinAPI串口编程 47 3.1 API串口编程概述 47 3.2 采用同步查询方式的编程方法 47 3.2.1 创建串口 48 3.2.2 关闭串口 53 3.2.3 发送数据 53 ...

Global site tag (gtag.js) - Google Analytics