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

本文关键字:exe 调用 函数 dll C++ | 更新日期: 2023-09-27 17:57:33

所以,我有一个用C#制作的可执行文件,我没有它的源代码,但我用IDA对它进行了分解,它给了我很多面向对象的汇编。

我已经制作了一个.exe文件,它将一个.dll注入另一个.exe,我已经将这个新的C++dll注入C#.exe,没有问题,DLLMain被调用了,所以…

但是,当我把这个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
....

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

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

  • 托管EXE
  • 托管DLL
  • 非托管EXE
  • 非托管DLL

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

您想使用一个称为"注入"的过程来更改您没有控制权的模块,以调用您有控制权的某个模块。为了做到这一点,您使用的工具要求您在进程的地址空间中具有非托管入口点。

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

要从新的非托管包装器模块调用托管代码,可以使用本文介绍的技术:

  • 托管/非托管代码互操作性综述

基本上,您需要一个C++/CLI项目,该项目引用您的黑盒托管DLL并调用它,并导出一个非托管入口点,您可以"获取"该入口点的地址进行注入。搜索会发现你有更多的想法。

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

您需要使用非托管托管/调试API。如果你可以注入一个托管DLL,这会容易得多,你可以只使用反射。