Anti-Screen Capture(Prevent Screen Captures)截屏与反截屏
1.数字图片使用类似于动画的方式显示,每次显示的是数字的一部分,当动态显示的时候人眼是可以分辨出具体数字的。但是截图的话就只能截取一部分,参考:
http://cups.cs.cmu.edu/soups/2007/posters/p147_lim.pdf
2.屏蔽系统按键:Print Screen 和 Alt + Print Screen,主要原理是注册热键的方式,参考:
http://www.vckbase.com/document/viewdoc/?id=1566
代码: Handling Hotkeys
MainFrame.h
#include "FolderFrame.h"
#include "resource.h"
////////////////
// Typical MFC Main frame window, override to disable PrintScreen.
//
class CMainFrame : public CFrameWnd {
protected:
...
afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
// disable PrintScreen
afx_msg void OnActivate(UINT nState, CWnd* pWndOther, BOOL bMinimized);
afx_msg LRESULT OnHotKey(WPARAM wp, LPARAM lp);
afx_msg void OnDestroy();
DECLARE_MESSAGE_MAP()
};
MainFrame.cpp
#include "StdAfx.h"
#include "MainFrm.h"
#include "View.h"
IMPLEMENT_DYNCREATE(CMainFrame, CFrameWnd)
BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
...
// disable PrintScreen:
ON_WM_CREATE()
ON_WM_DESTROY()
ON_WM_ACTIVATE()
ON_MESSAGE(WM_HOTKEY, OnHotKey)
END_MESSAGE_MAP()
...
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
...
RegisterHotKey(m_hWnd, IDHOT_SNAPDESKTOP, 0, VK_SNAPSHOT);
return 0;
}
void CMainFrame::OnDestroy()
{
UnregisterHotKey(m_hWnd, IDHOT_SNAPDESKTOP);
}
//////////////////
// Handle hotkey: should be PrintScreen or Alt-PrintScreen.
// Do nothing (bypass Windows screen capture)
//
LRESULT CMainFrame::OnHotKey(WPARAM wp, LPARAM)
{
UNREFERENCED_PARAMETER(wp);
return 0; // ignore
}
//////////////////
// When window is activated/deactivated, disable/enable Alt-PrintScreen.
// (IDHOT_SNAPWINDOW)
//
void CMainFrame::OnActivate(UINT nState, CWnd* pWndOther,
BOOL bMinimized)
{
CFrameWnd::OnActivate(nState, pWndOther, bMinimized);
if (nState)
RegisterHotKey(m_hWnd, IDHOT_SNAPWINDOW, MOD_ALT, VK_SNAPSHOT);
else
UnregisterHotKey(m_hWnd, IDHOT_SNAPWINDOW);
}
3.全局Hook,参考:
Screen Capture Library for Windows
http://topic.csdn.net/u/20090914/00/70e6da83-906b-4db4-a3ee-d79dfd460bd6.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:
[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
其中还有一些防键盘记录的,与截屏有关的是:NtGdiBitBlt,NtGdiMaskBlt,NtGdiPlgBlt,NtGdiStretchBlt。NtUserBuildHwndList,NtUserFindWindowEx用来隐藏窗口,
使得三方程序查找窗口时找不到被保护的窗口,也是与防截屏功能有关的。
延伸阅读:
Hook Shadow SSDT
Windows 内核新手上路(一)——挂钩 SSDT
Windows 内核新手上路(二)——挂钩 shadow SSDT
Windows内核新手上路(三)——挂钩KeUserModeCallBack
将程序移植到 64 位 Windows
INF Requirements for 64-bit Systems
64 位 Microsoft Windows 驱动程序清单

近期评论