Api Hook, Hook Api that you want to Hook

23 篇文章 0 订阅

 如果你想截取某个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

到此,基本上已经明白原理了,就这样吧,巩固一下自己的记忆。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值