关于钩子程序和屏幕取词的一些资料.doc

关于钩子程序和屏幕取词的一些资料.doc

ID:48593298

大小:132.00 KB

页数:31页

时间:2020-01-28

关于钩子程序和屏幕取词的一些资料.doc_第1页
关于钩子程序和屏幕取词的一些资料.doc_第2页
关于钩子程序和屏幕取词的一些资料.doc_第3页
关于钩子程序和屏幕取词的一些资料.doc_第4页
关于钩子程序和屏幕取词的一些资料.doc_第5页
资源描述:

《关于钩子程序和屏幕取词的一些资料.doc》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、关于钩子程序和屏幕取词的一些资料   屏幕抓词(或者叫动态翻译)是指随着鼠标的移动,软件能够随时获知屏幕上鼠标位置的单词或汉字,并翻译出来提示用户。它对於上网浏览、在线阅读外文文章等很有帮助作用,因此许多词典软件都提供了屏幕抓词功能。    屏幕抓词的关键是如何获得鼠标位置的字符串,Windows的动态链接和消息响应机制为之提供了实现途径。 概括地说,主要通过下面的几个步骤来取得屏幕上鼠标位置的字符串:  符串:    . 代码拦截:Windows以DLL方式提供系统服务,可以方便地获取Windows字符输出API的地址,修

2、改其入口代码,拦截应用程序对它们的调用。    .  鼠标HOOK:安装WH-MOUSEPROC类型的全局鼠标HOOK过程,监视鼠标在整个屏幕上的移动。    .   屏幕刷新:使鼠标周围一块区域无效,并强制鼠标位置的窗口刷新屏幕输出。窗口过程响应WM-NCPAINT和WM-PAINT消息,调用ExtTextOut/TextOut等字符输出API更新无效区域里面的字符串。这些调用被我们截获,从堆栈里取得窗口过程传给字符API的参数,如字符串地址、长度、输出坐标、HDC、裁剪区等信息。  2 Windows 95/98的字符输

3、出方法    Windows95/98不是一个纯32位的操作系统,它从16位操作系统发展而来,为了保持兼容,其内部仍然是32位和16位代码的混合体。系统通过gdi.exe 、user.exe和krnl386.exe提供16位API,供16位程序调用;通过gdi32.dll、user32.dll和kernel32.dll提归结如下:  图1 Windows 95/98的字符输出机制    .  16位程序通过16位gdi.exe的ExtTextOut/TextOut函数输出字符;    .  32位程序通过gdi32.dll的

4、ExtTextOutA/TextOutA输出ANSI格式的字符,通过ExtTextOutW/TextOutW输出UNICODE格式的字符;    .  32位的ExtTextOutA/TextOutA转换到16位的ExtTextOut/TextOut,完成ANSI格式字符的输出;    .  32位的ExtTextOutW/TextOutW转换到16位gdi.exe的两个未公开API,完成UNICODE格式字符的输出。为方便叙述,本文对这两个未公开API称为ExtTextOut16W和TextOut16W。  t16W。  

5、  因此,只要拦截四个16位函数:TextOut、ExtTextOut、TextOut16W和ExtTextOut16W,就能截获32位和16位应用程序的所有字符串输出。  3 拦截字符输出API  3.1 代码拦截的基本思路    为了实现对ExtTextOut/TextOut等API的拦截,需要在函数入口放入一条动态生成的"JMP<替代函数>"指令,JMP的操作数是我们提供的一个拦截替代函数的地址。当该API被调用时,JMP指令首先执行,跳转到替代函数。替代函数负责从堆栈中获取参数,计算字符串坐标,分出鼠标位置的单词等工

6、作。执行完成后,替代函数再调用原来的被拦截函数,完成正常的字符输出,然后返回。 图2表明了应用程序对TextOut的正常调用流程和TextOut被拦截后的流程。  a)  ① 程序调用TextOut;  ② 从TextOut返回程序。  ① 程序调用TextOut(其入口已经被修改);  ② 转入拦截替代函数myTextOut;  ③ 从myTextOut调用原来的TextOut;  ④ 从TextOut返回myTextOut;  ⑤ 从myTextOut返回程序。  图2 对TextOut的正常调用流程      和Tex

7、tOut被拦截后的流程  3.2 提供拦截替代函数   拦截替代函数插入被拦截API的流程中执行,需要有相同的参数和返回值原型。以对  拦截替代函数插入被拦截API的流程中执行,需要有相同的参数和返回值原型。以对TextOut的拦截为例,下面是替代函数myTextOut的伪代码:  BOOL myTextOut(HDC hdc,int x,int y,LPSTR lpstr,int cbstr)  {  DoSpy(hDC,x ,y,lpstr,cbstr);  //保存参数,作抓词的所有工作  RestoreCode();

8、//恢复TextOut入口原来的指令  TextOut(hDC,x,y,lpstr,cbstr);//调用原来的API  SpyCode();//再次放入JMP指令  return TRUE;  }    函数首先调用DoSpy()来作抓词的具体工作,然后RestoreCode()函数恢复

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

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

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