C#DLL注入-运行应用程序的调用方法

时间:2019-03-06 21:59:40

标签: c# dll-injection

可以说我有一个用C#编写的可执行文件'foobar.exe',现在已编译,可以在Windows机器上运行。该应用程序中的功能之一如下(示例):

public static async Task LoadBox(string msg)
{
    System.Windows.Forms.MessageBox.Show(msg);
}

我想用C#编写一个在应用程序中调用此方法的DLL。 DLL,例如“ injected.dll”,将使用此处引用的注入器注入到正在运行的“ foobar.exe”进程中:http://www.codingvision.net/miscellaneous/c-inject-a-dll-into-a-process-w-createremotethread

是否有可能从新注入的DLL中调用原始exe中的public函数?如果是这样,将不胜感激C#中的任何示例代码。

1 个答案:

答案 0 :(得分:0)

我的方法是使用 Reflection 的概念。我们可以使EXE通过反射加载程序集,发现Type并在此Type上调用方法,然后将EXE中的类的实例传递给此方法,该方法又进行回调。一回合的方式-但这行得通。

您可以使用方法 System.Reflection.Assembly.LoadFrom(来加载为.NET编译的程序集。这是一种相当古老的技术,没有什么新意。依赖项包含和打算在部署后加载插件的工具就是使用这种方法编写的。

第1步

使用 System.Reflection.LoadFrom

将插件程序集加载到当前的Appdomain中

第2步

使用Assembly.GetTypes()

在此插件程序集中找到 Type

第3步

将EXE中定义的类的实例传递到插件中,并让该插件进行回调。这是事件回调实际上会执行的操作。

链接

https://docs.microsoft.com/en-us/dotnet/api/system.activator.createinstance?view=netframework-4.7.2#System_Activator_CreateInstance_System_AppDomain_System_String_System_String_System_Boolean_System_Reflection_BindingFlags_System_Reflection_Binder_System_Object___System_Globalization_CultureInfo_System_Object___