IIA首页    新闻      案例      工业经理人
      产品         技术      专题      工程师社区
      学院         下载      视频      在线研讨会
现场层       传感器    现场仪表   工业安全
现场总线  工业以太网   工业无线  工业连接
机器视觉    测试测量   执行机构   电子元件
机器控制/过程控制     PLC    DCS
 控制系统  控制软件   HMI   运动控制
 嵌入式系统   工业机器人
优化/集成/管理
MES    PLM    工业数据中心
能效管理    设备管理与维护
可持续发展技术专题 2011汉诺威工业博览会回顾
 

问答

Q&A

vc/其他语言 HOOK/API /其他技术 如何捕捉XP系统弹出的MessageBox窗体。
悬赏分:50 - 解决时间:2007-10-29 10:26:47
vc/其他语言 HOOK/API /其他技术 如何捕捉XP系统弹出的MessageBox窗体。
想做一个.exe,它能监控并截获其他程序的MessageBox ,主要是程序抛异常时候的Messagebox。什么方法都可以。希望大家帮忙。
提问者:kingcuikai - 秀才 三级
最佳答案
要实现上述功能,需要API挂接技术。下面有2中方法: ★方法1、 1)、找到你想挂接的函数在内存中的地址(比如User32.dll中的MessageBox)。 2)、将该函数的头几个字节保存在你自己的内存中。 3)、用一个JUMP CPU指令改写该函数的头几个字节,该JUMP会转移到你的替换函数的内存地址。当然,你的替换函数的标记必须与你挂接的函数标记完全相同,即所有的参数和返回值必须一致,调用规则也必须一样。 4)、现在,当一个线程调用已经挂接的函数时,JUMP指令实际上将转移到你的替换函数,你就能干任何你想干的事情。 5)、取消挂接函数,方法是取出第二步保存的字节,将他们放回挂接函数的开头。 6)、调用挂接的函数(它已经不再被挂接),改函数将执行其通常的处理操作。 7)、当原始函数返回时,在此执行第二步和第三步,这样你的替换函数就可以被调用。 注意:这种方法在16位的Windows中使用的非常普遍,并且运行的很好。但是,它存在严重的不足,就是它对CPU依赖型特别大,在x86、Alpha、和其他CPU上的JUMP指令是不同的。另外,这种方法在抢占式多线程环境中根本不起作用。线程需要时间来改写函数开头的代码,但是,其他的线程也许正在试图调用同一个函数,结构将是灾难性的。 因此,建议搂主尽量不要使用这种方法。 ★方法2、 众所周知,模块的输入节包涵一组该模块运行时需要的DLL。另外,它还包涵该模块从每个DLL中输入的符号列表。当模块调用一个输入函数时,线程实际上要从模块的输入节中捕获需要的输入函数的地址,然后转移到该地址。 因此,挂接一个特定的函数,只需要改变模块的输入节的中地址。 这种方法是十分健壮的。 ★基于方法2的实现思路: 你可以定义一个这样的函数,具体的功能实现我不一一列出了,因为代码很长: void ReplaceIATEntryInOneMod(PCSTR pszCallModName, PROC pfnCurrent, PROC pfnNew, HMODULE hmodCaller); 它要做的第一件事情是找出hmodCaller模块的输入节,方法是调用ImageDirectoryEntryToData函数。 注:输入节中所有的字符必须是ANSI,决不能是UNICODE。 然后,扫描DLL模块的名字,找到与pszCallModeName相同名字的DLL模块。重复引用来自pszCallModeName中的所有输入符号,找到目标函数相匹配的地址,楼主需要的是“USER32.DLL”中的“MessageBoxW”或者“MessageBoxA”。 然后调用WriteProcessMemory来替换目标函数的地址。(注:之所以使用WriteProcessMemory而不使用InterlockedExchangePointer是因为无论页面保护属性是什么,即使是PAGE_READONLY也不会引发致命的访问违规) 另外,《Windwos核心编程中》有具体的挂接API例子。
回答者:要实现上述功能,需要API挂接技术。下面 -江湖新秀 四级 10-22 21:08:48
对最佳答案的评论:
评论字数200字以内

验证码: 看不清

 

搜企
首页 | 国际金属加工网 | 造车网 | 会员 | 主题信息 | 自动化问答 | 网站地图 | 免责声明 | 关于我们 | 主编信箱
北京市朝阳区东四环中路58号远洋国际中心C座2402室 电话: 010-65307950 传真: 010-65307859
Copyright ©1997-2012 IIA News.com & SooQ. All rights reserved.