1、课程目标
- 理解邮槽的通信原理
- 掌握邮槽的创建和使用
- 学会邮槽的单向广播通信
- 理解邮槽在安全领域的应用
2、名词解释
| 术语 |
英文 |
说明 |
| 邮槽 |
Mailslot |
单向进程间通信机制 |
| 服务端 |
Server |
创建邮槽并接收消息 |
| 客户端 |
Client |
向邮槽发送消息 |
| 广播 |
Broadcast |
向网络内所有同名邮槽发送 |
3、技术原理
3.1、邮槽特点
| 特点 |
说明 |
| 方向 |
单向(客户端→服务端) |
| 可靠性 |
不保证送达 |
| 消息大小 |
最大424字节(广播时) |
| 跨网络 |
支持 |
4、代码实现
4.1、示例1:邮槽服务端
#include <windows.h>
#include <stdio.h>
void MailslotServer() {
// 创建邮槽
HANDLE hSlot = CreateMailslot(
TEXT("\\\\.\\mailslot\\MyMailslot"),
0, // 最大消息大小(0=无限制)
MAILSLOT_WAIT_FOREVER, // 读取超时
NULL // 安全属性
);
if (hSlot == INVALID_HANDLE_VALUE) {
printf("CreateMailslot failed: %d\n", GetLastError());
return;
}
printf("Mailslot server started...\n");
while (1) {
char buffer[512];
DWORD bytesRead;
if (ReadFile(hSlot, buffer, sizeof(buffer)-1, &bytesRead, NULL)) {
buffer[bytesRead] = '\0';
printf("Received: %s\n", buffer);
if (strcmp(buffer, "exit") == 0) break;
}
}
CloseHandle(hSlot);
}
4.2、示例2:邮槽客户端
#include <windows.h>
#include <stdio.h>
void MailslotClient(const char* message) {
// 打开邮槽(写入模式)
HANDLE hSlot = CreateFile(
TEXT("\\\\.\\mailslot\\MyMailslot"),
GENERIC_WRITE,
FILE_SHARE_READ,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL
);
if (hSlot == INVALID_HANDLE_VALUE) {
printf("Open mailslot failed: %d\n", GetLastError());
return;
}
DWORD bytesWritten;
WriteFile(hSlot, message, strlen(message), &bytesWritten, NULL);
printf("Sent: %s\n", message);
CloseHandle(hSlot);
}
4.3、示例3:网络广播
#include <windows.h>
#include <stdio.h>
void BroadcastMessage(const char* message) {
// 域内广播地址
HANDLE hSlot = CreateFile(
TEXT("\\\\*\\mailslot\\MyMailslot"), // *表示广播
GENERIC_WRITE,
FILE_SHARE_READ,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL
);
if (hSlot != INVALID_HANDLE_VALUE) {
DWORD bytesWritten;
WriteFile(hSlot, message, strlen(message), &bytesWritten, NULL);
CloseHandle(hSlot);
}
}
5、课后作业
- 基础练习:实现邮槽的一对一通信
- 广播通信:实现局域网内的广播消息
- 安全应用:使用邮槽实现简单的C2通信通道
- 实战分析:分析使用邮槽进行通信的恶意软件