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