【问题标题】:Injecting a DLL into a Target Process VB.NET将 DLL 注入目标进程 VB.NET
【发布时间】:2011-07-01 14:30:18
【问题描述】:

我最近编写了一个快速的 VB.NET 应用程序,它将 DLL 注入到正在运行的进程中。为了测试它,我正在创建我自己的 vb.net 类库项目,它只是生成一个“Hello World”消息框,希望它在我注入 HelloWorld.DLL 后出现在目标进程中。

我的问题是,在我注入 HelloWorld.DLL 后,消息框永远不会出现。我很确定这是因为一旦我的 HelloWorld.DLL 被注入(因为它是一个 VB.NET DLL),它就没有 DllMain,因此不知道要执行什么并且什么也没有发生。

我是否必须在 C++ 中制作我的注入 DLL,以便它有一个 DllMain?有什么我可以做的吗?还是我对所有事情都完全错了。

任何见解将不胜感激。谢谢。

【问题讨论】:

  • .net dll 甚至不是 PE 文件,它们只是文件扩展名中的 dll。
  • 你把你的 Hello World 消息框代码放在 dll 的什么地方?
  • 而且您可能也不应该将 .NET 程序集注入到其他进程中,因为您依赖的其他进程没有托管不同版本的运行时。
  • @Blogbeard:这是不正确的。 .NET 程序集实际上是 PE 文件的扩展形式,请参阅 en.wikipedia.org/wiki/…
  • @dthorpe - 我尝试将其放入 Public Sub New() 以及共享方法中,但均无效。由于 .NET 程序集实际上是 PE 文件,那么不应该有某种方法来指定我的 DLL 的入口点吗?

标签: c# .net vb.net dll code-injection


【解决方案1】:

虽然 .NET DLL 在技术上是 PE 格式的扩展,但正是这种扩展使其在本质上不同于包含纯编译的本机代码的 DLL。为了运行 .NET 代码(托管代码),需要由 .NET 解释器在 AppDomain 的上下文中执行。

本质上,.NET 会做很多事情来启动和运行该代码。

微软(祝福他们!)已经撰写文章并概述了您需要在此处执行的操作http://support.microsoft.com/kb/828736

另一种选择是不编写纯 C++ 代码,而是创建一个托管 C++ 项目,这将更容易让两者很好地协同工作。顺便说一句,拥有托管 C++ 项目并不意味着所有代码都必须由 AFAIK 进行管理

【讨论】:

  • 这似乎没有任何作用。问题是我无法控制如何调用我的 DLL(也就是我无法导入 .tlb 等)。我调用了 LoadLibrary 并将我的 .dll 加载到目标应用程序内存中,但目标进程不知道入口点。
  • 嗨 crunchy,我仍然坚持我的第一次发帖。您将需要更多地了解 AppDomain(以及一大堆其他内容,这些内容根本不值得您花时间去说服 - 恕我直言)。有什么值得一看的msdn.microsoft.com/en-us/library/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-10
  • 1970-01-01
相关资源
最近更新 更多