#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;
}
C语言实现劫持剪贴板
发布于 2024-01-02 121 次阅读
Comments NOTHING