2008-12-22 44 views
17

是否可以從DLL中獲取導出(C風格?)函數的簽名(參數計數/類型,返回類型)?我可以使用DLL Export Viewer查看函數名稱,地址,序號等的列表,但我無法查看簽名。我只有dll文件,沒有.h和.def文件。獲取DLL中導出函數的簽名

更新:使用名爲API Monitor的工具,我可以附加到使用所提到的dll的進程並查看對這些函數的調用。這讓我看到參數的數量,返回值和它們的整數值(指針?),但這並沒有太大的幫助。我可能應該找到一種方法來確定這些指針在通話時指向哪種類型的結構。

回答

3

在C++中,函數簽名是「mangled」以與編譯器相關的方式放入名稱中。這在C中不會發生。因此,如果您的DLL中有C函數,則會看到未加密的名稱。如果它是C++版本,你會看到損壞的版本。

C++需要重新命名的名稱以允許鏈接器解析具有不同簽名的重載函數。

我不認爲有任何方法可以讓你從「C」DLL中獲取函數的特徵。他們根本不存在。

3

對於C函數,這些信息完全不存儲在DLL中。我可以建議的唯一方法就是反彙編這個函數,看看它如何與堆棧中的變量進行交互,然後嘗試確定簽名。

祝你好運!

17

DLL不存儲它們導出的函數的簽名。其他答案提到了C++,並且當C++函數以C++的形式導出時,名稱確實會被損壞。使用正確的編譯器的加密方案對它進行縮減,並且您將擁有簽名。但大多數DLL不會使用C++名稱來導出C++函數。相反,DLL選擇導出的函數是使用C樣式名稱導出的,所以即使DLL是用C++編寫的,導出的函數仍然不會有任何簽名信息。

您沒有標題?大多數供應商在他們的SDK中都包含這樣的事情。如果你沒有得到一個,然後抱怨供應商。如果你不應該得到一個,那麼也許你是以錯誤的方式去完成你的任務;你確定你應該直接使用該DLL嗎?

如果你沒有頭文件,那麼你也可以問自己,你是否真的被合法地允許在你的程序中使用DLL。如果它只是您在系統中找到的一個任意DLL,那麼即使您可以爲其編寫代碼,但在您發佈程序時可能不允許重新分發它。

+0

你絕對正確:) – huseyint 2008-12-22 19:55:56