CLIPBRDWNDCLASS注入方法的修改

本文最后更新于:2022年12月1日 上午

0.前言

前些天就有人问起,今天正好有时间就搞一下这个东西,思路很简单,也可以用于一些类似的方案上

1.背景介绍

四年前,Hexacorn在自己的博客中提出了一种新颖的注入方法,整体思路类似于Propagate的方法,通过窗口消息触发执行

大概半年后,odzhan发布了公开的poc,整套注入以及很完善了。此后的三年半,这套方案一直可以用来绕过360核晶进行进程注入

总结下来,就是通过窗口消息等方法,触发RemoveClipboardDataObject或其他几个类似的函数的执行,在函数内会获取ClipboardDataObjectInterface等三个属性,并调用其中的方法,参考下方伪代码:

RemoveClipboardDataObject

2.拦截

前几天,360安全卫士更新到了14版本,增加了对一些窗口消息注入的拦截,具体来说是拦截了SetProp函数的第二个参数是ClipboardDataObjectInterface的情况。通过参考ReactOS的代码prop.c,以及动态调试单步执行找拦截点(下图),确定了是对NtUserSetProp函数的第二个参数进行了判断(参数为传入的string转为的Atom)

360的拦截

3.绕过

看到这里,熟悉360内核hook的就可以看出来,想在NtUserSetProp的地方绕过很难了,这时候就需要在ring3搞一些操作了

根据上面已知的消息,以及逆向ole32.dll函数获取的其他信息,可以发现一个简单的思路,ring0的拦截没必要去管,只要传入时Atom对应的string不是特定的几个就不会被拦截,所以可以简单的在ring3进行hook,修改目标进程中ole32.dll的内存中ClipboardDataObjectInterface字符串即可,实际操作起来直接查找到ole32.dll地址再暴力搜字符串替换掉即可

4.整理方案

更改后,整体注入变为

  • 找到一个剪贴板以及对应的进程
  • 写入shellcode
  • 初始化并写入ClipboardDataObjectInterface的接口
  • 替换ole32.dll的内存中ClipboardDataObjectInterface字符串
  • SetProp使用上一步修改后的字符串设置属性
  • 发送窗口销毁的消息触发执行
  • 恢复ole32.dll的内存中ClipboardDataObjectInterface字符串
  • 关闭句柄等其他收尾操作

5.代码

到这里就解决了被拦截的问题,具体代码未经整理,就不放出来了,有兴趣的可以自己实现一下


CLIPBRDWNDCLASS注入方法的修改
https://blog.qwqdanchun.com/CLIPBRDWNDCLASS_injection/
作者
qwqdanchun
发布于
2022年11月22日
更新于
2022年12月1日
许可协议