网站导航免费论文 原创论文 论文搜索 原创论文 网学软件 学术大家 资料中心 会员中心 问题解答 原创论文 论文素材 设计下载 最新论文 下载排行 论文上传 在线投稿 联系我们
返回网学首页
网学联系
最新论文 推荐专题 热门论文 素材专题
当前位置: 网学 > 编程文档 > VC++ > 正文
鼠标屏幕取词技术的原理和实现
来源:Http://myeducs.cn 联系QQ:点击这里给我发消息 作者: 用户投稿 来源: 网络 发布时间: 12/10/15
下载{$ArticleTitle}原创论文样式
处。
系统将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访问该
dll中被引入的每个函数的信息,找到我们需要截获的函数的跳转地址,然后改
成我们自己的函数的地址……具体的做法在后面的关键代码中会有详细的讲解。
讲了这么多原理,现在让我们回到“鼠标屏幕取词”的专题上来。除了api函
数的截获,要实现“鼠标屏幕取词”,还需要做一些其它的工作,简单的说来,
可以把一个完整的取词过程归纳成以下几个步骤:
1. 安装鼠标钩子,通过钩子函数获得鼠标消息。
使用到的api函数:setwindowshookex
2. 得到鼠标的当前位置,向鼠标下的窗口发重画消息,让它调用系统函数重画
窗口。
使用到的api函数:windowfrompoint,screentoclient,invalidaterect
3. 截获对系统函数的调用,取得参数,也就是我们要取的词。
对于大多数的windows应用程序来说,如果要取词,我们需要截获的是
“gdi32.dll”中的“textouta”函数。
我们先仿照textouta函数写一个自己的mytextouta函数,如:
bool winapi mytextouta(hdc hdc, int nxstart, int nystart, lpcstr lpszstring,int cbstring)
{
// 这里进行输出lpszstring的处理
// 然后调用正版的textouta函数
}
把这个函数放在安装了钩子的动态连接库中,然后调用我们最后给出的
hookimportfunction函数来截获进程对textouta函数的调用,跳转到我们的
mytextouta函数,完成对输出字符串的捕捉。Hookimportfunction的用法:

hookfuncdesc hd;
proc porigfuns;
hd.szfunc="textouta";
hd.pproc=(proc)mytextouta;
hookimportfunction (afxgetinstancehandle(),"gdi32.dll",&hd,porigfuns);
下面给出了hookimportfunction的源代码,相信详尽的注释一定不会让您觉得理
解截获到底是怎么实现的很难,ok,let’s go:

///////////////////////////////////////////// begin ///////////////////////////////////////////////////////////////
#include <crtdbg.h>

// 这里定义了一个产生指针的宏
#define makeptr(cast, ptr, addvalue) (cast)((dword)(ptr)+(dword)(addvalue))

// 定义了hookfuncdesc结构,我们用这个结构作为参数传给hookimportfunction函数
typedef struct tag_hookfuncdesc
{
lpcstr szfunc; // the name of

  • 上一篇资讯: Visual C++ 编程技巧
  • 网学推荐

    免费论文

    原创论文

    浏览:
    设为首页 | 加入收藏 | 论文首页 | 论文专题 | 设计下载 | 网学软件 | 论文模板 | 论文资源 | 程序设计 | 关于网学 | 站内搜索 | 网学留言 | 友情链接 | 资料中心
    版权所有 QQ:3710167 邮箱:3710167@qq.com 网学网 [Myeducs.cn] 您电脑的分辨率是 像素
    Copyright 2008-2015 myeducs.Cn www.myeducs.Cn All Rights Reserved
    湘ICP备09003080号