本文章同步发表于看雪安全论坛
来源
github上的一个项目 wda_monitor_trick
介绍
我们在小学四年级学过,有一个叫做 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 *)
注意到红框内调用了CDrawingContext::FillRectangularShapeWithColor
,这也是原作者patch的点,直接将dwm.exe
绘制黑框框的行为给拦截掉
通过简单的特征搜索patch,再通过api的方式防截图,用普通截图工具就已经截不到黑框框了
优点与局限性
优点就是简单,方便,可动态patch
但是这种方法会将所有的使用api防截图的窗口全部隐藏掉,而不能只针对具体的某个窗口进行隐藏
兼容win7
同样,刚才的特征码只适合于win10 1903以上的系统,在win7上无法使用,通过对win7的dwmcore.dll
简单分析后,发现一个疑似和 RenderBlackShape
功能相似的符号 CWindowNode::RenderBlackImage(CDrawingContext *)
发现该函数是由CWindowNode::RenderContent
调用的
我没有兼容win7
,如果有大神比较闲可以适配分享一下哈哈
恶意软件如何继续气急败坏
这种方法也只是dwm.exe上的一个小把戏,windows也提供了api可以获取任意窗口的防截图状态(GetWin***Dis***Affi***
),所以这种方法也仅供参考,无实际应用价值,不过拿来玩玩装逼还是不错的哈哈!
通过Hook可以指定进程透明
By Nolovenodie at January 22nd, 2021 at 07:51 pm.