2013-09-29 34 views
1

爲noob錯誤提前道歉。這是我的第一個問題。首先,一些背景:(Dependency Walker)在功能上缺少顯式類型

我想爲程序創建一個模塊,使用依賴關係walker在.dll中查找C++函數,但是我沒有lib或任何源代碼。您還可以假設我無法獲得原始開發人員的支持。基本上,我檢查了另一個訪問它的文件,看看最低功能是如何工作的。下面是輸出的未修飾名稱的示例:

void foo::bar::baz(float) 
float foo::bar::qux(void) 
foo::bar::bar(void) 
class foo::bar & foo::bar::operator=(class foo::bar const &) 

上面兩個函數顯然會使用float或void並返回float或void。我有類似的功能使用類似的工作:

HINSTANCE THEDLL = LoadLibrary("C:\\dllFolder\\theDll.dll"); 
typedef float (*quxType)(void); 
quxType qux = (quxType)GetProcAddress(THEDLL, "quxMangledName"); 

所以這些都不是問題。

現在,列表中的第三個看起來像另一個函數,它採用void,但它沒有明確的返回類型。這是否意味着我應該爲它使用隱式類型,它是無效的,還是它不是一個真正的函數?如果不是,那是什麼?

我不知道如何處理第四個。它甚至可以處理沒有關聯的.h文件?

我環顧四周,但我找不到任何有關顯示返回類型的正常函數時該怎麼辦的信息。儘管使用基本上相同的代碼,我用一個類似的.dll函數工作,但當我嘗試在這裏使用函數#2(我真的只需要函數#2)時,我不斷遇到訪問衝突崩潰。所以我猜測.dll需要更多的信息或需要首先初始化,這就是爲什麼我對列表中的其他人感興趣。

我意識到這是一個複雜的問題,因此可能不會有一個「正確的答案」解決方案來讓它工作,但是如果我做出任何明顯的錯誤,或者如果有任何關於如何攻擊的一般性建議問題(甚至是依賴walker的替代品),請告訴我。

回答

0

第三個是bar的默認構造函數。 第四個是bar的複製賦值操作符。

我想你需要首先實例化類,以便調用第二種方法。否則,該方法將被調用,導致訪問衝突的無效「this」。

問題是你如何實例化它? 如果您可以找到在DLL中返回一個工具欄的工廠函數,則可以嘗試使用它。

如果您沒有看到一個工廠函數,你沒有LIB文件,你可以參考這裏的答案如何創建一個從DLL一個lib:How to make a .lib file when have a .dll file and a header file

您還需要創建頭文件的類,與正確的順序和類型的成員。這樣您就不必使用LoadLibrary和GetProcAddress,只需使用該類即可。

您仍然可以使用調用LoadLibrary和GetProcAddress沒有lib和雖然標題,這篇博客演示瞭如何手動分配內存,調用構造函數,得到一個對象,並通過這個對象調用一個方法:http://recxltd.blogspot.com/2012/02/working-with-c-dll-exports-without.html

+0

好吧,謝謝。這聽起來像是問題。我猜Dependency Walker文檔只是希望用戶更熟悉一般的C++。我將深入挖掘函數列表,看看有沒有工廠函數。 (另外,我試圖投票,但我的聲望太低。) –

+0

@RainbowDash,我添加了一個關於如何僅用LoadLibary和GetProcAddress調用構造函數的鏈接。沒關係的投票:) – fxam

+0

這是爲了避免像「謝謝」這樣的評論,但第二個鏈接完全是問題的解決方案。花了這麼多小時的時間試圖找出如何使其工作,崩潰後崩潰,想知道是否有可能......然後基本上只是複製該博客的例子,並讓它在第一次完美的工作......言語無法表達這種感覺。 –