【问题标题】:c# reflection (or another way to get class values via injected dll)c#反射(或通过注入的dll获取类值的另一种方式)
【发布时间】:2012-09-12 10:47:24
【问题描述】:

在过去的 3 周里,我一直在网上搜索,试图让它发挥作用,但我没有任何运气。

背景故事:将 C# .NET 4.0 DLL 注入 .NET 4.0 应用程序。

(我可以使用用 C++ 编写的引导 DLL 注入我的 DLL,并且可以调用应用程序中的函数)

我可以让这段代码工作,但我想做的是获取“实际”值,而不是创建类的新实例。

下面是反射工作的一个工作示例,我不希望它工作,我不确定反射是否是我现在需要使用的。还是我只是在叫错树?

namespace TestFormsApp4
{
    static class Program
    {
        private static TestClass1 Test = new TestClass1("from class 1");
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            BindingFlags Binding = BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static;
            Assembly App = Assembly.Load("TestFormsApp4");
            //Get the TestFormsApp4.Program (static) type
            Type Test1C = App.GetType("TestFormsApp4.Program");
            //get the testclass2 field (TestClass2 testclass2;)
            var Test1F = Test1C.GetField("Test", Binding);
            //get the value from the field
            var Test2C = Test1F.GetValue(Test1C);

            Application.Run(new Form1());
        }
    }
}

namespace TestName1
{                      
    class TestClass1
    {
        public bool testbool = false;
        public TestClass2 testclass2;
        public TestClass1(String SetString)
        {
            this.testclass2 = new TestClass2(SetString);
        }
    }
}

namespace TestName2
{
    class TestClass2
    {
        public String teststring;
        public TestClass2(String SetString)
        {
            teststring = SetString;
        }
    }
}

【问题讨论】:

  • “实际”值是什么意思?你的意思是某处有一个现有的实例吗?如果是这样:那个实例在哪里?在不知道引用的情况下您无法获取值(尽管如果您只知道它为 object 也可以)。

标签: c# dll code-injection


【解决方案1】:

是的,该代码无法运行。您必须获得对您​​感兴趣的类的现有实例的引用。创建一个新实例除了您自己在此类实例上设置的属性外,不会给您带来任何好处。这样的引用可能很难获得,没有办法迭代垃圾收集堆上的对象。

您需要在程序中使用一个静态 变量来跟踪创建的实例。有一个提示可能存在这样的变量,看起来您正在对表单进行操作。 Application.OpenForms 是一个静态变量,它引用已打开表单的集合。您可以对其进行迭代并使用 GetType() 来查找特定表单类型的实例。只要该表单对象存储对“TestClass”实例的引用,您就可以使用反射将其挖掘出来。也是 ManagedSpy++ 工具的工作方式。

【讨论】:

  • 现在想想,这实际上完全有道理。只要我正在寻找的值在某处被声明为静态。我已经编辑了我的原始帖子,以反映代码必须是什么样子(使用反射)才能找到这个静态类的值。现在的问题是,这是我的应用程序的新实例还是内存中存在的实例?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多