294 views
首页 > 技术心得 > Anti-Screen Capture(Prevent Screen Captures)截屏与反截屏

Anti-Screen Capture(Prevent Screen Captures)截屏与反截屏

2011年12月3日

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 驱动程序清单

技术心得

  1. 目前还没有任何评论.
  1. 目前还没有任何 trackbacks 和 pingbacks.