本文章同步发表于看雪安全论坛

看雪链接

来源

github上的一个项目 wda_monitor_trick

751959_5W3FBAU5ZACBY44.jpg

介绍

我们在小学四年级学过,有一个叫做 SetWin***Dis****Affi**** 的winapi可以帮助保护窗口内的内容不被其他恶意软件截图

但同样存在问题,调用这个api过后,我们窗口部分在截图下就会显示成丑陋的黑色,恶意软件截图时发现我们的程序是一坨黑,就会气急败坏,从而产生严重的后果

如何能够避开恶意软件的气急败坏呢?wda_monitor_trick 提供了一个极好的思路

分析

来到c:/windows/system32/ 拷贝出 dwmcore.dll

通过IDA打开并自动加载符号(需科学花Q),忽略一大堆依赖项

在函数窗口搜索 renderblack 可找到函数 CWindowNode::RenderBlackShape(CDrawingContext *,CShape const &)

.text:000000018021A60C                               ; int CWindowNode::RenderBlackShape(CWindowNode *__hidden this, struct CDrawingContext *, const struct CShape *)
.text:000000018021A60C                               ?RenderBlackShape@CWindowNode@@AEAAJPEAVCDrawingContext@@AEBVCShape@@@Z proc near
.text:000000018021A60C                                                                       ; CODE XREF: CWindowNode::RenderContent(CDrawingContext *,bool *)+9B695↑p
.text:000000018021A60C                                                                       ; CWindowNode::RenderBlackContent(CDrawingContext *)+AC↑p
.text:000000018021A60C                                                                       ; DATA XREF: ...
.text:000000018021A60C
.text:000000018021A60C                               var_18          = dword ptr -18h
.text:000000018021A60C                               var_10          = qword ptr -10h
.text:000000018021A60C                               arg_0           = qword ptr  8
.text:000000018021A60C
.text:000000018021A60C 48 89 5C 24 08                                mov     [rsp+arg_0], rbx
.text:000000018021A611 57                                            push    rdi
.text:000000018021A612 48 83 EC 30                                   sub     rsp, 30h
.text:000000018021A616 49 8B C0                                      mov     rax, r8
.text:000000018021A619 48 8B FA                                      mov     rdi, rdx
.text:000000018021A61C 48 8B D0                                      mov     rdx, rax        ; struct CShape *
.text:000000018021A61F 4C 8D 05 A2 AE 0C 00                          lea     r8, stru_1802E54C8 ; struct _D3DCOLORVALUE *
.text:000000018021A626 48 8B CF                                      mov     rcx, rdi        ; this
.text:000000018021A629 E8 FA 58 F5 FF                                call    ?FillRectangularShapeWithColor@CDrawingContext@@QEAAJAEBVCShape@@AEBU_D3DCOLORVALUE@@@Z ; CDrawingContext::FillRectangularShapeWithColor(CShape const &,_D3DCOLORVALUE const &)
.text:000000018021A62E 8B D8                                         mov     ebx, eax
.text:000000018021A630 85 C0                                         test    eax, eax
.text:000000018021A632 78 09                                         js      short loc_18021A63D
.text:000000018021A634 C6 87 D3 18 00 00 01                          mov     byte ptr [rdi+18D3h], 1
.text:000000018021A63B EB 1B                                         jmp     short loc_18021A658
.text:000000018021A63D                               ; ---------------------------------------------------------------------------
.text:000000018021A63D
.text:000000018021A63D                               loc_18021A63D:                          ; CODE XREF: CWindowNode::RenderBlackShape(CDrawingContext *,CShape const &)+26↑j
.text:000000018021A63D 48 83 64 24 28 00                             and     [rsp+38h+var_10], 0
.text:000000018021A643 44 8B CB                                      mov     r9d, ebx        ; int
.text:000000018021A646 45 33 C0                                      xor     r8d, r8d        ; unsigned int
.text:000000018021A649 C7 44 24 20 57 0C 00 00                       mov     [rsp+38h+var_18], 0C57h ; unsigned int
.text:000000018021A651 33 D2                                         xor     edx, edx        ; int *
.text:000000018021A653 E8 A4 68 E4 FF                                call    ?MilInstrumentationCheckHR_MaybeFailFast@@YAXKQEBJIJIPEAX@Z ; MilInstrumentationCheckHR_MaybeFailFast(ulong,long const * const,uint,long,uint,void *)

222.jpg

注意到红框内调用了CDrawingContext::FillRectangularShapeWithColor,这也是原作者patch的点,直接将dwm.exe绘制黑框框的行为给拦截掉

通过简单的特征搜索patch,再通过api的方式防截图,用普通截图工具就已经截不到黑框框了

优点与局限性

优点就是简单,方便,可动态patch

但是这种方法会将所有的使用api防截图的窗口全部隐藏掉,而不能只针对具体的某个窗口进行隐藏

兼容win7

同样,刚才的特征码只适合于win10 1903以上的系统,在win7上无法使用,通过对win7的dwmcore.dll简单分析后,发现一个疑似和 RenderBlackShape 功能相似的符号 CWindowNode::RenderBlackImage(CDrawingContext *)

333.jpg

发现该函数是由CWindowNode::RenderContent调用的

444.jpg

我没有兼容win7,如果有大神比较闲可以适配分享一下哈哈

恶意软件如何继续气急败坏

这种方法也只是dwm.exe上的一个小把戏,windows也提供了api可以获取任意窗口的防截图状态(GetWin***Dis***Affi***),所以这种方法也仅供参考,无实际应用价值,不过拿来玩玩装逼还是不错的哈哈!