在家天天玩游戏 无聊的一~ 在一个风和日丽的下午 我躺在床上玩手机 偶然间看到一个交流群里面 有人在收所谓的dwm反截图 于是就起来研究了一番
先这样 再内样 最后那样 就搞定啦~
还是不开玩笑 直接上 GitHub - lainswork/dwm-screen-shot: 将shellcode注入dwm.exe以进行屏幕截取 在这个开源项目中 你将会看到他下载了当前系统版本dxgi模块的pdb文件 并从中寻找了4个地址
地址都有了 第一件事情 当然是丢到ce去看看他撒嘛个情况喽
好像 4个值是一样的 .... 那我们试着下个断点 看看是啥情况
直接说结果: 前三个地址断不下来 点击测试截图 按钮后 其中第1或2或3 的地址指向的空间会被清除 至于为什么会被清除...大家可以去那个开源项目研究研究
嘶~ 好吧 不过是 在不同版本的系统实测中 第四个地址 永远不会变 BUT...... 第四个 我发现处理第四个没啥用的 因为第四个一直被调用着 随时能断下来
大家对dwm下断 请做好卡死的准备 毕竟是处理所有窗口的程序 一旦停止了 你的画面也就无了~
那么 眼尖 又懒惰 的小伙伴 可能注意到了 前三个地址在截图时的变化 那我们是不是可以在截图的时候不绘制呢
欸 是不是可以利用这个思路进行反截图呢
欸还真可以(在我的电脑上...WIN11 22H2)
然后我就兴致勃勃的发给朋友试了 欸 您猜怎么着 他的绘制会消失一会儿 但是等恢复回来的时候 就刚好被截图到了....
好吧 还是不能走歪门邪道 我们还是老老实实看看那4个地址对应的啥函数吧 ~
OK 我们直接使用dumpbin工具获取到pdb内容
dumpbin工具 使用方法如下 : 1.打开vs 2.工具->命令行->开发者命令提示 然后出来了一个窗口 在里面输入
dumpbin /all "路径\dxgi.dll">D:\储存dump的文件.txt 注意dxgi的pdb要跟dll同目录
ok回归正题
在PDB文件中 找到了4个地址对应的虚函数名
第一个函数是PresentFullscreenFlip 第二个是 CDXGISwapChain::Present 第三个是PresentDWM@CDXGISwapChain 第四个是PresentMultiplaneOverlay
嘶~
在Bing后 在Baidu后 在Google后 再问过ChatGPT之后 我发现 这4个函数对我来说 用处不大~
于是我们退而求其次 去Bing一下 正常截图的方法
有一种比较简单的想法能比较快速的实现DirectX11 程序运行截图。
在当前场景帧进行Present()操作之前,渲染结果存储在交换链(Swap Chain)的后缓冲区中。我们定义一个Texture2D 对象,调用IDXGISwapChain类中的GetBuffer()方法可以将当前后缓冲区的绘制结果复制到该Texture2D对象中:
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!