回答
簡而言之,沒有簡單的方法來做你想做的事。不過,您可以使用反彙編程序庫(例如distorm)來反彙編出口入口點的代碼。有一些可以使用的啓發式方法,但其中很多僅適用於32位調用約定(__stdcall
和__cdecl
)。就我個人而言,我發現它的Python綁定有用,但libdasm可以做同樣的事情。
其他任何具有反彙編功能的工具都具有很大的價值,比如OllyDbg或Immunity Debugger。
注:,如果你有一個已經調用有問題的DLL的程序,這是大部分時間非常值得運行調試器(當然只有在代碼可以信任下,但你的問題基本上意味着)並在導出的函數中設置斷點。從這一點上,您可以從運行時行爲和運行目標的堆棧內容中推斷出更多。但是,這仍然是棘手的 - 特別是在__cdecl
其中函數可能需要任意數量的參數。在這種情況下,您必須篩選外部參數的調用程序到相應的函數,並根據call
的堆棧清理推斷它拋棄了多少個參數/字節。當然,在call
之前查看push
指令也會具有一定價值,但它需要一點經驗,尤其是在呼叫嵌套時,您必須辨別哪個push
屬於哪個call
。
基本上你將不得不制定出一套最小的匹配你的情況,除非你已經許可的昂貴的工具之一(和知道如何操縱他們)來與自己的啓發式啓發式的,通常經過微調調整了很長時間。
如果您碰巧擁有IDA Pro(或Hex-Rays插件)許可證,那麼您當然應該使用該許可證。另外,雖然相對落後,freeware versions of IDA可以處理32位x86 PE文件(當然包括DLL),但根據您正在開發的項目(「不允許商業用途」),許可證可能會成爲障礙。
您可以使用dependency walker。
您可以找到dumpbin
或Dependency Walker中導出的函數名。但要知道如何調用這些函數,你真的需要一個頭文件和一些文檔。如果你沒有這些,那麼你將不得不逆向工程DLL,這是一個非常具有挑戰性的任務。
- 1. PInvoke在編譯時不知道DLL嗎?
- 2. 如何在反編譯C#dll後編譯dll?
- 3. .dll反編譯器
- 4. c#DLL只能編譯一個類
- 5. 編譯一些dll到另一個dll
- 6. C#反編譯
- 7. PInvoke或使用/ clr:pure來編譯
- 8. 是否可以使用Turbo C/C++編譯器生成DLL?
- 9. pInvoke C#DLL導入問題
- 10. 可以將C程序編譯爲DLL
- 11. 的PInvoke DLL中的函數用C
- 12. 反向pinvoke char * []使用StringBuilder
- 13. 使用gcc編譯DLL
- 14. GCC使用__stdcall編譯dll
- 15. C#dll文件編譯
- 16. 「找不到PInvoke DLL」sqlceme35.dll「
- 17. 如何使用PInvoke從c#導入C++ dll?
- 18. 我可以從程序(DLL)調用的C++或C編譯器
- 19. 如何反編譯.dll文件?
- 20. 替換反編譯DLL中的函數
- 21. 啓用DLL編譯
- 22. 如何編譯形成一個DLL
- 23. 反編譯Objective-C庫
- 24. 用C++編寫的Mozilla/GoogleChrome插件可以反編譯嗎?
- 25. 將C代碼編譯爲Visual C++ dll?
- 26. 使用Visual C++項目中使用MinGW/GCC編譯的DLL?
- 27. 關於是否使用本地C++ DLL的建議:PINVOKE&Marshaling?
- 28. 反編譯Obj C框架
- 29. Netbeans(c/C++的MinGW編譯器)是否可以調用任意C/C++ DLL(在VS'05中編譯)?
- 30. 將C++源代碼編譯爲一個.dll
依賴性步行者只顯示導出函數的名稱,而不是整個簽名 – Praetorian 2012-03-20 19:41:13