1.数字图片使用类似与动画的方式显示,每次显示的是数字的一部分,当动态显示的时候人眼是可以分辨出具体数字的。但是截图的话就只能截取一部分,参考:

cups.cs.cmu.edu/soups/2007/posters/p147_lim.pdf

 

2.屏蔽系统按键:Print Screen 和 Alt + Print Screen,主要原理是注册热键的方式,参考:

http://www.vckbase.com/document/viewdoc/?id=1566

 

3.全局Hook,参考:

Screen Capture Library for Windows : http://gpalem.web.officelive.com/screencap.html

 这种方法不仅要Hook GDI方式的截图还有DirectX方式的截图,当然不排除还有其他方式的截图,例如:“Windows Media API for Capturing the Screen”。

所以这种方法实施起来甚是繁琐,第一要尽可能多地Hook相关API函数,但是你很难做到全面。另一方面稳定性,扩展性和维护性也不太好。

 

4.视频过滤驱动(Video filter drivers)。

相对于Hook来说可能更好一些,但是技术难度比较大。

 http://search.codesoso.com/Record/ddf85213-2bdf-bfae-5626-15646cefdf09_446750_1.html

http://www.codeproject.com/Articles/Toby-Opferman

Driver Development Part 6: Introduction to Display Drivers

 

5.ShadowSSDT

经过体验“卡巴斯基2012”版本的虚拟键盘功能,发现其有防截屏功能,当虚拟键盘开启时截取的屏幕是全黑色的。如果虚拟键盘未开启,则截图时截不到卡巴斯基的主界面。

使用xuetr分析,卡巴斯基并没用设置“Video filter drivers”,而是使用了ShadowSSDT做的防截屏,以下是驱动klif.sys的ShadowSSDT:

[code=C/C++]

[XueTr][ShadowSSDT]: 21
序号       函数名称                      当前函数地址      Hook             原始函数地址      当前函数地址所在模块
13         NtGdiBitBlt                   0xB1EE8508        ssdt hook        0xBF809F5F        C:\WINDOWS\system32\DRIVERS\klif.sys
227        NtGdiMaskBlt                  0xB1EE85DE        ssdt hook        0xBF8384E0        C:\WINDOWS\system32\DRIVERS\klif.sys
237        NtGdiPlgBlt                   0xB1EE864E        ssdt hook        0xBF943B92        C:\WINDOWS\system32\DRIVERS\klif.sys
292        NtGdiStretchBlt               0xB1EE8572        ssdt hook        0xBF8738A3        C:\WINDOWS\system32\DRIVERS\klif.sys
307        NtUserAttachThreadInput       0xB1EE8BD6        ssdt hook        0xBF8F7976        C:\WINDOWS\system32\DRIVERS\klif.sys
312        NtUserBuildHwndList           0xB1EE86B6        ssdt hook        0xBF835EA1        C:\WINDOWS\system32\DRIVERS\klif.sys
323        NtUserCallOneParam            0xB1EE84D4        ssdt hook        0xBF801067        C:\WINDOWS\system32\DRIVERS\klif.sys
378        NtUserFindWindowEx            0xB1EE82C8        ssdt hook        0xBF8B128C        C:\WINDOWS\system32\DRIVERS\klif.sys
383        NtUserGetAsyncKeyState        0xB1EE80D6        ssdt hook        0xBF8491D4        C:\WINDOWS\system32\DRIVERS\klif.sys
414        NtUserGetKeyboardState        0xB1EE83D6        ssdt hook        0xBF852661        C:\WINDOWS\system32\DRIVERS\klif.sys
416        NtUserGetKeyState             0xB1EE8122        ssdt hook        0xBF820DEC        C:\WINDOWS\system32\DRIVERS\klif.sys
460        NtUserMessageCall             0xB1EE821A        ssdt hook        0xBF80EDEB        C:\WINDOWS\system32\DRIVERS\klif.sys
475        NtUserPostMessage             0xB1EE816E        ssdt hook        0xBF808934        C:\WINDOWS\system32\DRIVERS\klif.sys
476        NtUserPostThreadMessage       0xB1EE81C2        ssdt hook        0xBF8B3C60        C:\WINDOWS\system32\DRIVERS\klif.sys
490        NtUserRegisterHotKey          0xB1EE8C90        ssdt hook        0xBF8ADC84        C:\WINDOWS\system32\DRIVERS\klif.sys
491        NtUserRegisterRawInputDevices 0xB1EE835E        ssdt hook        0xBF915CEB        C:\WINDOWS\system32\DRIVERS\klif.sys
502        NtUserSendInput               0xB1EE827A        ssdt hook        0xBF8C3117        C:\WINDOWS\system32\DRIVERS\klif.sys
529        NtUserSetParent               0xB1EE8A88        ssdt hook        0xBF8795B5        C:\WINDOWS\system32\DRIVERS\klif.sys
549        NtUserSetWindowsHookEx        0xB1EE8026        ssdt hook        0xBF852721        C:\WINDOWS\system32\DRIVERS\klif.sys
552        NtUserSetWinEventHook         0xB1EE807E        ssdt hook        0xBF8F0099        C:\WINDOWS\system32\DRIVERS\klif.sys
576        NtUserUnregisterHotKey        0xB1EE8DB0        ssdt hook        0xBF912A64        C:\WINDOWS\system32\DRIVERS\klif.sys

[/code]



 

 

 其中还有一些防键盘记录的,与截屏有关的是:NtGdiBitBlt,NtGdiMaskBlt,NtGdiPlgBlt,NtGdiStretchBlt。NtUserBuildHwndList,NtUserFindWindowEx用来隐藏窗口,使得三方程序查找窗口时找不到被保护的窗口,也是与防截屏功能有关的。