是否可以编写一个 "access clipboard" 监控程序?

Is it possible to code an "access clipboard" monitoring program?

是否有可能在 Windows 上创建一个能够跟踪哪个进程正在使用剪贴板的程序(C# 甚至 C++,或任何其他语言)?

我有一个恶意软件在我粘贴以太坊地址时修改了我的剪贴板。没有工具能够检测到此恶意软件...因为我是程序员,所以我想编写一个工具来帮助我找到恶意进程。

知道是否可行吗?

非常感谢

没有 Win32 API 用于监控对剪贴板的访问,仅用于检测何时对剪贴板的内容进行更改。

要完成您的要求,您必须编写一个直接挂钩 Win32 的 DLL OpenClipboard() function, such as with a detour, and then you can inject that DLL into all running processes, such as with SetWindowsHookEx(), AppInit_DLLs, etc. When your hook is called, it can communicate information about the calling process back to your main app as needed, such as the process ID

您可以找到可以为您执行此操作的现有且信誉良好的工具: Sysmon v12.0 来自 SysInternals。

虽然它没有在文档页面上提到它,this 状态

Sysmon 12 adds clipboard capturing

我筛选了一些帮助和参考资料并确认以下配置有效:

  <Sysmon schemaversion="4.40">
  <CaptureClipboard />
  <EventFiltering>
    <RuleGroup name="" groupRelation="or">
      <ClipboardChange onmatch="exclude">
      </ClipboardChange>
    </RuleGroup>
  </EventFiltering>
</Sysmon>

您可以在 Windows 事件查看器中查看那些捕获的事件,在

Applications and Services Logs/Microsoft/Windows/Sysmon/Operational.

为了响应我从命令提示符复制的文本,我可以看到这个记录的事件:

Clipboard changed:
RuleName: -
UtcTime: 2020-10-12 22:08:45.505
ProcessGuid: {0509ed25-cd58-5f84-41a3-050000003500}
ProcessId: 20708
Image: C:\Windows\System32\cmd.exe
Session: 3
etc...

另一种选择,适合 DIY 程序员:)

从您的代码中,通过延迟呈现将内容复制到剪贴板:

::SetClipboardData(CF_TEXT, NULL);

当某人(那个恶意软件?)试图获取该文本时,您将收到一条 WM_RENDERFORMAT 消息。如果你在那里放置一个断点并停止执行,调用程序将在其 GetClipboardData 调用或类似的东西上被阻止。

我不知道从这里去哪里。枚举所有进程?使用调试器附加到每个?看看他们的调用堆栈?