- 1、本文档共18页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
《C++_Hook(钩子)编程》.pdf
C++ Hook(钩子)编程,通过内联汇编,使类成员函数代替全局函数(静态函数)
编程语言:C/C++
编译环境:Visual Studio 2008
核心方法::通过内联汇编,构造类对象独享的函数(委托),完成了类成员函数到普通全局函
数的转化,并在Windows Hook(钩子)编程中得到成功的实践。
关键字:C++,委托,内联汇编,Hook ,成员函数
引文:
前段时间曾编写了一个自认为很完善的.NET 平台上的 Hook(钩子)动态链接库(DLL),
并进一步完成了 GUI 界面,但是在部署时却发现的其局限性,很多用户都没有安装.NET 平
台,其平台的最小安装(.NET 2.0)也需要 21M ,如果使用NOMO(2.0)免安装发布的话也需要
小 10M(而且使用 NOMO 在自动运行和兼容性上也有待商榷) 。
因此,我下定决心,准备彻底和托管代码决裂,回归 C/C++,再次实现上述功能,然而
真正编写时才发现,经典的 C++果然不是盖的,昔日被 C 的各种调试不通过折磨的记忆还
未消退,今日又在开始时陷入苦战,正如前人所说,C++这种强类型语言,喜欢在繁琐的符
号和语法上做文章。如果处理不好这些,大概做不了大项目,还是去.NET 或 Java 的快乐平
台逍遥去吧~微微感慨,赶快进入正题。
正文:
本文的目的是研究类成员函数与普通函数之区别,以及不同调用方式之间的区别,进而
通过内联汇编语句模仿特定的调用,从而完成通过普通函数指针调用类成员函数的功能。因
此主要部分为研究和尝试的过程,如希望直接查看Hook 编程的结果,可直接查看尾部代码。
使用过 Windows Hook 编程的同志们都知道,在程序中是通过如下语句来加载钩子,卸
载钩子。
C/C++ Code:
HHOOK SetWindowsHookEx( //加载钩子
int idHook,
HOOKPROC lpfn, //钩子函数的指针
HINSTANCE hMod,
DWORD dwThreadId
);
BOOL UnhookWindowsHookEx( //卸载钩子
HHOOK hhk
);
其中最重要的就是 HOOKPROC lpfn这个函数指针,查看此函数的形式,为:
C/C++ Code:
LRESULT CALLBACK HookProcess( //钩子函数
int nCode,
WPARAM wParam,
LPARAM lParam
);
//其中 CALLBACK 的定义为 #define CALLBACK __stdcall
其中,值得注意的是,这个钩子函数需要是一个普通__stdcall 调用的 C 函数,而在 C++
中可以理解为某个全局函数 (非类成员函数,全局访问)或者是一个类的静态函数 (static,
全局访问)。
让我们再观察一个类成员函数和全局函数的区别,我建立了一个简单的演示代码,如下
代码:
C/C++ Code:
#include windows.h
LRESULT CALLBACK HookProcess1( // HookProcess1是一个全局函数
int nCode,
WPARAM wParam,
LPARAM lParam){ return NULL;}
class WinHook
{
public:
int value; //定义一个成员变量,以便于测试访问
LRESULT CALLBACK HookProcess2(// HookProcess2是一个类的成员函数
int nCode,
WPARAM wParam, LPARAM lParam) {
文档评论(0)