之前一篇文章详细介绍了远控被控端,本系列的最后一篇文章我向大家介绍介绍控制端的实现。相对于被控端而言,控制端主要涉及软件界面、命令发送、消息显示这三个方面。接下来我从这三方面入手向大家介绍。
控制端架构
主界面使用一个TMPSOCKET *类型的容器存储所有的主机标识。该结构使用socket和硬盘系列号来唯一标识远程主机。每次有远程主机连接到控制端,控制端通过检查硬盘序列号是否已存在来处理重复客户端的问题。
初始化界面如下:
当设置好ip地址和监听端口,单击“开始”按钮,MyServerThread线程启动,参数为ip地址和端口。其作用是初始化socket相关库,并且进入循环等待远程主机的连接。
一旦接受了远程主机的连接,则为该远程主机创建一个ServerThread线程。该线程解决了重复客户端问题。每当有远程主机链接过来,总会将该主机发送过来的计算机信息中的硬盘序列号与容器中存储的已连接的计算机硬盘序列号对比,如果存在相同的,则将已存在的从容器中删除,将新的添加进去,这样做是为了应对有主机中途掉线后重连的情况。
进程管理界面
界面初始化完毕,调用OnStart函数向远程主机发送CMD_PROCESS_MANAGE命令,接收远程主机发送的进程消息,将每一条指向PROCESSINFO类型的指针存入容器中。
然后调用InitList函数将指针容器指向的消息显示到列表上。
同样的服务管理端界面也是这个设计思路。
文件管理界面
初始化界面阶段调用DriverInfoThread在左侧树状列表中显示所有盘符,当点击其中一个节点时,调用OnClickTree1展开该节点,然后调用ListDirThread在右侧远程主机文件列表中显示当前文件夹下所有文件。
右侧列表中添加右键单击事件,弹出文件删除选项,调用消息处理函数OnFileDel对文件进行删除。
远程SHELL界面
点击“执行”按钮时,获取输入的命令行内容,调用CmdShellThread启动远程命令行线程,将命令发送至远程主机,执行完后返回执行结果。这里需要注意的时,接收目标数据时,需要将myrecv函数最后一个参数设置为true,表示接收到数据立即返回显示,如果设置为false,由于数据长度通常较长,会有明显的显示延迟,所以设置为一旦接收到数据立即返回。
远程桌面
远程桌面窗口启动后获得远程主机的DIB(设备无关位图文件,这是一种文件格式,是为了保证由某个应用程序创建的位图图形可以被其它应用程序装载或显示)图像,而后进入Set_BackGround_Image函数进行显示。进入Set_BackGround_Image函数首先设置位图文件的头格式,然后调用StretchDIBits函数进行显示。
领取专属 10元无门槛券
私享最新 技术干货