首页
社区
课程
招聘
[分享]分享一个api防截图的“优化方法”
2020-4-14 22:17 18281

[分享]分享一个api防截图的“优化方法”

2020-4-14 22:17
18281

来源

github上的一个项目 wda_monitor_trick

 

demo 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 *)

demo jpg

 

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

 

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

优点与局限性

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

 

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

兼容win7

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

 

demo jpg

 

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

 

demo jpg

 

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

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

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


[培训]二进制漏洞攻防(第3期);满10人开班;模糊测试与工具使用二次开发;网络协议漏洞挖掘;Linux内核漏洞挖掘与利用;AOSP漏洞挖掘与利用;代码审计。

收藏
点赞2
打赏
分享
最新回复 (9)
雪    币: 6369
活跃值: (1258)
能力值: ( LV4,RANK:156 )
在线值:
发帖
回帖
粉丝
月落之汀 1 2020-4-14 22:54
2
0
气 急 败 坏
雪    币: 83
活跃值: (1037)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
killpy 2 2020-4-15 00:27
3
0
那问题来了 有啥好的反截图检测思路吗
雪    币: 457
活跃值: (1862)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
renbohan 2020-4-15 08:04
4
0
killpy 那问题来了 有啥好的反截图检测思路吗
就像我最后说的那样,你可以SetDisplayAffinity,其他进程也可以GetDisplayAffinity,稍微流氓点的AntiCheat发现这样的窗口就直接认为你作弊了
雪    币: 241
活跃值: (4029)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
pysafe 2020-4-15 09:48
5
1
到底谁是恶意软件啊~
雪    币: 12835
活跃值: (8988)
能力值: ( LV9,RANK:280 )
在线值:
发帖
回帖
粉丝
hzqst 3 2020-4-15 10:00
6
0
叶惠 到底谁是恶意软件啊~
恶 人 先 告 状
雪    币: 83
活跃值: (1037)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
killpy 2 2020-4-16 01:58
7
0
听说 调用dwm的某个函数 就可以郭截图 根本不需要hook 怎么做到的
雪    币: 149
活跃值: (1993)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
saloyun 2020-12-17 20:26
9
0
mark
雪    币: 0
活跃值: (913)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
spring丶必应 2022-7-15 21:48
10
0
请问自动加载符号是什么插件?
游客
登录 | 注册 方可回帖
返回