5

所以,我有一个用 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
....
4

2 回答 2

3

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

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

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

您想使用您称为“注入”的过程来更改您无法控制的模块以调用您可以控制的模块。为此,您使用的工具要求您在进程的地址空间中有一个非托管入口点。

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

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

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

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

于 2011-05-23T21:14:23.383 回答
1

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

于 2011-05-23T21:14:27.140 回答