2011-09-27 68 views
1

我有一个DLL文件library.dll其中包含一个函数foo。函数foo调用WinAPI函数goo。我写了一个应用程序,它调用foo from library.dll。问题是我想覆盖呼吁goo函数由我自己的函数hoo我在应用程序中声明(不在DLL中)。挂钩WinAPI函数调用DLL

我该如何挂钩电话goo函数?我不是在寻找一个全局钩子,我只是想覆盖由我写的应用程序所做的调用。

+6

我得记住这一点,下次我写一个混淆器。 Obfooscatoo。 –

+0

您可以使用VirtualProtect将入口点设置为goo可写,然后用无条件的'JMP'将其泼到'hoo'。 –

+0

但是我怎样才能找到goo的入口? –

回答

1

微软研究院提供了名为Detours的库:http://research.microsoft.com/en-us/projects/detours/。您可以使用它在Windows中重新路由任何API调用。

它完全符合您的描述 - 而不是调用到Win32 API,您的函数被调用。在这个功能中,你可以自由地做你想做的事情,例如你可以再次调用原来的Win32函数,或者你可以立即返回失败代码或任何你喜欢的东西。

Detours的快速版本是免费的,但它仅限于x86架构上的非商业用途。

+1

谢谢,你的回答帮助我找到这篇文章,其代码适用于我,而不使用Detours:http://www.codeproject.com/KB/DLL/funapihook.aspx#Trad –

1

library.dll的导入地址表中修补goo的导入描述符。 IAT补丁是用于拦截两个PE模块之间的函数调用的众所周知的挂接技术。