鼠标屏幕取词技术的原理和实现
屏幕取词技术在抓逃工作中的应用
然 后 安 装 全 局 wH GE ME S — T S AGE 子 ,代 码 如 钩
下:
HI S A Ehn =L a Lbay“ o kdl: N T NC ls o d irr( o l H ” ) h o k S t n o Ho k xWH GE MБайду номын сангаас S H o = eWid ws o E ( — T S AGE ,
首 先定义 一个全 局共 享变量 h o k H o 并初 始化 ,用于 保存 钩子句柄 ,以便 以后检查钩 子是 否已经安装及 卸载
钩子等 。
# ag pr ma d t aa
—
输入 表中l 数组 的起始地: l D 吐。然后可 以遍历 l 数组 的所 I D 有项 并取 得其 N me 员 ,如果 某个 l 的N me 员指 a 成 i D a 成
在任何 模块 中隐式调 用的任何一 个动 态链接库 ,在
模 块 的输 入 表 ( 入 表结 构 如 图 1中都 有一 个 I GE 输 ) MA —
I OR MP T
_
DE CR P OR } 称 r 类 型的结构与 之对 应。 S IT ( ̄ i D)
输入表 中的I 结构数组保存 了程序隐式调 用的所 有的动 I D 态链接库信息。
Ge Me s g P o ,lsO : t s a e r ch n ,)
java屏幕取词的实现
java屏幕取词的实现
?? ? 我很早以前就在猜测金山词霸是怎么实现这种功
能的。开始我以为是金山词霸将鼠标下的文字图像剪裁出,然后使用图像模式识别出单词。但后来发现这个想法不太现实,不说图像识别的难度了,这样识别单词也会给系统带来巨大的开销。后来偶然发现金山词霸是取不到图像上的文字的,才认识到不是图像模式识别技术。再后来问过一个师兄,这个师兄说,这是因为金山词霸在系统中做了钩子,当应用程序使用系统提供的文字渲染类库时,渲染的文字就会通过回调钩子传给金山词霸,因此就获得了这个文本。于是才恍然大悟。???
???? 也就说如果某个应用程序恰好不是调用操作系统的文
本显示类库,那么金山词霸也是没有办法取到该应用程序上的文字。??? ??这个想法很快就在很多程序上得到验证。如firefox,它使用自己的渲染引擎。再如Adobe AcrobatReader,它渲染文本也是使用自己的字体渲染技术(后来金山词霸专门为Adobe AcrobatReader做了个插件)。再如OpenOffice,它的界面是使用Swing来渲染的,因此也没有办法取词。???OpenOffice这个例子引出了这样一个事实,所有的Swing应用程序都是无法使用金山词霸取词的。??? 偶然一次在JavaLobby看贴,看到有人问Java 6的Java 2D类库
是不是做了很大改动,因为他们做的Swing界面取词功能失效了。详细阅读才得知,他们是在Swing底层Java 2D的文本渲染管道添加侦听接口,也就是类似于金山词霸的钩子。但由于他们使用了Java 2D的内部实现接口,结果在Java 升级时,他们的程序就无法正常工作了。???
鼠标取词
鼠标取词原理初探
其实这是个老话题了,自从这项技术面世以来就已经被讨论了无数遍。事实上,这个看起来很牛逼的东西其实不是想象中的那么难,方法也有多种多样,而且,有了先前各位大牛的研究成果,实现这项技术变得相对容易很多。最主要的是,编写的过程中能让人学到很多知识。好了,话不多说,直接进入主题。
在Windows平台下,输出文字基本上都是靠TextOut,ExtTextOut这两个API实现。也有DrawText这样的函数,但最终也是调用了ExtTextOut(TextOut其实就是ExtTextOut的特殊版本)。在Windows 9x下是如此,Windows NT下也是,不过就是有了ANSI和Unicode两个版本的区别。若能截获这些API,转到自己的函数里,便能得到输出的字符串,实现取词功能。
______________________________________________________________
BOOL WINAPI MyExtTextOutA( HDC hdc, int x, int y, UINT options, CONST RECT * lprect, LPCSTR lpString, UINT c, CONST INT * lpDx)
{
// lpString便是所要的字符串(ANSI),在此进行处理
// 然后调用正版的API输出字符
return ::ExtTextOutA(hdc,x,y,options,lprect,lpString,c,lpDx);
}
看到这里,聪明的你肯定已经想到了,这不就是要实现一个API钩子么。确实是这样,鼠标取词的核心技术就是API钩子。事实上,有了API钩子,你可以干很多事情(比如拦截WinSock的sendto / recvfrom函数来实现数据包的截取等)。
鼠标屏幕取词技术的原理和实现
鼠标屏幕取词技术的原理和实现
鼠标屏幕取词技术的原理和实现
“鼠标屏幕取词”技术是在电子字典中得到广泛地应用的,如四通利方和金山词霸等软件,这个技术看似简单,其实在windows系统中实现却是非常复杂的,总的来说有两种实现方式:
第一种:采用截获对部分gdi的api调用来实现,如textout,textouta等。
第二种:对每个设备上下文(dc)做一分copy,并跟踪所有修改上下文(dc)的操作。
第二种方法更强大,但兼容性不好,而第一种方法使用的截获windowsapi的调用,这项技术的强大可能远远超出了您的想象,毫不夸张的说,利用windowsapi 拦截技术,你可以改造整个操作系统,事实上很多外挂式windows中文平台就是这么实现的~而这项技术也正是这篇文章的主题。
截windowsapi的调用,具体的说来也可以分为两种方法:
第一种方法通过直接改写winapi 在内存中的映像,嵌入汇编代码,使之被调用时跳转到指定的地址运行来截获;第二种方法则改写iat(import address table 输入地址表),重定向winapi函数的调用来实现对winapi的截获。
第一种方法的实现较为繁琐,而且在win95、98下面更有难度,这是因为虽然微软说win16的api只是为了兼容性才保留下来,程序员应该尽可能地调用32位的api,实际上根本就不是这样~win 9x内部的大部分32位api经过变换调用了同名的16位api,也就是说我们需要在拦截的函数中嵌入16位汇编代码~我们将要介绍的是第二种拦截方法,这种方法在win95、98和nt下面运行都
Windows操作系统中屏幕取词技术的研究
Wid w 操 作 系统 。 no s
实现 屏 幕 取 词 的 原 理
要 实现屏 幕 取词 首先 要 了解 在 Widw 操作 系统 的文本 是 如 何输 出 的 , 际上 Widw 系统 下 no s 实 no s 屏 幕上 不管具 体 是 哪个应 用 程 序 的文 本 输 出 , 最后 都 是 调 用 Widw 系 统 的动 态 库 G I2 d 中 的 nos D3 .l l TxO t TxO t E tetuA、 x etuW 等 几个 A I函数 实 现 的 。即 不 论 哪个 程 序 , etuA、etuW、 xTxO t Et xO t T P 只要输 出 文本都 会在程 序 模块 中导 人 动 态 库 G I2 dl并 最 终 利 用 上 述 几 个 函数 输 出 文本 。其 中 TxO t D3 . l , etuA 和 EtetuA用 于输 出 A S 字 符 ,etuW 和 E tetuW 用 于 输 出 uioe 符 。所 以实 现 鼠 xTxO t NI TxO t xTxO t ncd 字 标 屏幕 取词 的关 键就 是 如何 设 法在 Widw 字符输 出的时候 取得 这 几个 A I no s P 函数 的参数 。可 以通过 采用 A I O P HO K技术 实 现对 这几 个 A I P 函数 的挂接 , 输 出字符 的时候 截获 A I 在 P 函数 的参数 , 这些参 数 包括 输 出的文 本 的字 符 串 以及及 其输 出的位置 坐标信 息 。 根 据 Widw 系统 的工 作原 理 , nos 当窗体全 部或 部分 需要 刷新 时 ,etuA等 A I TxO t P 就会 被调 用重新 输 出 j比如 一个 窗体 盖住 了另 一个 窗 体 , , 当上 面 窗体 移 开后 下 面 的 窗体 会 收 到 系统 的 WM— A N P IT 消息 而刷 新 ,etuA 等被 调用 绘制 文 字部分 , 起来 就像 真是 露 出 了原来 被挡 住 的部 分 。因此必 须 TxO t 看 设 法在 需要 的时候 让有关 窗体 的有关 区域刷 新 , 体 做法 就 是在 鼠标 所 在 位 置 画 一个 小 窗 体挡 住 下 具 面 的窗 体一 下 ( 眼看不 出来 ) 下面 的窗体被 挡 住 的字 符就 会重 绘 ,另 外一 种 方法 是调 用 Ivl a— 肉 , ( nade i rc 和 U dd idw 函数强 制 区域 刷新 ) et paawno 那几 个 已经被 挂接 的 A I 会 被调 用 了 , P就 于是 在 挂 接 的钩 子 函数 中可 以获 得其 参 数 , 通过 计算 鼠标 位 置 和输 出文 本 位置就 得 到 了 鼠标 下 的文 字 了 。
鼠标工作原理的应用是什么
鼠标工作原理的应用是什么
鼠标的工作原理及其应用可以概括为:
一、鼠标工作原理
1. 机械原理
鼠标底部的球体接触面移动,带动轴承滚轮旋转,经编码器将旋转信号转换为电信号。
2. 光电原理
LED光源和光电传感器检测球体运动方向,转换为相应的电信号。
3. 传感原理
内置的机械开关和传感器检测鼠标按键动作,转换并输出不同电信号。
二、鼠标工作原理在计算机应用
1. 指针控制
鼠标移动带动指针位置改变,实现屏幕上的定位。
2. 选择执行
点击或双击相应区域,实现对目标的选择或指令执行。
3.窗口操作
拖动或缩放窗口区域,实现不同窗口的打开或调整大小。
4. 菜单控制
点击菜单实现下拉,选择并激活菜单中的功能。
5. 参数调节
通过拖动滚轮或滑块实现参数值的调节。
6. 绘制编辑
结合键盘,进行图像、文档的编辑处理。
7. 游戏控制
通过鼠标移动、点击实现对游戏角色或场景的控制。
8. 多媒体控制
控制播放进度、音量大小等。
三、鼠标工作原理在其他应用
1. 工业测试
通过精确定位实现对测试点的选择执行。
2. 医疗训练
模拟手术过程中对器械或组织的操控。
3. 展览互动
结合多媒体内容,实现更生动的展览体验。
4. 焊接操作
通过鼠标代替手操作,实现远程焊接作业。
5. 机械控制
转换为相关指令,实现机械设备的旋转、抓取等控制。
综上所述,鼠标的工作原理广泛应用于计算机的人机交互,也可扩展应用于工业测试、医疗、展览等领域,为用户提供更简单直观的控制体验。
鼠标取词
鼠标取词
在有些软件里当鼠标移到某单词上,其注释就会显示单词的中文解释.这样的软件是如何制作的呢?下面我就介绍以下获取鼠标所在单词的方法,至于中文结实要关系到数据库及字库问题在此我不做解释.
首先建立新工程,在FORM上添加一个TEXT文本框.
声明SendMessage函数.
Declare Function SendMessage Lib "user32 " Alias "SendMessageA " (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Const EM_CHARFORMPOS=&HD7 '在API浏览器里无此值请自己加上.
自定义过程:
Private Sub Text1_MouseDown(Button As Intege,Shift As Integer,x As Single , y As Single)
'获取鼠标所点的是第几行第几个字符
Dim pos As Long,Lc As Long
Dim Line As Integer,CharPos As Integer
x=x/Screen.TwipsPerPixelX
y=y/Screen.TwipsperPixelY
pos=x+y*65536
Lc=SendMessage(Text1.hwnd,EM_CHARFROMPOS,0,ByVal pos)
Line=Lc\65536 '第几行
CharPos=Lc MOD 65536 '第几个字符
光标阅读机的工作原理
光标阅读机的工作原理是通过机器光电头对信息的识别来录入有关信息自动判断正误把填涂的有效信息收录到计算机,通过阅读机专用软件对信息进行分析,从而得到有效的数据。识别答题卡机通常称为“光标阅读机”。
光标阅读机一种简单的光学字符识别(OCR)技术。
光标阅读机只对黑色敏感,答题卡上红色绿色的部分光标阅读机是认不出来的。答题卡上原本印有黑色的条块,来帮助光标阅读机确认答题卡的方向与位置,铅笔在答题卡上的填涂的黑块和印好的黑块共同组成了一个只有黑与白的图像。其原理与二进制"0""1"近似,光标阅读机扫描后与预先存储的答案生成的图像进行比较,相符的部分就是得分,不符的就是错误。
其实现在的家用扫描仪也能做到这些而且能做得更好比如将报纸上的文章扫描进电脑形成真正的文字编码当然准确率就没有光标阅读机那种只有"错与对"的识别准确率高了。
鼠标取词翻译
鼠标取词翻译
【原创实用版】
目录
1.鼠标取词翻译的定义和作用
2.鼠标取词翻译的操作方法
3.鼠标取词翻译的优缺点
4.鼠标取词翻译的应用场景
5.未来发展趋势和展望
正文
在当今全球化时代,语言交流成为了人们日常工作、学习和生活中不可或缺的一部分。为了更好地促进不同语言之间的沟通,翻译工具应运而生。其中,鼠标取词翻译作为一种实用便捷的翻译方式,逐渐受到用户的青睐。本文将对鼠标取词翻译的定义、操作方法、优缺点、应用场景以及未来发展趋势进行详细介绍。
一、鼠标取词翻译的定义和作用
鼠标取词翻译是指用户在阅读一篇文章或文档时,只需用鼠标点击所要翻译的词汇,翻译工具即可快速将该词汇翻译成其他语言。这种翻译方式有效地解决了用户在阅读过程中遇到的生词、难词等问题,提高了阅读效率。
二、鼠标取词翻译的操作方法
鼠标取词翻译的操作方法非常简单。首先,用户需要在电脑上安装一款鼠标取词翻译插件或者浏览器扩展。安装完成后,用户在阅读文档时,只需将鼠标悬停在需要翻译的词汇上,插件或扩展就会自动识别并翻译该词汇。部分翻译插件还可以实现整句翻译、语音翻译等功能,满足用户多样化的需求。
三、鼠标取词翻译的优缺点
鼠标取词翻译具有操作简便、实时翻译、准确性高等优点。然而,它也存在一些不足之处。首先,由于不同翻译工具的词库和算法不同,翻译结果可能存在差异。其次,鼠标取词翻译无法翻译句子结构和语境,对于一些复杂的语句,翻译效果可能不尽如人意。
四、鼠标取词翻译的应用场景
鼠标取词翻译广泛应用于学术研究、商务交流、跨语言教育等领域。特别是在涉及多语言的学术论文阅读、国际贸易合同签订等场景中,鼠标取词翻译能够为用户提供极大的便利。
屏幕取词原理与实现
双击选中单词 原理
"双击选中单词"是计算机用户界面中的一个常见功能,它允许用户通过快速连续的双击来选中屏幕上的一个单词。这个功能的原理基于以下几个方面:
1. 鼠标或触摸板输入:
当用户第一次点击鼠标或触摸板时,计算机理解为此用户想选择单词的一部分。第二次点击发生在第一次点击之后不久,且位置大致相同,计算机将其解释为用户想要选中整个单词。
2. 点击间隔时间:
双击通常要求两次点击之间有一定的时间间隔,以确保用户不是偶然的双击。这个时间间隔是程序预设的,如果两次点击太快,计算机可能只会将其识别为一次单击。
3. 点击位置的检测:
计算机还会检测两次点击的位置是否接近,如果是,则认为是选中单词的行为;如果位置相差较大,则可能不会被识别为双击选中单词。
4. 操作系统和应用软件的协同工作:
操作系统和应用软件共同定义了双击选中单词的行为和规则。例如,在文本编辑器中,双击选中单词是一个系统级的或应用程序级的特性。
5. 用户界面规范:
不同操作系统和应用程序可能会有不同的双击行为,但是通常都遵循一定的用户界面规范,以保持用户的操作习惯和一致性。
实现双击选中单词的功能,需要在操作系统或应用程序的编程接口中实现相应的监听器和事件处理逻辑。在不同的编程环境中,这可能涉及到不同的编程语言和框架。例如,在Windows操作系统中,可以使用Windows API来检测鼠标事件并实现双击选中单词的功能。
电子鼠标工作原理
电子鼠标工作原理
电子鼠标是一种常见的输入设备,广泛应用于个人电脑、笔记本电脑等设备中,为用户提供便捷的操作方式。本文将介绍电子鼠标的工作原理,并阐述其背后的技术原理与实现方式。
一、光电传感技术
电子鼠标的工作原理主要基于光电传感技术。电子鼠标底部装有一个光电传感器,它通过对周围环境中可见光的感知,实现对鼠标移动的追踪与定位。一般而言,光电传感器采用光电二极管及其配套电路实现。
光电二极管通过发射与接收光信号的功能,实现对鼠标下方表面的扫描。当鼠标移动时,光电二极管感应到鼠标底面所反射出的红色光线,并将其转化为电信号传送给鼠标的主控芯片。通过计算光信号的变化,主控芯片能够判断鼠标的移动轨迹和速度。
二、运动检测与信号处理
鼠标底部通常设有一个或多个滚轮和一个光学传感器。当用户将鼠标在平面上移动时,滚轮和传感器将捕捉到鼠标的运动信息,并将其转化为电信号,传送至主控芯片进行处理。
滚轮通常用于实现鼠标的上下滚动功能。它通过感应用户的手指滚动动作,将相应的旋转运动转化为电信号。主控芯片通过解读这一信号,实现对滚轮的控制,并在屏幕上实现滚动操作。
光学传感器则用于追踪鼠标的具体位置和速度。传感器通过感知鼠标底面的红色光线反射情况,将其转化为电信号传送给主控芯片。主控芯片通过计算光信号的变化来确定鼠标的移动轨迹和速度,并将相应的指令传给计算机系统。
三、指针控制与功能增强
主控芯片根据光电传感器和其他硬件组件提供的信息,实现对光标的控制。它会根据用户的鼠标移动操作,将光标在屏幕上的位置相应调整。用户通过鼠标的移动和点击操作,可以方便地在计算机系统中进行选择、拖拽、拉伸等相关操作。
屏幕抓词原理及其实现方法
第26卷 第4期
2008年12月 贵 州 科 学
GU IZHO U SC IENC E Vol
.26,No .4Dec .2008
收稿日期作者简介冀肖榆(%),男,5级研究生李丹宁,贵州科学院副院长,硕士生导师屏幕抓词原理及其实现方法
冀肖榆1,赵廷义2,李丹宁2
(1.贵州大学 电子技术与信息技术学院,贵州 贵阳 550025;2.贵州科学院,贵州 贵阳 550001)
摘 要 本文介绍了W indo ws 2000/XP 下屏幕抓词的原理,对其如何获得鼠标位置的字符串,从代码拦
截、鼠标HOOK 、屏幕刷新等方面进行了讨论.最后分析了通过本方法取词的局限性.
关键词:屏幕取词;Hook;代码拦截
中图分类号 TP391.1 文献标识码 A 文章编号 1003-6563(2008)04-0045-04
THE P R INC IPL E AN D I M PL E M ENTAT I O N O F GRASP ING
WO RDS
JI Xiao -yu 1,ZHAO Ting -yi 2,L I D an -ning 2
(1.College of Electroni c Sc ience and Infor m ati on T echn ology,Guizhou U nive rsity,Guiyang 550025;2.Guizhou
Academy of Sc iences,G uiyang 50001)
ABSTRAC T This article intr oduced the princ i p l e of gras p ing words in W indo ws 2000/XP 1W e discussed the
屏幕取词翻译
屏幕取词翻译
随着互联网的发展,世界各地的人们日益依赖于网络的交流,而不同的语言正是网络交流过程中常见的障碍。受到这些障碍的限制,很多人选择使用机器翻译,帮助他们浏览大量外文内容,以帮助他们更好地理解内容。而屏幕取词翻译技术就是其中最值得关注的之一。
屏幕取词翻译就是将屏幕上某一字或一句话拿出来,然后将其翻译成目标语言,从而使人们可以更好地理解所阅读的内容。屏幕取词翻译技术广泛应用于浏览器、搜索引擎、电子书、视频等场景,可以大大提高人们的阅读体验,减轻他们由于语言障碍带来的理解困难。
屏幕取词翻译技术的实现原理主要分为以下几个步骤:
首先,程序会自动获取屏幕上某一字或一句话,并将其发送到服务器。
接着,服务器会通过智能语言处理引擎,将源语言转换为目标语言。
最后,处理完毕的目标语言将会被发送到客户端,然后客户端就可以通过屏幕取词翻译技术将其显示出来。
当前,屏幕取词翻译技术的发展比较迅速。百度翻译、腾讯翻译、有道翻译等都推出了屏幕取词翻译功能,使用上也比较方便,而且翻译结果也不错。从而使得更多的人可以利用它们浏览大量外文内容,提高自己的阅读体验。
同时,屏幕取词翻译技术还有一些不足之处,比如翻译准确性不够、翻译效率低等。不过,随着语言识别、自然语言处理技术的发展,
屏幕取词翻译技术也会越来越完善,从而帮助更多的人理解外语内容。
总的来说,屏幕取词翻译技术给大家带来了极大方便,帮助我们解决了语言障碍带来的困扰,让我们可以更好地欣赏外语文化。
提词器原理分析与技术实现
播音提词器的原理分析和技术实现
1.提词器应用概述
我开发的一个产品想实现很多显示设备的同屏显示效果,查阅资料的时候发现播音提词器也是其应用之一,那就顺便一起研究了吧。笔者很长时间没有开发程序了,错误的地方请广大码友多多批评指正。
电视提词器是常用于电视播音、采访工作中的专用设备。其使用场景是播音员在播音的时候,需要正视前方,流畅说出待播内容。由于播音具有不确定性,播音员很难准确记住整片文件,因此需要借助外部协助。
外部协助包括语音导播和图像导播:语音导播是指导播人员在幕后手持文稿阅读,声音传输到播音员所用的耳机,播音员根据导读声音播出。图像导播:是指在播音员前方防止较大屏幕的显示屏,用于显示待播文稿,文稿调整显示内容,播音员阅读内容。
语音导播和图像导播各有弊端,语音导播受人为影响较大,例如导播要控制播音进度,并且导播的时候不能出现意外状况(打喷嚏、注意力不集中等),图像导播往往需要借助多种设备,成本较高。高质量图形设备层出不穷,为了确保播出质量,图形提词器应用越来越广泛。
因此导播系统虽然看似简单,但是如果要实现高质量的导播效果,需要精心设计。本文主要讨论图像方式的导播,通过需求和技术分析,提供新技术广泛应用下的最优解决思路。
2.图像提词器发展情况
图像提词器发展经历了三个阶段:模拟信号提词器、计算机信号提词器和网络提词器。
2.1模拟信号提词器
模拟信号提词器是最早的图像提词器技术,其原理是播音员前方放置待播纸质文稿,文稿正上方置摄像仪器,仪器所拍信号通过线路传输到播音员正前方约5米的显示屏,显示屏所显示的为镜像图像,需要经过一个45°的反光玻璃纠正,从而看到正像,播音员阅读正像图片播出。其示意图如下:
无需词典 WORD2010也能屏幕取词翻译
当你用Word在处理文档的过程中遇到了不认识的英文单词时,大概首先会想到使用电子词典,但是不巧电脑中又没有装。其实Word中就自带了不错的文档翻译功能,而在最新的Word 2010中,除了以往的文档翻译、选词翻译和英语助手之外,还加入了一个翻译屏幕提示的功能,可以像电子词典一样进行屏幕取词翻译。
使用Word 2010打开一篇带有英文的文档,切换到审阅选项卡,单击翻译,选择下拉菜单中的翻译屏幕提示。
现在只要将鼠标指向一个单词或一个选定的短语,就会弹出一个浮动窗口显示翻译结果,不过此时这个窗口是半透明效果的,很难看清上面的文字。小编猜测这应该是为了避免鼠标在文档中划过时会不断弹出翻译窗口影响阅读而设计的,因此想要看清窗口中的字,只要将鼠标移动到浮动窗口上就可以了。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
鼠标屏幕取词技术的原理和实现
鼠标屏幕取词技术的原理和实现
“鼠标屏幕取词”技术是在电子字典中得到广泛地应用的,如四通利方和金山词霸等软件,这个技术看似简单,其实在windows系统中实现却是非常复杂的,总的来说有两种实现方式:
第一种:采用截获对部分gdi的api调用来实现,如textout,textouta等。
第二种:对每个设备上下文(dc)做一分copy,并跟踪所有修改上下文(dc)的操作。
第二种方法更强大,但兼容性不好,而第一种方法使用的截获windowsapi的调用,这项技术的强大可能远远超出了您的想象,毫不夸张的说,利用windowsapi 拦截技术,你可以改造整个操作系统,事实上很多外挂式windows中文平台就是这么实现的~而这项技术也正是这篇文章的主题。
截windowsapi的调用,具体的说来也可以分为两种方法:
第一种方法通过直接改写winapi 在内存中的映像,嵌入汇编代码,使之被调用时跳转到指定的地址运行来截获;第二种方法则改写iat(import address table 输入地址表),重定向winapi函数的调用来实现对winapi的截获。
第一种方法的实现较为繁琐,而且在win95、98下面更有难度,这是因为虽然微软说win16的api只是为了兼容性才保留下来,程序员应该尽可能地调用32位的api,实际上根本就不是这样~win 9x内部的大部分32位api经过变换调用了同名的16位api,也就是说我们需要在拦截的函数中嵌入16位汇编代码~我们将要介绍的是第二种拦截方法,这种方法在win95、98和nt下面运行都
比较稳定,兼容性较好。由于需要用到关于windows虚拟内存的管理、打破进程边界墙、向应用程序的进程空间中注入代码、pe(portable executable)文件格式和
iat(输入地址表)等较底层的知识,所以我们先对涉及到的这些知识大概地做一个介绍,最后会给出拦截部分的关键代码。
先说windows虚拟内存的管理。windows9x给每一个进程分配了4gb的地址空间,对于nt来说,这个数字是2gb,系统保留了2gb到 4gb之间的地址空间禁止进程访问,而在win9x中,2gb到4gb这部分虚拟地址空间实际上是由所有的
win32进程所共享的,这部分地址空间加载了共享win32 dll、内存映射文件和vxd、内存管理器和文件系统码,win9x中这部分对于每一个进程都是可见的,这也是win9x操作系统不够健壮的原因。win9x中为16位操作系统保留了0到4mb 的地址空间,而在4mb到2gb之间也就是win32进程私有的地址空间,由于每个进程的地址空间都是相对独立的,也就是说,如果程序想截获其它进程中的api调用,就必须打破进程边界墙,向其它的进程中注入截获api调用的代码,这项工作我们交给钩子函数(setwindowshookex)来完成,关于如何创建一个包含系统钩子的动态链接库,《电脑高手杂志》在第,期已经有过专题介绍了,这里就不赘述了。所有系统钩子的函数必须要在动态库里,这样的话,当进程隐式或显式调用一个动态库里的函数时,系统会把这个动态库映射到这个进程的虚拟地址空间里,这使得dll成为进程的一部分,以这个进程的身份执行,使用这个进程的堆栈,也就是说动态链接库中的代码被钩子函数注入了其它gui进程的地址空间(非gui进程,钩子函数就无能为力了),
当包含钩子的dll注入其它进程后,就可以取得映射到这个进程虚拟内存里的各个模块(exe和dll)的基地址,如:
hmodule hmodule=getmodulehandle(“mypro.exe”);
在mfc程序中,我们可以用afxgetinstancehandle()函数来得到模块的基地址。exe和dll被映射到虚拟内存空间的什么地方是由它们的基地址决定的。它们的基地址是在链接时由链接器决定的。当你新建一个win32工程时,vc,,链接器
使用缺省的基地址0x00400000。可以通过链接器的base选项改变模块的基地址。exe通常被映射到虚拟内存的0x00400000处,dll也随之有不同的基地址,通常被映射到不同进程
的相同的虚拟地址空间处。
系统将exe和dll原封不动映射到虚拟内存空间中,它们在内存中的结构与磁盘上的静态文件结构是一样的。即pe (portable executable) 文件格式。我们得到了进程模块的基地址以后,就可以根据pe文件的格式穷举这个模块的
image_import_descriptor数组,看看进程空间中是否引入了我们需要截获的函数所
在的动态链接库,比如需要截获“textouta”,就必须检查“gdi32.dll”是否被引入了。说到这里,我们有必要介绍一下pe文件的格式,如右图,这是pe文件格式的大致框图,最前面是文件头,我们不必理会,从pe file optional header后面开始,就是文件中各个段的说明,说明后面才是真正的段数据,而实际上我们关心的只有一个段,那就是“.idata”段,这个段中包含了所有的引入函数信息,还有iat(import address table)的rva(relative virtual address)地址。
说到这里,截获windowsapi的整个原理就要真相大白了。实际上所有进程对给定的api函数的调用总是通过pe文件的一个地方来转移的,这就是一个该模块(可以是exe或dll)的“.idata”段中的iat输入地址表(import address table)。在那里有所有本模块调用的其它dll的函数名及地址。对其它dll的函数调用实际上只是跳转到输入地址表,由输入地址表再跳转到dll真正的函数入口。
具体来说,我们将通过image_import_descriptor数组来访问“.idata”段中引入的dll的信息,然后通过image_thunk_data数组来针对一个被引入的dll访