2014-07-09 38 views
0

運行時是否可以訪問由.net應用程序創建的修改對象&?訪問由.net應用程序創建的對象

當我們創建一個引用或值類型的對象/道具值存儲在特定的內存位置
我想知道我們是否可以訪問該內存位置並設置一個自定義值。

這聽起來像黑客(間諜exe文件),但我只是好奇,是否有可能

UPDATE 請考慮下面的程序:

void Main() 
{ 
    string s = "Test"; 
    Console.ReadLine(); 
    Console.WriteLine(s); 
} 

這個控制檯應用程序生成EXE,
當我運行exe時,它等待用戶輸入,
在等待輸入時,我想更改其他應用程序的變量s的值

+2

爲「反思」的搜索。 – CodeCaster

+0

我認爲我們無法使用反射來訪問正在運行的exe的屬性 – JayJay

+0

什麼是「正在運行的exe的屬性」?目前還不清楚你在問什麼。編輯你的問題,以顯示哪個應用程序做什麼的分步說明。 – CodeCaster

回答

1

這取決於「訪問&修改對象」的含義。

如果你在談論對象屬性值 - 當然是。通過使用所謂的Reflection,即使對於私人成員也是可能的。例如:

PropertyInfo propertyInfo = obj.GetType().GetProperty("SomeProperty"); 
propertyInfo.SetValue(obj, "SomeValue", null); 

如果你正在談論abount改變對象的結構存儲在內存中的位置,比如改變它的方法,添加/刪除字段等 - 這是不可能的。

+0

感謝您的回覆,「我想在運行時修改屬性值,即在運行exe之後」 – JayJay

1

是的,你可以通過使用Reflection,這是非常強大的,它仍然令我驚訝,有時你可以用它做什麼。可能最適合你做一些研究,看看這是否正是你想要的。

這裏是微軟概述here,這很好地解釋了它。 This鏈接它我曾經學習了很多關於反思,我總是推薦給別人。試試看,然後搜索更具體的問題,這裏有很多很好的問題和答案在stackoverflow。

如果這不是你想要的,那麼你可以通過內存編輯器修改任何東西,但這遠遠超出了我的知識領域,而且你確實需要知道你爲什麼要做這樣的事情。

0

這聽起來像你想附加到正在運行的程序並檢查其狀態。這通常是調試器的工作,比如Visual Studio。

在其「調試」菜單中,您會看到一個選項「附加到進程」,其中列出了所有正在運行的進程。在您選擇要檢查的程序的過程之後,Visual Studio將顯示當前狀態,只要它可以確定即可。瞭解這個過程,你應該做一些搜索來找到更多關於該方法的信息。

一種簡單的方式來完成給定的,你有代碼的樣本一樣,是從你的代碼中明確地觸發調試器:

void Main() 
{ 
    string s = "Test"; 
    System.Diagnostics.Debugger.Break(); // This will trigger a dialog to attach a debugger 
    Console.ReadLine(); 
    Console.WriteLine(s); 
} 
相關問題