2011-07-12 95 views
1

我只是想知道在我開始工作之前是否有可能。我可以將C#代碼注入並運行到正在運行的進程中,以及枚舉所有加載的.NET模塊。另外,我可以編輯.NET DLL的說明來添加我的方法調用。很明顯,我不能在加載DLL時編輯DLL,但是當我嘗試它時,系統消息告訴我無法編輯它,因爲它在另一個進程中加載​​。這導致我相信,如果我在相同的進程(因爲我的注入代碼),我可以編輯加載的DLL。我懷疑這是不對的。可能嗎?修改加載的C#DLL?

如果不是,你認爲可能卸載目標DLL,編輯它,並重新加載目標DLL?系統會重新正確地重新映射其所有值(因爲新的DLL會由於幾條指令而變大)?我有一種感覺,如果可以卸載DLL,進行編輯並將其重新加載到進程中,則操作系統應該負責其餘部分。

謝謝你的任何見解和反饋。

+3

你爲什麼想這樣做? –

+0

@大衛,很多原因:病毒,間諜軟件,根包。不要這麼閉目! –

+0

它也不需要是惡意的;例如,爲某些東西寫一個自定義的插件,而不是爲了濫用目的,是完全沒問題的。 –

回答

0

我可以編輯.NET DLL的說明來添加我的方法 調用。

對你有好處!我不知道你是怎麼做到的。

您是否認爲可能卸載目標DLL,編輯它, 並重新加載目標DLL?

否。加載的DLL無法卸載或重新加載。期。

編輯

我想起那個DLL可以卸載,如果您卸載整個AppDomain。但我相信這不是你想要做的。

+0

只要從進程中刪除所有引用'AppDomain',就可以卸載DLL – JaredPar

+0

是的,我知道。但你是對的,我需要提及AppDomain。 – Aliostad

+0

PERWAPI(或PEWRAPI?)是我目前使用的。似乎沒有更好的API可用。 – yolksamurai

1

一旦.DLL加載到CLR進程中,刪除它的唯一方法是卸載使用該DLL的所有AppDomain實例。所以我想這將有可能通過執行以下操作

  1. 卸載含有從而消除了該DLL的所有AppDomain實例中的DLL
  2. 編輯保存在磁盤上的DLL或只是把改變DLL編輯加載的DLL在不同的位置
  3. 創建一個新的AppDomain並加載修改DLL
1

我認爲你可以做到這一點沒有一個應用程序重啓的唯一途徑可能是打的已經被排擠出的機器碼JIT;但是然後你會有很多樂趣,其實你找的東西找到,更不用說處理改變的類型以及所有發生的各種JIT優化。然後你必須考慮如何處理動態代碼生成(其中有更多的東西比你想象的要多)以及可以被垃圾收集的動態方法。

你不妨寫你自己的.Net主機+ JIT;但後來我懷疑你會說服任何人運行它明知故障

你當然不能修改加載的程序集的IL,因爲.Net一旦加載就會保護它。我想這可能有些討厭(強調討厭的那裏)低級應用程序,完全繞過.Net 可能能夠在內存中破解IL;但是我懷疑加載執行時的內存中表示與磁盤上的相同;即使到了「黑客入侵」的時候,它也可能被打亂了,所以你的任何改變都不會有什麼不同。

最終.Net是專門設計用來防止你在說什麼。你可以附加(靜態)動態方法到現有的類型等,以獲得可見性(如果你有權限) - 但修改加載的代碼?

正如其他一些答案所提到的,你通常在磁盤上使用匯編來做這件事,並且有很多工具可以做到這一點。

但是你打算怎樣處理強大的組件呢?您必須能夠使用原來使用的相同強名稱密鑰辭職;不知何故,我懷疑你會有機會獲得。

+0

我認爲你是對的。我應該注意,這個代碼不會在任何用戶機器上運行(當然,除了我的代碼)。它將在正在通過自動測試套件的機器上運行。還有其他不太理想的方式去做這個項目(不太理想,因爲不太有用),但它看起來像這樣是一個死衚衕。感謝您所提供的所有信息! – yolksamurai

+0

@ yolksamurai - 不幸如此。對於任何推斷你的道歉可能會讓你在這裏做一些可怕的事情。實際上,你的場景是相當常見的,無論它有多大的敏捷度,解決方案總是相同的 - DLL文件修改。 –