2011-09-27 125 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模塊之間的函數調用的衆所周知的掛接技術。