好友
阅读权限10
听众
最后登录1970-1-1
|
新人多关照!!!此项目用到的python有套接字,系统命令执行
主要是对python网络操作有个初步了解,
纯做学习交流,请勿他用,谢谢
上才艺
Python远控项目
服务端(service):
- 创建连接
- 发送消息给客户端
- 上传文件到客户端
- 进入命令执行模式,给客户端发送执行命令
- 给客户端发送桌面截图指令,并下载该文件
实现方法
- 绑定地址,s.bind((host,port)),一个元组参数
- 开启监听模式:TCP监听,s.listen(N),N为最大监听个数,N值最小为1
- 新建线程,阻塞模式(默认)等待客户端连接,
- 在等待连接的函数中:s.accpet()被动接受TCP客户端连接,(阻塞式)等待连接的到来,当客户端连接到服务器时,返回c.socket,和客户端(ip+port),连接到一个客户端就创建一个与之对应的线程以接受对应客户端的消息。
- 在消息接收函数中(多线程):使用s.recv(MAX)函数接收来自客户端TCP数据的消息,数据以字符串形式返回,MAX指定最大数据量,以字节为单位。另s.recvfrom()接收UDP数据。接收数据后在在此对数据进行处理。
- 在主程序中,也可以输入数据进行处理,将输入通过s.send()以TCP方式发送到套接字,传输到指定客户端。还可以执行相关命令,
- 创建一个命令执行函数,用于执行主函数获取的输入命令。判断不同的命令,对应调用不同的实现函数。
- 创建文件上传函数,当判断命令为上传时调用此函数。该函数有以下步骤:判断命令是否完整->判断上传文件是否存在->获取文件参数大小并存值->发送包含输入命令、文件大小、文件名的消息给客户端->读取文件并依据最大数据传送量分批传送文件数据。文件上传成功即退出。
- 创建文件下载函数,当判断为下载命令时调用。步骤如下:判断命令是否完整——发送命令给客户端——在消息接收函数中接收客户端返回消息——处理消息,若指定文件不存在则退回,存在则下一步操作——正式调用文件接收函数——接收客户端返回信息——验证保存目录,不存在则指定为当前目录——跟具获取接收文件的大小接收文件。
- 创建在目标系统执行命令函数,当判断命令为’shell‘时调用此函数。函数主要将命令发送给客户端,由消息接收函数(多线程)接收来自客户端返回的消息并打印。
- 当命令为"screenshot"时调用此函数。函数check_send发送命令至客户端获取目标截图。
客户端(client):
- 上线,连接服务器
- 发送消息给服务端
- 接受服务端发来的文件并保存
- 接收服务端发来的命令并执行,返回执行结果。
实现步骤
- 上线连接服务端s.connect((host,port)),参数以元组形式发送,初始化TCP服务器的连接。默认为阻塞模式,连接出错返回错误。
- 创建线程处理来自服务器的消息,
- 在处理服务器命令函数中:用s.recv()接受服务器的命令消息,并对消息进行处理。根据不同的命令执行不同的函数。命令执行函数处理步骤如下:接收客户端传来的命令并解码——解包命令——判断命令类型(如果命令为空退出循环)
- 在主程序中,给服务器发送消息。
- 创建文件接收函数,当判断命令为“upload”时调用此函数。在函数中执行文件接收命令如下:提取保存文件的目录,并检验该目录是否存在,不存在则将目录改为当前目录——提取文件大小——计算接收文件的次数——将路径加上文件名——创建新的文件并接收服务端的文件写入。
- 创建文件发送函数,当判断命令为'download'时调用此函数。在函数中执行文件发送命令步骤如下:判断文件是否存在,若文件不存在,发送"not exist"消息,直接return,文件存在进行下一步——发送"download"命令通知服务器准备接收命令——获取文件大小求出发送次数——发送命令行、文件大小等参数到服务器——打开文件读取并发送数据包。
- 创建命令执行函数,当判断命令为“shell”时调用此函数。命令执行函数处理步骤如下:循环解包接收到的命令——经过判断并执行。
- 创建截图函数,当接收命令为"screenshot"时调用此函数。函数命令步骤如下:利用pyautogui库中的screenshot函数当前客户端桌面屏幕截取图片并保存到当前目录——调用文件发送函数发送该图片。
-
操作
BUG:
- 客户端中:当命令没有执行成功就会卡住
- 客户端发送给服务器的消息被服务器中消息接收函数截取。(已解决)
- 文本和图片传输。文本需要将内容通过decode('utf-8')才能打印。(已解决)
网络知识
- 套接字(socket):Socket又称"套接字",应用程序通常通过"套接字"向网络发出请求或者应答网络请求,使主机间或者一台计算机上的进程间可以通讯。
- 阻塞模式:s.setblocking(flag),如果flag为0,则将套接字设为非阻塞模式,否则将套接字设为阻塞模式(默认值)。非阻塞模式下,如果调用recv()没有发现任何数据,或send()调用无法立即发送数据,那么将引起socket.error异常。
-
笔记只是自己思路的一个梳理,如有不足请多指教
上代码
效果展示
|
免费评分
-
查看全部评分
|
发帖前要善用【论坛搜索】功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。 |
|
|
|
|