2008-11-15 102 views
16

如何查找未公開的 Dll函數的參數?查找DLL函數參數

我在互聯網上搜索過,最終找到了一種方法:它涉及裝飾功能。但是,我找不到獲取這些內容的方法。

任何幫助,將不勝感激。

回答

6

正如Paul指出的那樣,您需要使用IDA Pro(或免費版本)的方式反彙編應用程序。

一個很好的介紹性資源是Wikibook,x86 Disassembly。具體來說,看看functions and stack frames的部分。對於採用標準類型的幾個參數的簡單函數,推導函數參數可以是直接的。

也許開始使用這種方法的最好方法是創建一個小型測試DLL,使用已知參數創建一些函數,然後反彙編DLL以查看模式。從你自己的函數中學習反彙編(你有源代碼並知道完整的簽名),而不是分解第三方的東西。

+1

Hrm ....根據我的回答:P(開玩笑確定;),無論如何,你根本不需要反彙編,你可以更快得到更準確的信息,然後再訴諸這個事實上,這是我建議的步驟之後的最後一個可能的辦法。 – RandomNickName42 2009-07-02 09:40:14

5

要做到這一點的唯一方法是分解函數並查看它如何使用寄存器和堆棧。 IDA Pro是做這件事的最佳工具,但它不是微不足道的。

+0

好的答案,我應該刪除我的。我必須努力我的簡潔:) – 2008-11-15 05:35:38

1

如果您擁有的唯一信息是未修飾的函數名稱,那麼遺憾的是無法單獨推導出函數參數。

如果你裝配得很好,可以拆開功能的機器代碼並對其進行逆向工程。但除了最簡單的功能之外,這對所有人來說都很難做到。

1

我並不十分熟悉Windows使用的PE格式,但我很確定沒有真正簡單的方法來做到這一點。如果符號表沒有被剝離,你可能能夠找到一些信息(不知道Windows如何在PE中存儲調試信息),但它幾乎肯定無法幫助你處理參數類型。最好的辦法是將DLL加載到調試器中並對其進行實驗...監視堆棧幀上的原始內存,發送各種變量類型等。

即使您在調試信息中找到了很好的資源在一個PE文件中,幾乎肯定不會有任何私人函數的信息。

4

它是COM Dll嗎?如果它是一個COM Dll,然後註冊它,使用OLE視圖來了解Interafaces和參數。

2

首先,下載Dependency Walker並打開你的DLL。您將看到符號導出和導入。如果你的函數名稱看起來像_MyFunction - 它是「C」風格(沒有裝飾),並且你沒有太多處理它(可能會像前面說的那樣拆卸)

如果它更像?_MyFunction @ LoNgSetOfSome @裝飾,您可以嘗試「去除裝飾」,它使用{非官方的}信息從here

+0

PE資源管理器能夠在內部取消使用Microsoft和Borland C++編譯器編譯的庫導出的符號:http://www.heaventools.com/unmangle.htm – Wylder 2010-07-16 17:15:44

7

我做了相當深入的回答here,ReactOS的是你最好的選擇,因爲它似乎再次,大家在這裏 - _StrangeChAracTers這是C++有點偏離基礎。

我會強烈不鼓勵試圖反彙編系統DLL的。

一個MUCH更adventagious(我不這麼認爲遠的東西看起來討論),方法是枚舉PDB的內容。

PDB文件是您可能已知的調試符號,但是,由於反托拉斯法庭案件的行動,Microsoft需要發佈大量未記錄的信息。對Windows API的巨量的

完全準確的,可用的和最新的信息是通過PDB文件的記錄。調用約定,參數計數,甚至參數類型和名稱都記錄下來(但不是關於使用課程的具體細節:)。

回顧DIA SDK,dia2dump是隨Visual Studio分發的一個很好的例子,爲了進一步調查,它還提供了一個解開函數的解決方案,專門針對您的問題。

另外,kernel32提供了UnDecorateSymbolName,所以如果你不想鏈接到debug sdk庫,也可以使用它。