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用来隐藏窗口,使得三方程序查找窗口时找不到被保护的窗口,也是与防截屏功能有关的。