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

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

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
\o 关于钩子程序和屏幕取词的一些资料 关于钩子程序和屏幕取词的一些资料 ?   屏幕抓词(或者叫动态翻译)是指随着鼠标的移动,软件能够随时获知屏幕上鼠标位置的单词或汉字,并翻译出来提示用户。它对於上网浏览、在线阅读外文文章等很有帮助作用,因此许多词典软件都提供了屏幕抓词功能。 ? ?   屏幕抓词的关键是如何获得鼠标位置的字符串,Windows的动态链接和消息响应机制为之提供了实现途径。 ? 概括地说,主要通过下面的几个步骤来取得屏幕上鼠标位置的字符串: ? ? 符串: ? ?   . ? 代码拦截:Windows以DLL方式提供系统服务,可以方便地获取Windows字符输出API的地址,修改其入口代码,拦截应用程序对它们的调用。 ? ?   . ? ? 鼠标HOOK:安装WH-MOUSEPROC类型的全局鼠标HOOK过程,监视鼠标在整个屏幕上的移动。 ? ?   . ? ? ? 屏幕刷新:使鼠标周围一块区域无效,并强制鼠标位置的窗口刷新屏幕输出。窗口过程响应WM-NCPAINT和WM-PAINT消息,调用 ExtTextOut/TextOut等字符输出API更新无效区域里面的字符串。这些调用被我们截获,从堆栈里取得窗口过程传给字符API的参数,如字 符串地址、长度、输出坐标、HDC、裁剪区等信息。 ? ? 2 Windows ? 95/98的字符输出方法 ? ?   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的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。 ? ?   因此,只要拦截四个16位函数:TextOut、ExtTextOut、TextOut16W和ExtTextOut16W,就能截获32位和16位应用程序的所有字符串输出。 ? ? 3 拦截字符输出API ? ? 3.1 代码拦截的基本思路 ? ?   为了实现对ExtTextOut/TextOut等API的拦截,需要在函数入口放入一条动态生成的JMP替代函数指令,JMP 的操作数是我们提供的一个拦截替代函数的地址。当该API被调用时,JMP指令首先执行,跳转到替代函数。替代函数负责从堆栈中获取参数,计算字符串坐 标,分出鼠标位置的单词等工作。执行完成后,替代函数再调用原来的被拦截函数,完成正常的字符输出,然后返回。 ? 图2表明了应用程序对TextOut的正常调用流程和TextOut被拦截后的流程。 ? ? a) ? ? ① ? 程序调用TextOut; ? ? ② ? 从TextOut返回程序。 ? ? ① ? 程序调用TextOut(其入口已经被修改); ? ? ② ? 转入拦截替代函数myTextOut; ? ? ③ ? 从myTextOut调用原来的TextOut; ? ? ④ ? 从TextOut返回myTextOut; ? ? ⑤ ? 从myTextOut返回程序。 ? ? 图2 对TextOut的正常调用流程 ? ? ? ?   和TextOut被拦截后的流程 ? ? 3.2 提供拦截替代函数 ?   拦截替代函数插入被拦截API的流程中执行,需要有相同的参数和返回值原型。以对  拦截替代函数插入被拦截API的流程中执行,需要有相同的参数和返回值原型。以对TextOut的拦截为例,下面是替代函数myTextOut的伪代码: ? ? BOOL ? myTextOut(HDC ? hdc,int ? x,int ? y,LPSTR ? lpstr,int ? cbstr) ? ? {

文档评论(0)

baoyue + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档