在运行时可以访问&修改.net应用程序创建的对象?
当我们创建引用或值类型时,对象/ prop值存储在特定的内存位置,
我想知道我们是否可以访问该内存位置并设置自定义值。
这听起来像是黑客攻击(间谍程序),但我只是好奇是否可能
更新 请考虑以下计划:
void Main()
{
string s = "Test";
Console.ReadLine();
Console.WriteLine(s);
}
此控制台应用程序生成一个exe,
当我运行exe时,它等待用户输入,
在等待输入时,我想从其他应用程序
s
的值
答案 0 :(得分:1)
这取决于“访问和修改对象”的含义。
如果您正在谈论对象属性值 - 当然是。即使对于私人会员,也可以使用所谓的Reflection。例如:
PropertyInfo propertyInfo = obj.GetType().GetProperty("SomeProperty");
propertyInfo.SetValue(obj, "SomeValue", null);
如果您正在谈论更改存储在内存位置的对象结构,例如更改其方法,添加/删除字段等 - 这是不可能的。
答案 1 :(得分:1)
是的,你可以使用Reflection
,这是非常强大的,它仍然让我惊讶,你可以用它做什么。可能最适合你做一些研究,看看这是否正是你想要的。
以下是Microsoft概述here,它解释得相当不错。 This将我以前学到很多关于反思的知识链接起来,我总是把它推荐给别人。尝试一下,然后搜索更具体的问题,这里有很多关于stackoverflow的好问题和答案。
如果这不是您想要的,那么您可以通过内存编辑器修改任何内容,但这远远超出我的知识领域,您真的需要知道您希望如何/为什么要做这些事情。
答案 2 :(得分: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);
}