阻止SPY++类似的程序捕捉软件窗口

我以前用Spy++能轻易捕捉360软件界面,除了一些应用DHTML制作的窗体.昨天我再用Spy++捕捉的时候捕捉不到了,甚至连最外围的对话框都捕捉不到,显然是做了类似拦截API的处理.下面我也模拟一下这种效果,让自己的程序窗口不能被捕捉.
Spy++之类的程序一般通过API函数WindowFromPoint和ChildWindowFromPoint来获取指定位置的窗口句柄。拦截一下WindowFromPoint函数,如果捕捉到的是自己程序的窗口,而且实施捕捉的进程不是自己程序的进程,那就直接返回NULL(这样自己的程序捕捉自己的窗口就不会受影响).拦截API我直接用微软的Detour库,使用起来方便.
由于是拦截所有进程地址空间的WindowFromPoint函数,我借助于全局WH_SHELL钩子,因此拦截操作放在一单独的DLL项目中.先封装一下Detour操作CInterceptSpyFun类:
h文件///

///cpp

dwValidProcessID(要拦截WindowFromPoint函数的进程ID)需要在LoadLibrary之后,安装钩子之前传递,并且需要保存到共享节中以达到在所有的进程中数据共享的目的. 
#pragma  data_seg(“.unspy”)
HHOOK   hHook   =   NULL;  
DWORD  dwValidProcessID  =  0;
#pragma  data_seg()
#pragma comment(linker,”/section:.unspy,rws”)

 

 

HOOK句柄和dwValidProcessID  都保存到共享节”.unspy”中。

设置dwValidProcessID  的导出函数:
extern”C” __declspec( dllexport ) void SetValidProcessID( DWORD  dwProcessID )
{
 dwValidProcessID   =  dwProcessID;
}

声明拦截类的全局变量:
CInterceptSpyFun  interceptSpy;  
HMODULE   hDllModule   =  NULL;  //保存DLL模块句柄

SHELL钩子处理:

取消拦截操作应在卸载DLL的时候:

至此,DLL部分已经完成.在需要屏蔽WindowFromPoint函数的程序中需加载该DLL,调用DLL的SetValidProcessID,将当前的进程ID传入,随后安装钩子:

全部完工,运行了一下,呵呵,和360软件的效果一样,Spy++再也捕捉不到界面的任何东西了.

相关资源:Veneer:文件屏蔽软件-开源-其它代码类资源-CSDN文库

来源:weixin_34242331

声明:本站部分文章及图片转载于互联网,内容版权归原作者所有,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2014年1月12日
下一篇 2014年1月12日

相关推荐