2010-02-15 130 views
1

我有一個我需要使用的dll。我也有一個程序,調用這個DLL來使用它。我需要能夠在另一個程序中使用這個DLL,然而之前的程序員沒有留下任何文檔或源代碼。有沒有一種方法可以監視對此dll的調用以及傳遞的內容?如何在不知道參數的情況下使用dll?

+0

它是什麼語言,任何線索? – 2010-02-15 01:56:06

+0

客戶端不知道,但使用DependencyWalker它看起來像c或C++風格的函數名稱。 – user273114 2010-02-15 02:08:56

回答

4

你一般不能。這是從Dependency Walker FAQ:

問:如何查看參數和 返回類型的函數?

答:對於大多數函數,這個 信息根本不存在於 模塊中。 Windows的模塊文件 格式僅提供單個文本 字符串來標識每個函數。 沒有結構化的方式來列出 參數數量,參數 類型或返回類型。然而, 某些語言做了一些叫做 函數的「修飾」或「mangling」, 這是將 信息編碼成文本字符串的過程。例如,對於 示例,使用簡單裝飾 編碼的函數(如int Foo(int, int))可能會導出爲_Foo @ 8。 8 指的是參數 使用的字節數。如果使用的C++裝飾爲 ,函數將作爲?Foo @@ YGHHH @ Z導出爲 ,可以將該函數直接解碼回 函數的原始原型:int Foo(int,int)。 Dependency Walker 通過使用 Undecorate C++函數命令來支持C++ undecoration。

編輯:有一兩件事你可以做,我想,是讓反彙編和拆卸DLL和/或調用代碼,並從數量和類型的參數制定,以及返回類型。儘管如此,您將無法找到參數的名稱。

0

您可以hook在要監視(如果你知道有多少參數需要)

1

您可以使用dumpbin(這是Visual Studio Professional或VC++速成的一部分,該DLL的功能或下載平臺套件,甚至使用OpenWatcom C++)中的DLL來尋找「出口」部分,作爲一個例子:

 
dumpbin /all SimpleLib.dll | more 

Output would be: 
    Section contains the following exports for SimpleLib.dll 

    00000000 characteristics 
    4A15B11F time date stamp Thu May 21 20:53:03 2009 
     0.00 version 
      1 ordinal base 
      2 number of functions 
      2 number of names 

    ordinal hint RVA  name 

      1 0 00001010 fnSimpleLib 
      2 1 00001030 fnSimpleLib2 

看那序,也有出口...唯一的兩個功能事情是制定出什麼參數e used ...

您還可以使用PE Explorer爲您找到。計算參數有點棘手,需要反彙編二進制文件,然後在文件偏移處查找函數調用,然後通過查看'SP','BP'寄存器來計算參數。

希望這會有所幫助, 最好的問候, 湯姆。