进程通信专题

1、邮槽

1、课程目标

  1. 理解邮槽的通信原理
  2. 掌握邮槽的创建和使用
  3. 学会邮槽的单向广播通信
  4. 理解邮槽在安全领域的应用

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、课后作业

  1. 基础练习:实现邮槽的一对一通信
  2. 广播通信:实现局域网内的广播消息
  3. 安全应用:使用邮槽实现简单的C2通信通道
  4. 实战分析:分析使用邮槽进行通信的恶意软件