2017-06-22 64 views
1

我正在寫在進程中運行的加載項。我可靠地能夠發現已經在該進程中加載​​的DLL的內存地址。在明確的偏移存儲器示出了一個「MZ」 DOS頭和「PE」報頭。後來,似乎是導出函數的名稱等,這走路和說話像一個加載的DLL。所以,現在我想了解更多關於什麼是DLL,更有趣的是,我可能能夠使用來做我有一個加載的DLL的起始地址,我怎麼能發現並調用它的出口?

我用PE事業中來,但他們一直與基於文件的工作的DLL。如何列出一個內存中的DLL導出的函數,除了通過檢查過程中十六進制編輯器?有什麼方法可以發現當前加載的基於文件的DLL嗎? (我不太熟悉我在dll加載時發生的鏈接。)

如果我有導出函數的名稱,是否只是嘗試調用這些函數,並猜測他們的論點和返回值?還是有一些更強大的逆向工程可以執行?

鑑於DLL的起始地址和函數名,我將如何去在C#中進行調用?

回答

0

實際上這裏有很多問題(有些相當廣泛)。我會嘗試提供一些答案。

顯然,從.DLL獲得功能簽名不是一個簡單的任務(有時這是完全不可能的)。這裏有3個網址,但谷歌產生關於這一主題的結果噸:

.DLL自帶的一個或多個標題包含(除其他事項外)函數/類聲明的文件。缺乏頭(一個或多個)將意味着要麼:

  • 的.dll符號是內部目的僅僅(而不是被稱爲「手動」)
  • 它們是私有的(例如通過許可證的保護),以及在這種情況下,逆向工程他們也不會很道德

無論如何,考慮拉上你的函數名和簽名,您可以通過[MSDN]: GetProcAddress function加載功能,並然後打給他們。

否則從.NETC#)一切(再次,函數名和簽名是必需的),只是因爲C#代碼運行在管理環境增加了複雜性的一個額外的水平,而Ç/C++運行在天然環境,並且當數據在2個環境之間交換它需要編組/解組[MSDN]: Overview of Marshaling in C++)。
下面是3個網址,但同樣,互聯網是充分的信息:

相關問題