使用非托管C ++ .dll从C#.exe调用函数

时间:2011-05-23 20:16:18

标签: c# c++ hook dll-injection

所以,我有一个用C#编写的可执行文件,我没有它的源代码,但是我用IDA对它进行了反汇编,它给了我很多面向对象的程序集。

我已经制作了一个.exe文件,将.dll注入到另一个.exe中,我已经将这个新的C ++ DLL注入到C#.exe中,没有任何问题,DLLMain被调用,所以... < / p>

但是当我将这个DLL注入到用C ++编写的普通.exe文件中时,我可以使用其内存地址调用.exe中的函数,我可以在IDA上使用。

问题是,面向对象的程序集在其功能上没有地址,即使函数名称被反汇编也是如此。

那么,有什么方法可以用我在C#.exe文件上注入的DLL来调用这个函数吗?

如果可能,有没有办法可以使用C#.exe文件中声明的命名空间及其所有函数和变量,甚至是私有的?

示例反汇编代码:

.namespace MyCSharpApp
{
.class public auto ansi Test extends [mscorlib]System.Object
{
  .field public value class [Microsoft.Xna.Framework]Microsoft.Xna.Framework.Vector2 pos

  .field public int32 foo
....

2 个答案:

答案 0 :(得分:3)

你正在尝试做一些棘手的事情,我不清楚它是什么。根据您的描述,您至少有四件事:

  • 管理EXE
  • 托管DLL
  • Unmanaged EXE
  • 非托管DLL

您可以控制其中一些(即源代码),而其中一些则没有。

您希望使用一个名为“注入”的流程来更改可以控制的模块,以调用您执行可以控制的模块。为此,您使用的工具要求您在流程的地址空间中具有非托管入口点。

如果您使用非托管模块获得所需内容,那么您需要做的就是编写一个新的混合模式模块(您显然可以控制它)来调用您无法控制的托管DLL。现在你有效地拥有一个非托管DLL(出于导出目的),并且它被管理的问题已经消失。

要从新的非托管包装模块调用托管代码,您可以使用本介绍性文章中描述的技术:

基本上,您需要一个C ++ / CLI项目,该项目引用您的黑盒托管DLL并调用它并导出一个非托管入口点,您可以“获取”注入的地址。搜索将为您找到更多的想法。

最后,您是否可以使用此方法调用托管DLL中的private方法(无法控制)?不,不是直接的。但是,它是一个托管DLL,因此它必须具有一些 public入口点才能对任何人有用,您可以调用它们。如果这还不够,您可以使用来自C ++ / CLI的反射来调用私有方法并访问私有成员。

答案 1 :(得分:1)

您需要使用非托管主机/调试API。如果你可以注入一个托管DLL,这将更容易,你可以使用Reflection。