-
-
[讨论]关于我跟 dwm-screen-shot 这个老六DWM截图工具死磕这几天的血泪史
-
-
[讨论]关于我跟 dwm-screen-shot 这个老六DWM截图工具死磕这几天的血泪史
最近一直在折腾 DWM 注入,看着方框丝滑地贴在屏幕上,原本心情大好。直到我遇到了 GitHub 上那个开源的 dwm-screen-shot……
我勒个去,我以为我的 DWM 注入已经够底层了,结果点一下它的“测试截图”,我的透视方框被截得一清二楚!底裤都被看穿了。
为了绕过这玩意儿,我这几天头都快秃了。期间走了无数弯路,甚至怀疑人生,不过好在最后还是让我把这玩意儿彻底按在地上摩擦了。今天有空,给大家复盘一下这个蛋疼的逆向过程,权当避坑指南了。
一开始,我看过别人发的一篇文章,说这工具 Hook 了啥 Present、GetBuffer,最后那哥们无奈只能返回一张静态图片(比如 C:\1.png)。
我当时一想返回静态图太 low 了吧?别人一截图发现画面是死的,这不直接封号吗?
我想了个“高级”的招数:任何截图工具想拿像素,肯定要调 D3D11 的 CopyResource 或者映射显存的 Map 函数对吧?
那好办啊!我在 DWM 里每一帧画方框前,先备份一张“干干净净”的桌面底图。然后我把 d3d11.dll 的虚表(VTable)给 Hook 了,只要发现有工具试图调用 CopyResource 或者 Map 拷贝全屏画面,我就狸猫换太子,把那张干净的底图塞给它。
写完代码,注入,运行!
欸,您猜怎么着?根本没卵用! 截图工具依然稳稳地截到了我的透视框!
嘶~ 为什么?后来我把 dwm-screen-shot 的源码和 Payload 扒光了才发现:小丑竟是我自己。
人家根本不走 d3d11.dll 这套用户态的常规 API!人家通过 PDB 符号,直接在 dwmcore.dll 内部找了一个未公开的底层核武器函数 —— TakeDxgiCapture,直接把包含显存指针的底层结构体给端走了!我守在 D3D11 的大门前,人家早就从后门翻墙跑了……
既然拦不住你读取,那我就打时间差!我不信邪了。
我搞了一套汇编操作:在 DWM 执行 MultiplanePresent 把画面发给显示器之后,我强行劫持了返回地址!让代码不回 DWM,而是跳到我的“擦除器”里。在 1 微秒的时间内,我瞬间用干净桌面把 BackBuffer(后备缓冲)里的 ESP 像素全给擦了,还顺手调了个 Flush() 强迫显卡立刻执行。
[培训]Windows内核深度攻防:从Hook技术到Rootkit实战!
最后于 14小时前
被小杰send编辑
,原因: