2012-03-20 44 views

回答

4

簡而言之,沒有簡單的方法來做你想做的事。不過,您可以使用反彙編程序庫(例如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),但根據您正在開發的項目(「不允許商業用途」),許可證可能會成爲障礙。

0

您可以找到dumpbin或Dependency Walker中導出的函數名。但要知道如何調用這些函數,你真的需要一個頭文件和一些文檔。如果你沒有這些,那麼你將不得不逆向工程DLL,這是一個非常具有挑戰性的任務。