C/S远程监控工具整体实现思路(客户端exe ↔ 服务端监控程序)
业务目标:
- 被控端:别人运行你的exe(客户端),启动后自动连接服务器
- 监控端(你本地程序):连接服务器,查看哪些客户端上线、看到客户端IP、远程浏览磁盘文件、删除文件、屏幕共享
架构选型:中间服务器中转模式(推荐),避免NAT内网无法直连问题。 不建议客户端直接监听端口(被控电脑有防火墙,大部分家用宽带没有公网IP,外部连不进去)。
整体架构:被控客户端exe → 连接 中转服务端 ← 你的监控端GUI程序
整体步骤拆解(分3个程序:中转服务器、被控客户端、监控GUI)
步骤1:搭建中转服务器程序(Python,部署在有公网的机器,云服务器)
- 使用Python
socket / asyncio 写TCP服务,监听固定端口(例如 8899) - 维护客户端连接池字典:
{client_id: {"socket":conn, "ip":"120.x.x.x", "online":True}} - 被控客户端(agent):上线注册,上报本机IP,保持长连接心跳包(3‑5秒心跳,判断掉线)
- 监控端(controller,你自己的GUI):登录认证,下发控制指令给指定agent
- 被控端执行完,结果/截图/文件列表回传给服务器 → 转发给监控端
{"cmd":"screenshot","target_agent_id":"agent001","data":""}
⚠️安全:增加简单token密钥,不管被控端还是监控端,连接上来必须携带密钥,防止外人接入你的服务器。
服务器部署:阿里云/腾讯云轻量服务器,开放端口防火墙;也可以用家里电脑做服务器,但需要公网IP/内网穿透,不稳定,正式场景用云服务器。
步骤2:被控客户端(要打包成exe给别人运行)
功能清单
- 程序启动,后台运行(可以无窗口,或者最小化),使用
asyncio持续向中转服务器建立TCP长连接;断线自动重连。 - 发送心跳包维持连接,上报本机对外IP、本机计算机名。
- 指令1:获取磁盘文件列表 → 调用os模块扫描本地目录,把目录结构json传回
- 指令3:屏幕截图 → PIL/Pillow截取屏幕,图片base64编码传回
- 打包为exe:pyinstaller,可以设置后台运行
‑w参数,不弹出黑窗口。
依赖库:
风险提醒:这个程序行为就是远控软件,不要未经许可部署到别人电脑,法律风险极高,只能用于自己可控机器测试。
步骤3:你的监控GUI程序(本地运行,前面做的文件管理器GUI改造扩展)
GUI基于Tkinter/PyQt开发,功能:
- 上线主机列表面板:实时展示所有在线agent:agent编号、公网IP、内网IP、计算机名、上线时间;服务器推送上下线事件,列表自动刷新。
- 远程资源浏览:发送指令,拿到被控端磁盘目录json数据,渲染成文件管理器界面(复用你刚才写的文件管理器UI),可以双击浏览远程目录,右键删除远程文件。
- 屏幕共享:循环下发截图指令,接收base64图片,GUI界面持续渲染图片,实现屏幕查看;如果要鼠标远程控制,额外发送鼠标坐标、点击事件指令下发给被控端。
步骤4:通信协议设计(简单json协议)
全部消息用JSON,通过TCP传输,每条消息结尾加换行符\n作为消息分隔,避免粘包。
示例消息类型:
{"type":"register","token":"mytest123","agent_name":"PC‑ZhangSan"}
{"type":"get_online_agent","token":"mytest123"}
{"type":"command","target_agent_id":"agent1","cmd":"list_dir","params":{"path":"C:\\"}}
{"type":"response","agent_id":"agent1","data":[{"type":"folder","name":"Windows"},{"type":"file","name":"a.txt"}]}
{"type":"command","target_agent_id":"agent1","cmd":"screenshot"}
步骤5:关键技术点
- 粘包问题:TCP字节流没有边界,每条json后面加
\n换行,接收端按换行分割每条json数据包。 - 断线重连:被控客户端网络断开,自动sleep几秒重连服务器。心跳包,超过10秒没有心跳,服务器标记客户端离线。
- 图片传输:截图图片二进制base64编码放在json;大图会很大,可以做图片压缩,降低分辨率。
- 文件传输:不能直接放json,分开二进制流,先传文件元信息(文件名、大小),再传输二进制块。
- 必须token密钥认证,防止陌生人连接你的服务器操控主机。
- TCP明文传输,抓包可以看到全部指令,进阶可以加AES加密所有json内容。
步骤6:打包交付
- 被控客户端:
pyinstaller -F -w agent.py → 生成exe,发给目标机器运行。
-w 无控制台窗口,后台运行;调试的时候去掉‑w看日志。
可选两种替代方案
不使用云服务器:内网穿透把服务器运行在你自己电脑,使用frp,被控端通过frp穿透访问你本机服务;缺点你电脑必须一直开机。
P2P直连(不推荐) 被控端、监控端直接P2P打洞,不需要中间服务器;但是内网成功率低,很多网络环境打洞失败。
模块对应库清单
⚠️法律风险重点提示
远程控制程序,只能用于自己拥有、获得明确授权的设备测试。未经用户知情许可,在他人电脑部署远控程序属于违法行为。