使用非托管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
....
你试图做一些棘手的事情,我不太清楚它是什么。根据你的描述,你至少有四件事:
- 托管EXE
- 托管DLL
- 非托管EXE
- 非托管DLL
其中一些是您可以控制的(即的源代码),而另一些则没有。
您想使用一个称为"注入"的过程来更改您没有控制权的模块,以调用您有控制权的某个模块。为了做到这一点,您使用的工具要求您在进程的地址空间中具有非托管入口点。
如果你想要使用非托管模块,那么你所需要做的就是编写一个新的混合模式模块(你显然可以控制它)来调用你不控制的托管DLL。现在,您有效地拥有了一个非托管DLL(用于导出目的),并且它被管理的问题已经消失了。
要从新的非托管包装器模块调用托管代码,可以使用本文介绍的技术:
- 托管/非托管代码互操作性综述
基本上,您需要一个C++/CLI项目,该项目引用您的黑盒托管DLL并调用它,并导出一个非托管入口点,您可以"获取"该入口点的地址进行注入。搜索会发现你有更多的想法。
最后,你能用这个方法调用托管DLL中的private
方法吗?不,不直接。但是,它是一个托管DLL,因此它必须具有一些public
入口点,才能对任何人有用,并且您可以调用这些入口点。如果这还不够,可以使用C++/CLI中的反射来调用私有方法和访问私有成员。
您需要使用非托管托管/调试API。如果你可以注入一个托管DLL,这会容易得多,你可以只使用反射。