首页
论坛
课程
招聘
雪    币: 17
活跃值: 活跃值 (17)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝

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

2020-4-14 22:17 3325

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

2020-4-14 22:17
3325

来源

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***),所以这种方法也仅供参考,无实际应用价值,不过拿来玩玩装逼还是不错的哈哈!

HWS计划·2020安全精英夏令营来了!我们在华为松山湖欧洲小镇等你

最新回复 (7)
雪    币: 6107
活跃值: 活跃值 (100)
能力值: ( LV4,RANK:156 )
在线值:
发帖
回帖
粉丝
月落之汀 活跃值 1 2020-4-14 22:54
2
0
气 急 败 坏
雪    币: 40
活跃值: 活跃值 (37)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
killpy 活跃值 2 2020-4-15 00:27
3
0
那问题来了 有啥好的反截图检测思路吗
雪    币: 17
活跃值: 活跃值 (17)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
renbohan 活跃值 2020-4-15 08:04
4
0
killpy 那问题来了 有啥好的反截图检测思路吗
就像我最后说的那样,你可以SetDisplayAffinity,其他进程也可以GetDisplayAffinity,稍微流氓点的AntiCheat发现这样的窗口就直接认为你作弊了
雪    币: 330
活跃值: 活跃值 (66)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
叶惠 活跃值 2020-4-15 09:48
5
0
到底谁是恶意软件啊~
雪    币: 8738
活跃值: 活跃值 (734)
能力值: ( LV9,RANK:250 )
在线值:
发帖
回帖
粉丝
hzqst 活跃值 3 2020-4-15 10:00
6
0
叶惠 到底谁是恶意软件啊~
恶 人 先 告 状
雪    币: 40
活跃值: 活跃值 (37)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
killpy 活跃值 2 2020-4-16 01:58
7
0
听说 调用dwm的某个函数 就可以郭截图 根本不需要hook 怎么做到的
雪    币: 7
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
C V萌新 活跃值 2020-6-30 20:21
8
0
尊敬的楼主,以及各位尊敬的看帖巨佬,我是一个只会C+V的萌新,我遇到了一个问题,请各位吊大的巨佬帮忙支支招,因为我听说看雪上全部都是大佬随便说点思路就能受益良多,秉着学习的精神发此求助,接下来问题来了,我想问的是我在某xf游戏上进行注入之后然后想绘制一个透视效果,但是他里面会检测hookdx所以我不得不在游戏外面进行绘制,但是这种方法会及其影响FPS必须开AERO透明窗口主题才会缓解FPS类问题,所以我想问问有没有什么方式能在外面绘制不掉FPS不开透明的情况下不卡不闪 或者还有什么方法在游戏里面绘制没有检测,本着学习研究技术的精神发此贴!我的发言完毕 谢谢大家
游客
登录 | 注册 方可回帖
返回