我想從dll調用一個方法,但是我沒有源文件頭文件。我試圖使用dumpbin/exports來查看方法的名稱,但是我可以找到方法簽名?在沒有標題的C++ dll中調用函數
有什麼辦法來調用這個方法?
感謝,
我想從dll調用一個方法,但是我沒有源文件頭文件。我試圖使用dumpbin/exports來查看方法的名稱,但是我可以找到方法簽名?在沒有標題的C++ dll中調用函數
有什麼辦法來調用這個方法?
感謝,
通過分析反彙編的初始化,可以計算出C函數簽名。函數參數將在堆棧中,函數將執行一些「彈出」以相反的順序讀取它們。你不會找到參數名稱,但你應該能夠找到他們的編號和類型。返回值可能會讓事情變得更加困難 - 它可能是通過'eax'寄存器或通過傳遞給函數的特殊指針作爲最後一個僞參數(位於堆棧頂部)。
如果函數是C++的一個,你可能能夠從重整名稱導出函數簽名。 Dependency Walker是一個可以爲你做到這一點的工具。但是,如果DLL是使用C鏈接創建的(Dependency Walker會告訴你這一點),那麼你運氣不好。
C++語言不知道什麼的dll。
這是在Windows上嗎?一種方法是:
depends.exe
附帶(Visual Studio中)LoadLibrary()
得到加載這個DLL中的函數的簽名打開DLL了(小心關於路徑)GetProcAddress()
獲得一個指向要呼叫FreeLibrary()
以釋放手柄BTW:這種方法也通常被稱爲運行時動態鏈接,而不是編譯時,你與關聯
lib
文件編譯源動態鏈接。
存在一些與dlopen
* nixes類似的機制,但我的記憶在此後開始失敗。一些叫objdump
或nm
應該讓你開始檢查功能。
如果你確實知道或強烈懷疑功能是存在的,你可以動態加載與調用LoadLibrary DLL和獲取指向與GetProcAddress的功能。見MSDN
注意,這是加載庫手動,動態的方式;您仍然必須知道正確的函數簽名才能映射到函數指針以便使用它。 AFAIK沒有辦法在加載時間功能中使用dll,並使用沒有頭文件的函數。
正如你已經發現,在一個DLL導出列表中只存儲的名稱,而不是簽名。如果您的DLL導出C函數,您可能需要反彙編和反向工程來確定方法簽名。但是,C++在導出名稱中編碼方法簽名。此方法名稱和簽名組合的過程稱爲"name mangling"。 This Stackoverflow question有一個參考,用於確定來自損壞的導出名稱的方法簽名。
嘗試免費"Dependency Walker" (a.k.a. "depends")工具。 「Undecorate C++ Functions」選項應該確定C++方法的簽名。
調用非外部函數是在第三方DLL更新時讓程序中斷的好方法。
也就是說,undname實用程序也可能有所幫助。
dumpbin/exports顯示的方法的確切名稱是什麼? – ChrisW 2009-02-16 21:09:36