2011-05-23 129 views
5

因此,我有一个用C#编写的可执行文件,我没有它的源代码,但我用IDA反汇编了它,它给了我很多面向对象的程序集。从C#.exe调用非托管C++ .dll的函数

我制作了一个.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 
.... 
+0

即使有可能得到一个地址 - 代码是MSIL,而不是本地代码也没有多大意义。需要启动CLR(我不知道这将如何发生)。 – 2011-05-23 20:22:35

+0

@pst:由于应用程序是.NET,所以CLR将启动并运行。但是,被调用的特定函数可能不会被打乱,所以您的关注是有效的。 – 2011-05-23 21:13:17

回答

3

你试图做一些棘手的,我不是它是什么非常清楚。从你的描述,你至少有四两件事:

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

其中一些你可以控制(即源代码为),其中一些没有。

你想用你调用一个过程“注入”改变模块你拥有控制权调用模块,您拥有控制权。为了做到这一点,您正在使用一种工具,要求您在进程的地址空间中有一个非托管入口点。

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

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

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

最后,你可以使用这种方法调用受管DLL(无法控制的托管DLL)中的private方法吗?不,不是直接。然而,它是一个托管的DLL,所以它必须有一个对任何人都有用的入口点,你可以调用这些DLL入口点。如果这还不够,你可以使用反思C++/CLI调用私有方法并访问私有成员。

1

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

+0

我试图注入一个托管的DLL,它编译得很好,但是,我不能在DllMain上启动我的线程,因为它在运行时给我一个错误:''尝试在本地期间使用本地组件中的MSIL代码代码初始化“(即使我没有在初始化时使用MSIL代码),但我必须使用DllMain,因为目标.exe不会调用我的DLL中的任何方法,这意味着我不能任何东西,直到.exe完全加载。 – 2011-05-23 22:29:42

+0

@Flavio:把DllMain放在一个没有'/ clr'的文件中,然后把所有东西链接在一起。 – 2011-05-23 23:45:25