而放眼如今的编程市场,API拦截技术大多时候都是用来对.doc

而放眼如今的编程市场,API拦截技术大多时候都是用来对.doc

ID:29107039

大小:88.50 KB

页数:4页

时间:2018-12-16

而放眼如今的编程市场,API拦截技术大多时候都是用来对.doc_第1页
而放眼如今的编程市场,API拦截技术大多时候都是用来对.doc_第2页
而放眼如今的编程市场,API拦截技术大多时候都是用来对.doc_第3页
而放眼如今的编程市场,API拦截技术大多时候都是用来对.doc_第4页
资源描述:

《而放眼如今的编程市场,API拦截技术大多时候都是用来对.doc》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库

1、还记得吗?在第一期的随笔中,我详细讲述了怎样在Win9x下对系统API调用进行拦截。而放眼如今的编程市场,API拦截技术大多时候都是用来对各种GDI调用进行阻截以动态获取(像金山词霸等取词软件)或屏蔽某一窗口内的文字或图象(像一些网络过滤软件)。然而,若要拦截某个窗口的GDI调用,事先知道那个窗口进行输出时调用了哪些GDI函数当然是好事情,这样以便有的放矢去实现拦截。通常情况下,这个问题可以靠尝试解决,毕竟Windows下实现文字与图象输出的API也就那些。然而,利用编程去解决这个问题应该是编程爱

2、好者的习惯,所以,本期随笔就谈谈这个问题:怎样去了解某个窗口是调用什么GDI函数输出的文字与图象?当然,下面提出的方法并不是唯一的,但这样做却另有用意。在本篇最后,你会看到故事的逻辑是怎样再次回到API拦截上,于是,我还要用此处的实现方式进一步谈谈怎样在Windows2000中实现API的拦截。Windows2000已经流行了这么久,若不提及它也太不给面子,更何况API拦截在Windows2000与Windows9x中的实现存在很大差异。当然,怎样在Windows2000中对本篇涉及的API进行拦

3、截的具体分析将在下一期来完成。第一步构思要想知道某窗口内的图象与文字是利用什么GDI输出的,先来想想怎样获取某个窗口内的图象与文字,若能够将某窗口内的图象与文字写入某个位图中,那么同样的道理,也就可以将这些图象与文字保存在一个图元文件(Metafile)中。图元文件对图象的保存是与设备无关的,它的内部记录了程序怎样调用一系列GDI来输出这个图象,这样在保存了图象信息的同时也就实现了设备的无关。所以,此时若能够将待拦截窗口进行文字与图象输出的过程存于一个图元文件中,那么目标也就实现了。然而,怎样让非

4、本地进程所拥有的窗口将其客户区的内容写入本地进程所提供的一个位图环境句柄中呢?查看一下MSDN,你会发现标准的方式是向那个窗口发送一条WM_PRINTCLIENT消息并将位图环境句柄作为此消息的WPARAM参数传入。同样的,若要让这个窗口将其内容写入一个图元文件,差别仅在于将图元文件的环境句柄作为WM_PRINTCLIENT的WPARAM参数来调用SendMessage。不过这里要注意,我们实现的方式是让非本地进程所拥有的窗口将其内容写入到我们所提供的环境句柄中,但环境句柄在Windows系统中并

5、不像窗口句柄那样是系统级别的资源,环境句柄是进程依赖的。所以,此时我们必须利用系统级别的挂钩并在挂钩所属的动态链接库中去实现这个预想。第二步实现为了方便试验,现在让我将任务准确定义:当用鼠标左键双击某个窗口时,这个窗口就应该将其客户界面的内容写入一个图元文件中。下面,先来完成一些初始化工作。首先要实现一个系统级别的鼠标挂钩,这样点击事件发生时就可以直接获取鼠标下窗口的句柄,也就可以进一步向那个窗口发送WM_PRINTCLIENT消息。这样在SendMessage返回后,图元文件按理就应该保存了那个

6、窗口内容的输出过程。下面先来创建一个类用于挂钩的实现,既然是系统级别挂钩,这个类自然实现于动态链接库中:classCGDIdll{public:voidSetHook();//建立挂钩voidRemoveHook();//移除挂钩staticLRESULTCALLBACKHookProc(intnCode,WPARAMwParam,LPARAMlParam);//鼠标挂钩回调函数};按照任务的要求,现在要在HookProc中生成包含有窗口内容输出过程的图元文件,在鼠标左键双击事件到来时,HookP

7、roc对应的代码实现为:HENHMETAFILEhMeta;//图元文件句柄HWNDhWndFocus;//点击窗口HDChDCMeta;//图元文件环境句柄RECTrectClient;//窗口客户区if(wParam==WM_LBUTTONDBLCLK){//获取窗口hWndFocus=((PMOUSEHOOKSTRUCT)lParam)->hwnd;//获取窗口客户区范围GetClientRect(hWndFocus,&rectClient);//创建图元文件MyMeta.emfhDCMet

8、a=CreateEnhMetaFile(0,"c:\MyMeta.EMF",&rectClient,"XYZXYZ");//发送WM_PRINTCLIENT消息SendMessage(hWndFocus,WM_PRINTCLIENT,(WPARAM)hDCMeta,0);//清理hMeta=CloseEnhMetaFile(hDCMeta);DeleteEnhMetaFile(hMeta);}现在,再装上上述挂钩并打开Windows系统自带的NotePad,向其随意输

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。