微软轻量级工具Sysmon新功能剪切板Change事件

阅读量    103498 |

分享到: QQ空间 新浪微博 微信 QQ facebook twitter

 

Sysmon的最新版本增加一个事件id: 24 剪切板事件,sysmon的官网描述如下
https://docs.microsoft.com/en-us/sysinternals/downloads/sysmon

如果要开启这个功能可以进行简单的配置文件,内容如下:

<EventFiltering>
<!-- Log all drivers except if the signature -->
<!-- contains Microsoft or Windows -->
<!-- Do not log process termination -->
<ClipboardChange onmatch="exclude" />
</EventFiltering>

输入命令行:

Sysmon64.exe -c “new 1.xml” 打开更新规则

然后我们打开windows事件日志记录就可以看到剪切板的记录事件了,事件id值是24

查看详细信息

SYSMONSCHEMA.XML描述该事件的进程参数

多两条参数配置信息

<option switch="z" name="ClipboardInstance" argument="required" noconfig="true" exclusive="true" />
<option name="CaptureClipboard" argument="none" />

SYSMONSCHEMA.XML描述该事件规则上报结构
<event name="SYSMONEVENT_CLIPBOARD" value="24" level="Informational" template="Clipboard changed" rulename="ClipboardChange" version="5">
<data name="RuleName" inType="win:UnicodeString" outType="xs:string" />
<data name="UtcTime" inType="win:UnicodeString" outType="xs:string" />
<data name="ProcessGuid" inType="win:GUID" />
<data name="ProcessId" inType="win:UInt32" outType="win:PID" />
<data name="Image" inType="win:UnicodeString" outType="xs:string" />
<data name="Session" inType="win:UInt32" />
<data name="ClientInfo" inType="win:UnicodeString" outType="xs:string" />
<data name="Hashes" inType="win:UnicodeString" outType="xs:string" />
<data name="Archived" inType="win:UnicodeString" outType="xs:string" />
</event>

上报事件id: 24, 事件字段:UtcTime、ProcessGuid、ProcessId、Image、Session、Hashes、ClientInfo

了解了该事件的大概的情况的后,我们就要开始分析sysmon监测该事件的原理方法。

1. 开关打开剪切板开关后就会运行Start函数

 

2. StartClipboardListening

(1)先获取两个与剪切板监控相关的函数AddClipboardFormatListener、RemoveClipboardFormatListener的函数地址

(2)创建一个窗口来监控剪切板

窗口的类名: L”smclip”;
窗口函数WinMonitorClipBoard

(3)窗口回调函数WinMonitorClipBoard的逻辑

1> WM_CREATE消息

WM_CREATE是窗口的创建消息,sysmon在WM_CREATE的时候会调用AddClipboardFormatListener(HWND),该函数的作用是指定哪个窗口有资格去捕捉剪贴板内容更新的消息。然后调用hWndNewNext = SetClipboardViewer(a1); SetClipboardViewer()也是监控剪切板事件的设置函数,把当前窗口假如的监控队列里。

2> WM_DRAWCLIPBOARD 剪切板内容变化事件

当发生这个消息的时候,sysmon 就回调用GetClipboardSequenceNumber函数获取当前窗体在剪切板链下的序列号,调用GetPriorityClipboardFormat获取在一个列表下某个索引的剪切板格式

它要获取的是三种格式: CF_TEXT 、 CF_WAVE 、CF_OEMTEXT
接下来就尝试打开剪切板并且获取剪切板里的数据

获要获取的就是上述三种格式的数据,获取数据后就计算数据的hash。
为了补充信息,sysmon还会通过GetClipboardOwner获取当前剪切板改变的窗口句柄,然后通过GetWindowThreadProcessId函数获取该窗口的线程以及进程。

3> WM_CHANGECBCHAIN 监控链改变的消息

这个消息是当有新的监控程序加入或移出,那么就会给这个链表中每个程序发送一个消息WM_CHANGECBCHAIN, sysmon遇到有这个发生的时候会判断是否是自己的消息被移除,了,就把自己再加回来了。

4> WM_CLIPBOARDUPDATE 剪切板更新消息

这个消息是AddClipboardFormatListener消息带来的,Sysmon的处理逻辑与WM_DRAWCLIPBOARD一样。

5> WM_QUIT 退出消息

退出就销毁当前监控。

sysmon的监控逻辑就这么简单,下面可以自己尝试写一个demo,可以建立一个MFC的窗口程序,窗口初始化的时候调用AddClipboardFormatListener

窗体里继承映射WM_DRAWCLIPBOARD 和 消息

afx_msg void OnDrawClipboard();
afx_msg void OnClipboardUpdate();

BEGIN_MESSAGE_MAP(CForbidCapDlg, CDialogEx)
ON_WM_DRAWCLIPBOARD()
ON_WM_CLIPBOARDUPDATE()
END_MESSAGE_MAP()

当我在其他进程鼠标右键复制操作一下,监控程序就会进入OnClipboardUpdate

Demo实例成功,至此,这篇文章就分析到这里,剪切板的监控就这么简单,大家有兴趣可以自行研究的更深入。

分享到: QQ空间 新浪微博 微信 QQ facebook twitter
|推荐阅读
|发表评论
|评论列表
加载更多