C语言实现劫持剪贴板

发布于 2024-01-02  45 次阅读


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <windows.h>

// 定义一个全局变量,用于存储剪贴板的原始内容
char* original_clipboard = NULL;

// 定义一个函数,用于读取剪贴板的内容,并将其存储在original_clipboard中
void read_clipboard() {
    HGLOBAL hMemory; // 剪贴板句柄
    LPTSTR lpMemory; // 剪贴板内存指针
    int contentSize; // 剪贴板内容的大小

    // 打开剪贴板
    if (!OpenClipboard(NULL)) {
        printf("打开剪贴板失败!\n");
        exit(1);
    }

    // 检查剪贴板是否为文本格式
    if (!IsClipboardFormatAvailable(CF_TEXT)) {
        printf("剪贴板中的数据类型不匹配!\n");
        CloseClipboard();
        exit(1);
    }

    // 获取剪贴板的数据
    hMemory = GetClipboardData(CF_TEXT);
    if (!hMemory) {
        printf("获取剪贴板数据失败!\n");
        CloseClipboard();
        exit(1);
    }

    // 锁定剪贴板的内存区域,并获取指针
    lpMemory = (LPTSTR)GlobalLock(hMemory);
    if (!lpMemory) {
        printf("锁定剪贴板内存失败!\n");
        CloseClipboard();
        exit(1);
    }

    // 获取剪贴板内容的大小,并分配相应的内存空间
    contentSize = GlobalSize(hMemory);
    original_clipboard = (char*)malloc(contentSize);
    if (!original_clipboard) {
        printf("分配内存失败!\n");
        GlobalUnlock(hMemory);
        CloseClipboard();
        exit(1);
    }

    // 复制剪贴板内容到original_clipboard中
    memcpy(original_clipboard, lpMemory, contentSize);

    // 解锁剪贴板的内存区域,并关闭剪贴板
    GlobalUnlock(hMemory);
    CloseClipboard();

    // 打印剪贴板的内容
    printf("剪贴板的内容为:\n%s\n", original_clipboard);
}

// 定义一个函数,用于劫持剪贴板,使其只能粘贴original_clipboard中的内容
void hijack_clipboard() {
    HGLOBAL hMemory; // 剪贴板句柄
    LPTSTR lpMemory; // 剪贴板内存指针
    int contentSize; // 剪贴板内容的大小

    // 打开剪贴板
    if (!OpenClipboard(NULL)) {
        printf("打开剪贴板失败!\n");
        exit(1);
    }

    // 清空剪贴板
    if (!EmptyClipboard()) {
        printf("清空剪贴板失败!\n");
        CloseClipboard();
        exit(1);
    }

    // 获取original_clipboard的大小,并分配相应的内存空间
    contentSize = strlen(original_clipboard) + 1;
    hMemory = GlobalAlloc(GMEM_MOVEABLE, contentSize);
    if (!hMemory) {
        printf("分配内存失败!\n");
        CloseClipboard();
        exit(1);
    }

    // 锁定内存区域,并获取指针
    lpMemory = (LPTSTR)GlobalLock(hMemory);
    if (!lpMemory) {
        printf("锁定内存失败!\n");
        CloseClipboard();
        exit(1);
    }

    // 复制original_clipboard的内容到内存区域中
    memcpy(lpMemory, original_clipboard, contentSize);

    // 解锁内存区域,并设置剪贴板的数据
    GlobalUnlock(hMemory);
    if (!SetClipboardData(CF_TEXT, hMemory)) {
        printf("设置剪贴板数据失败!\n");
        CloseClipboard();
        exit(1);
    }

    // 关闭剪贴板
    CloseClipboard();

    // 打印提示信息
    printf("已劫持剪贴板,只能粘贴原始内容!\n");
}

// 定义一个函数,用于检测用户是否按下了Ctrl+`键,如果是,则终止程序
void check_exit() {
    // 获取Ctrl键的状态,如果按下,则返回一个非零值
    int ctrl_state = GetAsyncKeyState(VK_CONTROL);

    // 获取`键的状态,如果按下,则返回一个非零值
    int backquote_state = GetAsyncKeyState(VK_OEM_3);

    // 如果同时按下了Ctrl和`键,则退出程序
    if (ctrl_state && backquote_state) {
        printf("按下了Ctrl+`键,程序终止!\n");
        exit(0);
    }
}

// 主函数
int main() {
    // 读取剪贴板的内容,并存储在original_clipboard中
    read_clipboard();

    // 进入一个无限循环,不断劫持剪贴板,并检测用户是否按下了Ctrl+`键
    while (1) {
        hijack_clipboard();
        check_exit();
        Sleep(1000);
    }

    // 释放original_clipboard的内存空间
    free(original_clipboard);

    return 0;
}
最后更新于 2024-01-02