信息安全课程设计远程控制.docx
- 文档编号:17669847
- 上传时间:2023-07-27
- 格式:DOCX
- 页数:23
- 大小:158.50KB
信息安全课程设计远程控制.docx
《信息安全课程设计远程控制.docx》由会员分享,可在线阅读,更多相关《信息安全课程设计远程控制.docx(23页珍藏版)》请在冰点文库上搜索。
信息安全课程设计远程控制
成都信息工程学院
课程设计报告
远程控制连接
姓名:
张璐
专业:
信息安全
班级:
3班
提交日期:
2010年12月17日
课程设计成绩评价表
指导老师评阅成绩表
学习与工作态度(10%)
研究水平与设计能力(45%)
课程设计说明说(论文)
撰写质量(45%)
总分
指导老师签名:
年月日
课程设计答辩记录及评价表
学生
讲述情况
教师主要
提问记录
学生回答
问题情况
答辩评分
评分项目
分值
评价参考标准
评分
总分
优
良
中
及格
差
研究水平与设计能力
30
28
23
20
18
15
课程设计说明书(论文)撰写质量
30
28
23
20
18
15
答辩效果
40
36
32
28
24
16
是否同意论文(设计)通过答辩
□同意□不同意
答辩小组成员签名
答辩小组组长签名:
年月日
课程设计成绩评定表
成绩汇总
评分项目
评分
比例
分数
课程设计总分
指导老师评分
50%
答辩小组评分
50%
远程控制连接
摘要
为了让用户更加方便的访问远端计算机,远程控制技术应运而生。
本程序采用C/S模式,运用Socket编程的基本原理及Windows的消息系统,实现了远程桌面的监视与控制,用户可以对远程计算机进行鼠标和键盘的操作。
服务器先将远程桌面捕获,再发到客户端,在窗体中显示出来,客户端将本地鼠标和盘键输入,变成命令,发到远程服务器主机执行,以模拟出鼠标和键盘的操作。
关键字:
远程控制;服务器;客户端;键盘;鼠标;
目录
1.引言1
2.需求分析1
2.1用户需求1
2.2可行性研究2
2.2.1技术可行性2
2.2.2经济可行性2
3.概要设计2
3.1开发环境2
3.2总体框架的实现2
3.2.1服务器端实现3
3.2.2客户端实现4
4.详细设计4
4.1界面设计4
4.1.1服务器端4
4.1.2客户端4
4.2服务器代码设计5
4.2.1建立连接5
4.2.2消息判断及处理6
4.2.3确认/拒绝控制请求6
4.2.4发送分辨率7
4.2.5捕获并且发送桌面的更新的区域8
4.2.6处理鼠标消息8
4.2.7处理键盘消息9
4.3客户端代码设计10
4.3.1建立连接10
4.3.2发送请求控制10
4.3.3初始化得到的桌面12
4.3.4得到分辨率12
4.3.5设置网格12
4.3.6更新桌面13
5.测试13
5.1测试用例13
5.2测试显示14
5.3测试结果15
结论16
参考文献16
1.引言
随着互联网的普及和技术革新,远程控制结束,它可以为远端电脑前的用户解决问题,协助用户安装配置软件;它大大降低了技术管理人员对网络的维护成本,方便了网络的监控与管理;它使用户和专业人员交流变的容易,远程教育实现了交互式的教学模式;它实现了远程办公,极大缓解了城市交通状况,减少环境污染。
现在的远程控制往往指互联网中的远程控制。
当操作者使用主控端电脑控制被控端电脑时,就如同坐在被控端电脑的屏幕前一样,可以启动被控端电脑的应用程序,可以使用或窃取被控端电脑的文件资料,甚至可以利用被控端电脑的外部打印设备(打印机)和通信设备(调制解调器或者专线等)来进行打印和访问外网和内网,就像利用遥控器遥控电视的音量、变换频道或者开关电视机一样。
不过,有一个概念需要明确,那就是主控端电脑只是将键盘和鼠标的指令传送给远程电脑,同时将被控端电脑的屏幕画面通过通信线路回传过来。
也就是说,控制被控端电脑进行操作似乎是在眼前的电脑上进行的,实质是在远程的电脑中实现的,不论打开文件,还是上网浏览、下载等都是存储在远程的被控端电脑中的。
当然,远程控制软件是一把双刃剑,有优点就会有缺点,它存在比较严重的安全隐患。
一方面给用户和网络管理员工作带了很大的方便,另一方面也给一些居心不良者留下后门。
形成很多木马程序。
这就需要对软件在设计方面做一些安全考虑。
2.需求分析
2.1用户需求
当您在家里安装软件时遇到了麻烦,这是您可能立即需要有维护人员的帮助;当您非常想听一个远地老师的课程,但偏偏路途遥远您不能赶过去;当您在办公室或商务旅行,您可能需要做一些事必须用您家里的电脑——那么远程访问软件必不可少!
它能帮助你访问远程计算机就像访问本地计算机一样,距离不再是问题!
远程桌面控制显示另一台计算机的屏幕(透过网际网络或本地网络)在您自己的屏幕上。
该程序允许你利用你的鼠标和键盘来控制其他的计算机远程。
这意味着您可以在远程计算机工作,就像你坐在它前面一样。
这样用户可以真正的实现远程办公。
2.2可行性研究
2.2.1技术可行性
随着网络的高度发展,电脑的管理及技术支持的需要,远程操作及控制技术越来越引起人们的关注。
远程控制一般支持下面的这些网络方式:
LAN、WAN、拨号方式及互联网方式。
此外,有的远程控制软件还支持通过串口、并口、红外端口来对远程机进行控制(不过这里说的远程电脑,只能是有限距离范围内的电脑了)。
传统的远程控制软件一般使用NETBEUI、NETBIOS、IPX/SPX、TCP/IP等协议来实现远程控制,不过,随着网络技术的发展,很多远程控制软件提供通过Web页面以Java技术来控制远程电脑,这样可以实现不同操作系统下的远程控制。
远程控制技术已经发展很成熟了!
2.2.2经济可行性
由于本软件多用于局域网或企业网等内网,仅仅需要两个ISP分发的IP地址,成本低廉,但是如果需要对程序的质量提高可以购买MD5等加密算法,对传输数据进行加密。
3.概要设计
主要思路就是先将远程桌面捕获,再发回本地,在窗体中显示出来,将本地鼠标和盘键输入,变成命令,发到远程主机执行,以模拟出鼠标和键盘的操作,再将远程桌面捕获,再发回本地,在对话框中显示出来。
3.1开发环境
VC++6.0
装有Windows2003的VMware
3.2总体框架的实现
本程序分客户端程序(Client)和服务器端程序(Server)两部分,使用TCP套接字编程,将客户端程序安装到主控端的电脑上,将服务器端程序安装到被控端的电脑上。
首先启动ServerWindow的程序,开启监听端口,等到ClientWindow连接到服务器的端口,之后服务端开启一个与客户端通信的线程,这个线程专门负责接收和处理客户端发送过来的消息,并在本机上执行相关命令。
然后将当前改变区域的屏幕的内容发送到客服端。
而客户端连接到服务器端之后,客户端程序就可以根据服务器端传过来的屏幕数据在本地机上显示出屏幕内容。
服务器端再根据这些消息做出相应的操作。
需要注意的是,服务器端刷屏的时候并不是将整个屏幕都传给客服端,因为整个屏幕图片的数据量比较大,当前网络负载也不是很稳定的条件下,该程序是很不稳定的。
一个可行的办法是将屏幕的划分成网格块,屏幕的刷新是以网格为单位的,只需要将这些变化的屏幕数据发送给客户端即可。
程序整体结构如下图所示:
图1
3.2.1服务器端实现
服务器端的网络模块负责监听客服端的连接,负责接收并处理客户端发送过来的命令(鼠标,键盘,网络消息等命令),在本机上处理这些消息并发送各种数据(屏幕数据,命令返回数据)到客户端监听程序。
3.2.2客户端实现
客户端网络模块负责连接到服务器端的监听SOCKET,负责向服务器端发送各种操作命令(鼠标,键盘,各种通用消息参数命令等),负责接收从服务器端发过来的数据(屏幕数据,命令执行结果等),然后将这些数据的内容显示到屏幕上。
其中采用的是流式套接字,他是基于TCP通信原理而封装的。
是面向连接的服务,提供了更高的安全性。
4.详细设计
4.1界面设计
4.1.1服务器端
服务器端采用窗口设计,菜单栏只有一项“server”,单击“server”,弹出它的子菜单,有3个选项“StartServer”、“stopserver”、“exit”。
图2
4.1.2客户端
客户端采用窗口设计,菜单栏只有一项“client”,丹迪“client”,弹出它的子菜单,有3个选项“ConnectandcontroltoServer”、“DisconnectfromServer”、“Exit”。
选中“ConnecttoServer”弹出对话框,有一个静态框,一个IP地址框,两个按钮。
其中IP地址框预设的IP为“192.168.223.100”。
复选框“Don’tsendquery”失效。
图3
图4
4.2服务器代码设计
4.2.1建立连接
通过WSASocket()创建监听套接字,其中第一个参数指明协议地址家族。
第二个参数协议套接字类型,本程序用的是TCP连接,所以此处为SOCK_STREAM。
当指定的地址家族和套接字类型有多个条目时,就可用第三个参数字段来限定使用特定传输。
Listenfd=WSASocket(AF_INET,SOCK_STREAM,IPPROTO_IP,NULL,0,SOCK_STREAM);
local.sin_addr.s_addr=htonl(INADDR_ANY);
local.sin_family=AF_INET;
local.sin_port=htons(DEFAULT_PORT);
if(bind(Listenfd,(structsockaddr*)&local,sizeof(local))==SOCKET_ERROR)
{
sprintf(szString,"bind()failed:
%d\n",WSAGetLastError());
MessageBox(NULL,szString,"RemoteServer",MB_OK);
return1;
}
为了减小CPU的利用率,禁止在socket上将数据发送到缓冲。
设置SO_SNDBUF为0,从而使winsock直接发送数据到客户端,而不是将数据缓冲才发送。
nZero=0;
setsockopt(Listenfd,SOL_SOCKET,SO_SNDBUF,(char*)&nZero,sizeof(nZero));
listen(Listenfd,SOMAXCONN);
连接的时候采用阻塞方式的接收客户端的连接,但因为这是一个线程函数,所以用户不会感到阻塞
Connectfd=accept(Listenfd,(structsockaddr*)&client,&Len);
连接够设置传到客户端线程的信息的数据结构,找出客户端的IP地址,并为每一个客户端创建一个线程
myStructure.Connectfd=Connectfd;
myStructure.hWnd=hServerWnd;
memset(szClientIP,'\0',sizeof(szClientIP));
sprintf(szClientIP,"%s",inet_ntoa(client.sin_addr));
hThread=CreateThread(NULL,0,ClientThread,(LPVOID)&myStructure,0,&dwThreadId);
4.2.2消息判断及处理
客户端线程函数ClientThread(),这个函数等候从客户端程序发送过来的消息,然后对消息SOCKET中取出消息结构体从而对具体消息关键字进行匹配,匹配成功的话,就转向具体的消息处理函数。
匹配条件约束如下:
如果这个消息时“CONTROL”,那么判断是否接受控制,发送相应的确认信息
如果这个消息是"REFRESH",那么它发送当前的桌面图片
如果这个消息是"DISCONNECT",那么它结束和客户端的连接
如果个消息是“RESOLUTION”,那么发送分辨率到客户端
如果这个消息以"WM_"开头,那么它就根据消息类型,在服务器端执行该消息
4.2.3确认/拒绝控制请求
此功能在ClientThread()里实现,判断是否为“CONTROL”消息,如果是,弹出“Controlquery”消息框,提示“Someonewanttoseeyourdesktopandcontrolit?
”,temp值为6表示按下了YES键,同意接受远程控制,同时发送“YES”的确认信息。
若果按下了NO键,那么发送“NO”的确认信息。
程序代码如下:
if(strncmp(recvbuf,"CONTROL",7)==0)
{
temp=MessageBox(NULL,"Someonewanttoseeyourdesktopandcontrolit?
","Controlquery",MB_YESNO);
if(temp==6)
{
sprintf(query,"YES\0");
Transmit(MySocket,query,sizeof(query));
}
else
{
sprintf(query,"NO\0");
Transmit(MySocket,query,sizeof(query));
}
}
4.2.4发送分辨率
对于服务器来说,使用函数SendResolution()发送分辨率到客户端,而作为客户端则使用GetResolution()得到服务器的分辨率。
客户端发送“RESOLUTION”的消息请求得到分辨率,服务器端线程函数ClientThread()判断消息,调用SendResolution()传送屏幕宽度,服务器端Recv()接收并发出确认信息,服务器得到确认信息后继续传送屏幕高度,待客户端接收并发回确认信息,做出接收确认。
具体交互如下图所示:
图5
4.2.5捕获并且发送桌面的更新的区域
首先,调用函数GetRegionDisplay()得到每个网格区域显示,计算发生的变化区域的数目,变化一个网格则iUpdates加1。
fSend=GetRegionDisplay(hWnd);
if(fSend)
iUpdates++;
pGdiNode=pGdiNode->pNext;
然后,调用函数Transmit()向客户端发送桌面信息,发送到客户端需要更新的显示区域的数目,清空szMessage并用recv()接收可会发回来的确认信息。
4.2.6处理鼠标消息
程序初始设置鼠标消息fWMMouseMsg为FALSE,判断是否有鼠标消息,strcmp(pCommandNode->Command.szElement,WMMouseMsg[iLoop].szWMMouseMsg),如果有,那么设置fWMMouseMsg为TURE,根据不同的鼠标消息,设置iMessage值,然后移动x坐标、y坐标、辅助键到参数栈的下一个节点,退出循环开始处理鼠标消息。
首先得到坐标,并对坐标进行一定比例的缩放,转换格式以后可以处理鼠标消息。
根据iMessage值的不同,做出相应的动作,其中iMessage值1到10分别为:
鼠标移动、鼠标左键按下、鼠标左键弹起、双击鼠标左键、鼠标中键按下、鼠标中键弹起、双击鼠标中键、鼠标右键按下、鼠标右键弹起、双击鼠标右键。
函数mouse_event(DWORDdwFlags,DWORDdx,DWORDdy,DWORDdwData,ULONG_PTRdwExtraInfo),第一个参数定义各种鼠标移动和点击的标志,第二个参数Dx定义沿着X轴的绝对位置,第三个参数Dy定义沿着Y轴的绝对位置。
鼠标移动处理程序如下:
if(iMessage==1)
{
mouse_event(MOUSEEVENTF_ABSOLUTE|MOUSEEVENTF_MOVE,dwX,dwY,0,0;
}
4.2.7处理键盘消息
程序初始设置键盘消息fWMKeyBdMsg为FALSE,判断是否有键盘消息,strcmp(pCommandNode->Command.szElement,WMKeyBdMsg[iLoop].szWMKeyBdMsg)如果有,那么设置fWMMouseMsg为TURE,定义iMessage为1和2为按下键和松开键,移动Virtural键码、按下键标志、按键重复数、标志位到参数链表下一节点退出循环开始处理键盘消息。
程序中想要模拟PRINTSCRN的消息,去抓取屏幕的内容并将其保存到剪切板中,那么可以将key_event(BYTEbvk,BYTEbScan,DWORDdwFlags,ULONG_PTRdwExtraInfo)中参数BVK设置为VK_SNAPSHOT,通过修改keybd_event()的第三个参数来模拟按键和松开键的过程,其中第三个参数为0则模拟按下键的过程,1为KEYEVENTF_KEYUP则模拟松开键的过程。
程序代码如下:
if(iMessage==1)
{
keybd_event((BYTE)vk,(BYTE)vk,0,0);
}
elseif(iMessage==2)
{
keybd_event((BYTE)vk,(BYTE)vk,KEYEVENTF_KEYUP,0);
}
4.3客户端代码设计
4.3.1建立连接
首先在可以调用一个Winsock()函数之前,调用函数WSAStartup()以加载一个版本正确的Winsock库。
然后调用函数WSAEnumprotocol()获得系统中安装协议的相关信息,这时候可以正式开始建立连接的工作了:
首先建立连接套接字,指定地址协议家族和套接字类型:
WSASocket(AF_INET,SOCK_STREAM,IPPROTO_IP,NULL,0,SOCK_STREAM)。
建立连接:
connect(sClient,(structsockaddr*)&server,sizeof(server))
4.3.2发送请求控制
发送请求控制主要在LoadSocket()实现,在建立连接完成的时候调用函数Send(),发送“CONTROL”控制连接的命令,然后调用Recv()函数接受服务器返回的信息
程序代码如下:
memset(szMessage,'\0',sizeof(szMessage));
sprintf(szMessage,"CONTROL\0");
Send(sClient,szMessage);
iRecv=Recv(sClient,szRecv,sizeof(szRecv));
szRecv[iRecv]='\0';
判断服务器返回的信息,如果是“YES”,那么继续请求得到分辨率、设置网格以及初始化屏幕等操作,返回值0,如果不是“YES”那么弹出“error!
”的提示信息,告知用户不允许控制,返回值为66。
if(strncmp(szRecv,"YES",3)==0)
{
GetResolution();
SetGrids(hWnd);
memset(szMessage,'\0',sizeof(szMessage));
sprintf(szMessage,"WM_COMP;%d;0;0;0;\0",iCompressionLevel);
SendCommand(hWnd,1,szMessage);
UpdateRegionalScreen(hWnd,sClient,TRUE);
return0;
}
Else
MessageBox(NULL,"You'arenotallowedcontrol!
pleasetryagain!
","error!
",MB_OK);
return66;
在函数OnCommand()会判断当前用户的操作,所以还需要修改LoadWinsock()返回值后的一些操作,如果返回值为0,那么连接成功建立,设置标志位fConnected为TRUE。
如果返回值为66,那么用户不同意被远程控制,那么设置一个循环,继续判断当前的返回值,看用户是否同意远程控制,设置fConnected为FALSE,连接建立失败。
如果返回值不是0,也不是66,那么也置标志位为FALSE。
if(LoadWinsock(m_hWnd,pServerIP->szIP)==0)
fConnected=TRUE;
elseif(LoadWinsock(m_hWnd,pServerIP->szIP)==66)
{
gotoAGAIN;
fConnected=FALSE;
}
else
fConnected=FALSE;
4.3.3初始化得到的桌面
调用函数UpdateRegionalScreen(HWNDhWnd,SOCKETsClient,BOOLfFirstTime),第三个参数fFirstTime为BOOL类型,当为TURE的时候就是第一次初始化得到的桌面图像
pTempDIB=pGdiNode->Gdi.pDIBitmap;
memblast(&pGdiNode->Gdi.pDIBitmap[iStartPos],pGdiNode->Gdi.pDIB,iNewLen);
pGdiNode->Gdi.fDIBitmap=TRUE;
4.3.4得到分辨率
详见4.2.6发送/接收分辨率函数GetResolution()。
4.3.5设置网格
首先调用函数Clear_Grid()清除当前设置的网格,然后调用函数SendCommand()向服务器发送命令WM_GRID,请求得到网格,最后调用函数InitGrids()初始化图像网格。
图6
详细代码如下:
Clear_Gdi(&GdiStart);
memset(szMessage,'\0',sizeof(szMessage));
sprintf(szMessage,"WM_GRID;%d;%d;0;0;\0",nGridX,nGridY);
SendCommand(hWnd,1,szMessage);
InitGrids();
4.3.6更新桌面
当客户端向服务器发送命令,SendCommand(HWNDhWnd,intiParm,char*szWMMessage),第二个参数iParm为0,那么将调用函数UpdateRegionalScreen(hWnd,sClient,FALSE),此时第三个参数fFirstTime为FALSE,进行更新桌面操作。
5.测试
5.1测试用例
表1测试用例
测试序号
测试名称
测试用例
预期结果
实际结果
结果
1
IP地址预设显示
前提
步骤
IP地址预设为“192.168.223.100”
IP地址预设为“192.168.223.100”
通过
用户打开“connecttoserver”对话框
观察IP地址栏地址
2
IP地址的合法性
用户打开“connecttoserver”对话框
1:
输入!
2:
输入F2
3:
输入300
4:
输入255
1:
无法输入
2:
无法输入
3:
显示255
4:
显示255
1:
无法输入
2:
无法输入
3:
显示25
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 信息 安全 课程设计 远程 控制
![提示](https://static.bingdoc.com/images/bang_tan.gif)