转自大富翁论坛!
---------------------
所谓拦截只能拦截消息,不能直接拦截Api。要想拦截API,首先需要你了解这个Api
的消息机制才行。如果这个Api函数不发送消息的话,你什么也拦截不到的,除非你
重新仿制一个DLL来替换原来的DLL。如果你有整个Dll的说明,仿制Dll并不是很难
实现的,多数的函数只需要调用原来的Dll,只需要把你要拦截的函数重新写一下就
行了API和消息不一样,所以拦截消息的方法不能用于拦截API。应该得到API入口地址,
将自己的一端代码写到那里,一旦调用这个API,就先执行自己的部分,然后恢复
执行原来的API。
至于怎么将代码写到API入口,这个在Win16里简单一些(记得是有未公开的Windows
函数可以将代码段(API入口)设置为数据段,然后在那里写一些东西),在Win32
里麻烦一些,大概是GetProcAddress得到API入口,用WriteProcessMemory写。
M$的detours是一个工具包,可以任意拦截Win32的函数。
它的作法是替换目标函数的前几条指令为一个无条件跳转,
转到用户提供的旁路函数(detour function),
目标函数保护在跳回函数(tramploline function)中,
跳回函数中包括目标函数的前几条指令和一个无条件跳转跳回原目标函数的后面的指令。
旁路函数还可以通过从跳回函数中调用原目标函数来替换和扩展目标函数的语义