介绍:HOOK API是指截获特定进程或系统对某个API函数的调用,使得API的执行流程转向指定的代码。Windows下的应用程序都建立在API函数至上,所以截获API是一项相当有用的技术,它使得用户有机会干预其它应用程序的程序流程。
最常用的一种挂钩API的方法是改变目标进程中调用API函数的代码,使得它们对API的调用变为对用户自定义函数的调用。
HOOK API和HOOK技术完全不同。尽管它们都是钩子。HOOK钩的是消息,它在系统将消息传递给应用程序之前截获它,然后进行操作、或修改消息、或停止消息的传递;而HOOK API截获的是应用程序对系统API的调用,它在应用程序对系统API的调用之前截获此调用动作,让其转而调用我们所定义的函数(内容可能是进行一些操作后再调用原系统API)。
对windows API钩子感兴趣的人都知道有一个优秀的库被微软命名为' Detours '。它真的很有用,但是它的免费版本(Express)是不支持X64。它的收费版本(Professional)支持x64。HOOK API请参考 http://blog.csdn.net/super_chris/article/details/4327679
本文主要参考并改进了以下文章:http://blog.csdn.net/baggiowangyu/article/details/7675098
先下载EasyHook的开发库,当然有兴趣的同学可以下载源码进行学习。下载地址:http://easyhook.codeplex.com/releases/view/24401。我给的这个是2.6版本的。
EasyHook提供了两种模式的注入管理。一种是托管代码的注入,另一种是非托管代码的注入。我是学习C++的,所以直接学习了例子中的非托管项目UnmanagedHook。里面给了一个简单的挂钩MessageBeep API的示例,但是其远程注入的例子在执行过程中出错(我用的是VS2005)。我需要将其改造成支持远程注入的。
整个过程比较复杂我先把各个程序功能介绍一下:
1.三个程序。
qt_playSound.exe,目标程序,是我们要hook的程序示例,用qt编写的,主要调用了
PlaySound(TEXT("d:\\Ding.wav"), NULL, SND_FILENAME | SND_ASYNC /*| SND_LOOP*/ );
hookdll.dll,钩子所在,hook的代码及我们自己的 MyPlaySoundW(LPCWSTR pszSound, HMODULE hwnd,DWORD fdwSound)的实现
inject.exe远程注入程序,用来把hookdll.dll 注入到qt_playSound.exe进程中。
2.功能
qt_playSound.exe运行过程中调用PlaySoundW这个系统API,我们实现对这个API的hook,当PlaySoundW被调用时,先转到我们hookdll.dll中的MyPlaySoundW。
具体源码下载: http://download.csdn.net/detail/v6543210/8503153