2011-04-18 46 views
3

我想用Windows API's PatchAPI來應用一些補丁。 補丁的應用在mspatcha.dll中實現,它應該位於system32文件夾中。鏈接到Windows API的PatchAPI

在閱讀過各種地方,如他們的參考和谷歌搜索,我還沒有找到正確的方式來鏈接到這個DLL。我想靜態鏈接,處理LoadLibrary似乎很麻煩,有點挫敗了他們patchapi.h頭文件的用途。因爲我沒有發現任何的.lib文件,我鏈接到,我用下面的命令創建了自己:

1)DUMPBIN /出口C:\ WINDOWS \ SYSTEM32 \ mspatcha.dll

2)創建mspatcha.def文件,寫入一個「出口」行,其後是一個線出現在輸出每個函數名DUMPBIN

3)LIB /def:mspatcha.def /out:mspatcha.lib

雖然我確定這不是與patchapi靜態鏈接的正確方法,但我還沒有找到正確的方式來做到這一點。 無論如何,在遵循這些步驟並編寫一個簡單的測試用例(ApplyPatchToFileExA())後,我仍然在符號_ApplyPatchToFileA @ 16上發生鏈接器錯誤。 考慮看看我的新創建mspatcha.lib的導出的符號,看來該函數使用了錯誤的命名慣例

d:\ tmp目錄\ mspatcha> DUMPBIN /出口mspatcha.lib |找到「ApplyPatchToFileExA」

   _ApplyPatchToFileExA 

除非我錯了,這表示,而該DLL使用STDCALL(或至少被宣佈功能_stdcall)使用的cdecl的lib導出的函數。參見:C name decoration in Microsoft Windows

我的問題是:在我的應用程序中使用mspatcha.dll的正確方法是什麼以及我從dll創建lib的過程出了什麼問題,以便我可以進行靜態鏈接?

我的終端的詳細輸出可以在這裏找到:http://pastebin.com/q4FV4Se6

+0

請區分「靜態導入」和「靜態鏈接」。前者意味着加載器將在二進制獲得控制權之前解析任何導入的函數(可能會失敗)。後者意味着實際的目標代碼被鏈接到最終的二進制圖像中。 – 0xC0000022L 2011-04-18 23:58:37

+0

我有點困惑,'lib.exe'應該從你給的DEF文件中創建裝飾名稱。你有沒有試圖鏈接到這一點。lib,然後檢查生成的二進制文件的導入目錄? – 0xC0000022L 2011-04-19 00:03:23

+0

嘗試使用這個小工具:http://vortex.masmcode.com/files/def2lib11.zip - 它需要.def文件中的裝飾名稱,以便鏈接器和加載器都很高興。 – 0xC0000022L 2011-04-19 01:07:51

回答

0

根據術語的時候,你正試圖靜態鏈接含蓄,而不是這意味着完全不同的東西。

如果您確實無法掌握.lib文件,那麼生成一個簡單的方法就是爲每個函數創建一個具有空存根的虛擬DLL。調用DLL mspatcha.dll。確保你使用.def文件和stdcall。

當您構建DLL時,將其丟棄但保留.lib文件!

我已經完成了這項工作,爲使用不會發出.lib文件的工具鏈構建的DLL生成.lib文件。

您使用的技術僅適用於cdecl功能。

+0

這太過分了。 'lib.exe'可以用來通過簡單地使用'.def'(模塊定義)文件來創建一個導入'.lib'。根本不需要創建虛擬DLL。這是OP在做的事情,所以問題在於懷疑呼叫公約。 – 0xC0000022L 2011-04-18 23:56:07

+0

側記:他使用的技術不僅適用於'__cdecl'。我用'__stdcall'多次使用過它。 – 0xC0000022L 2011-04-19 00:05:22

+0

@status你對cdecl的評論在這裏是矛盾的:http://support.microsoft.com/kb/131313 – 2011-04-19 06:50:11