进程通信专题

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. 实战分析:分析使用邮槽进行通信的恶意软件