如果你想截取某个Api的执行,那么你可以选用微软提供的一个库:Detours;如果要下载请链接:http://research.microsoft.com/en-us/projects/detours/
网上提供了很多源码,都是关于怎么使用这个库的,但是今天我把它下载下来,不管三七二十一,看着网上提供的范例,照着写了一个。一运行出现:stack flow(很明显是递归调用);哎呀,极度郁闷,于是开始仔细查看这个库的工作原理。为了说明它,先上一段源码:
int WINAPI Add()
{
return 10;//纯粹测试,无任何用途
}
static int (WINAPI* pAdd)() = Add;
int WINAPI add()
{
return pAdd();
}
int _tmain(int argc, _TCHAR* argv[])
{
DetourTransactionBegin();
DetourUpdateThread(GetCurrentThread());
DetourAttach(&(PVOID&)pAdd, add);
DetourTransactionCommit();
TimedSleep(1000);
Add();
DetourTransactionBegin();
DetourUpdateThread(GetCurrentThread());
DetourDetach(&(PVOID&)pAdd, add);
DetourTransactionCommit();
}
刚开始我并不知道原理,我把add函数中的pAdd写为Add;然后出现栈溢出。我还很自以为自己很正确。其实不然,是由于自己没有搞懂程序的原理。
下面是一个原理图:
//come from web
上面那个就不用说了,直接说下面的:
当执行Add(source Function)时候,由于Add函数的前五个字节被修改成jmp addr()(DetourAttach的功效);所以直接跳转到add(Detour function),如果你想执行自己的函数,那么可以使用pAdd这个函数。在这里详细介绍一下这三个东西:Add ,add,pAdd
当执行DetourAttach的时候,Add的前五个字节被修改,指向add,但是pAdd此时却是拥有与Add相同的功效。下面上图:
//come from web
到此,基本上已经明白原理了,就这样吧,巩固一下自己的记忆。