【问题标题】:C# DLL Injection - Call Method of Running ApplicationC# DLL 注入 - 运行应用程序的调用方法
【发布时间】:2019-03-07 06:10:46
【问题描述】:

假设我有一个用 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 中的公共函数?如果是这样,任何 C# 中的示例代码都将不胜感激。

【问题讨论】:

  • 如果 DLL 是 .NET DLL,则无需使用 Windows API 调用。只需使用Assembly.LoadFrom and similar(请注意,链接到加载程序集的“最佳实践”文档)。
  • 澄清一下,我不会修改 'foobar.exe' 应用程序来加载 DLL。 Foobar.exe 是一个第三方应用程序(用 C# 编写),我已经确定了一个方法,我想在 foobar.exe 应用程序已经运行时调用该方法,方法是将 DLL 注入正在运行的进程并调用它的 LoadBox 方法。
  • 我的朋友和我现在正在讨论这个问题。没有办法(在合理范围内)实现这一点。我已经多次使用注入,但这并没有试图跨越托管边界。似乎没有人甚至在阅读您的“运行”要求。我推测 C++/CLI“可能”会给你一个机会,但至少很难说。另外的选择?解压 exe 并为它做任何你想做的事情。
  • 是的,它已被反汇编(已反编译,感谢 MSIL!),并且已被修补以执行我想要的操作。我真的很好奇编写一个可执行文件,该可执行文件将自身注入到正在运行的进程中,然后调用该方法,以绕过程序在运行 LoadBox() 之前所做的检查,这样我就不必使用修补的二进制文件.

标签: c# dll-injection


【解决方案1】:

我的方法是使用反射的概念。我们可以让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___

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-18
    • 2012-05-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多