繁体   English   中英

从 C#.exe 调用 function 与非托管 C++.Z06416233FE5EC4C59133122E4ABZ

[英]Call a function from C# .exe with unmanaged C++ .dll

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

I've made an.exe file that injects a.dll into another.exe, and I've injected this new C++ DLL into the C#.exe, with no problems, the DLLMain is called and so...

But when I inject this DLL into a normal.exe file made with C++, I can call a function in the.exe with its memory address which I can take on IDA.

问题是,面向 object 的程序集在其 function 上没有地址,即使 function 名称被反汇编。

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

如果可能的话,有没有办法可以使用在 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,这会容易得多,您可以只使用反射。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM