标签:
HOOK api以前的做法是修改PE文件输入表,使其加载自定义的DLL去挂载对应的HOOK。
具体实现方式是在调用原API函数前,将其前8个字节修改为跳转到自己定义的函数地址,执行完函数,又将原API前8个字节恢复,再调用原API,到达对API劫持的功能。
在每次调用过程中,先修改前8字节,跳转到自定义函数,执行完再改回前8字节,执行原API,一次调用,多次修改。
而Dotours则是微软开发的一个函数库,专门用于捕获系统API。在使用之前,必须做以下相关准备工作:
1、下载dotours,下载地址http://research.microsoft.com/en-us/projects/detours/
2、安装dotours,一直NEXT
3、生成Dotours库,
在安装后的文件夹下找不到直接可以拿来用的LIB文件,但是却有SRC文件(在**\Microsoft Research\Detours Express 2.1\src下)。该文件夹下还有Makefile,可以直接用来生成库。将Detours路径下的SCR文件夹拷贝到**\Microsoft Visual Studio 9.0\VC路径下,注意是整个文件夹(其它版本VC自己照着复制)在system32目录找到cmd右键以管理员身份运行,切换至 c:\Program Files\Microsoft Visual Studio 9.0\VC\bin目录运行vcvars32.bat,切换到\Microsoft Visual Studio9.0\VC\SRC,然后输入..\bin\nmake指令,编译成功后在\Microsoft Visual Studio9.0\VC\Lib文件下就能找到detoured.lib与detours.lib文件了。
Detours库可以拦截任意的API调用,拦截代码是在动态运行时加载的。Detours替换目标API最前面的几条指令,使其无条件的跳转到用户提供的拦截函数。被替换的API函数的前几条指令被保存到trampoline 函数(就是内存中一个数据结构)中. trampoline保存了被替换的目标API的前几条指令和一个无条件转移,转移到目标API余下的指令。
当执行到目标API时,直接跳到用户提供的拦截函数中执行,这时拦截函数就可以执行自己的代码了。当然拦截函数可以直接返回,也可以调用trampoline函数,trampoline函数将调用被拦截的目标API,目标API调用结束后又会放回到拦截函数。下图就是Detours API拦截的逻辑流程:
关键代码如下:
安装Hook:
DetourTransactionBegin();
DetourUpdateThread(GetCurrentThread());
DetourAttach( &(PVOID &)Real_Api, My_Api );
......
DetourTransactionCommit();
卸载Hook:
DetourTransactionBegin();
DetourUpdateThread( GetCurrentThread() );
DetourDetach( &(PVOID &)Real_Api, My_Api );
......
DetourTransactionCommit();
其中Real_Api,为原API在内存地址,My_Api为自定义函数。
标签:
原文地址:http://www.cnblogs.com/debug8/p/4400986.html