C++实现文件传输.doc: .
C++实现文件传输之一:框架结构和界面实现
在木马中文件管理的重要性,是无需质疑的,对于文件的管理,做到并不难,但做 好却也不易在我们编写一个功能完整的“文件木马”
其实现效果如图所示。为了文章的完整性,我们将分为数篇来介绍,本文主要介 绍程序的整体框架和界面实现,在以后的文章中将以此框架为基础实现详细的功
实现:枚举磁盘,枚举目录,获取文件信息
上传文件,下载文件,执行文件,创建目录,删除目录等
传输控制结构
要实现客户端与服务端的通信,设计一个合理的传输控制结构,会使后面的工作 轻松很多,为了使代码易读
首先对要使用的命令进行预定义其各个命令定义如下
#defi ne GetDriver 0x01 // 磁盘信息
#defi ne GetDirl nfo 0x02 // 目录信息
#defi ne ExecFile 0x03 // 执行文件
#defi ne GetFile 0x04 // 下载文件
#defi ne PutFile 0x05 // 上传文件
#defi ne DelFile 0x06 // 删除文件
#defi ne DelDir 0x07 // 删除目录
#defi ne CreateDir 0x08 // 创建目录
#defi ne FileI nfo 0x09 // 文件信息
#defi ne 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将命令对像和SOCKE句柄传给处理函数
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()// 判断命令 ID
{
case GetDriver:// 将命令对像和SOCKE句柄传递给处理函数
GetDriverProc (command,client);
break;
case DelFile:
DelFileProc (command,client);
break;
/* 其它命令 */
}
}
}
}
线程式的功能是接受客户端的 "命令数据", 并跟跟据命令 ID 将命令对像传递给 处理函数 , 由函数完成指定的功能
以删除文件命令为例其函数格式如下
DWORD DelFileProc (COMMAND command,SOCKET client)
{
if(DeleteF
C++实现文件传输 来自淘豆网m.daumloan.com转载请标明出处.