0

我想这样做的原因是:我有 ac#winforms 应用程序和一个将被注入另一个进程的 c++ DLL。从 c# 应用程序中,我想使用远程进程地址空间内的非成员函数的地址调用 CreateRemoteThread()。我设置了一个 MemoryMappedFile 以允许 DLL 和应用程序共享一个包含我想要的任何变量的结构,目前它只包含:

DWORD AddressOfDllFunction;

如果 DWORD 不是在这里使用的最佳类型,那么我可以使用不同的类型,我只是想确保变量中有足够的空间来保存指针,结构的 C# 版本包含相同的变量,除了它的类型是 IntPtr。远程进程是一个 32 位进程,但如果我可以免费获得 64 位支持,那也很好。我试着做:

struct->AddressOfDllFunction = DllFunction; 

但这不起作用。我尝试使用它和一些类型转换无济于事。我所做的所有搜索都是人们希望做同样的事情,但我收集到的成员函数是不可能的,因为您需要对象实例和函数的地址。我觉得这很简单,而且我遗漏了一些明显的东西,我对 c++ 很陌生,虽然我已经使用 .Net 很长时间了,但我几乎从未使用过指针。总而言之,当从 C# 中的 MMF 读取时,我需要 structs 数据类型中的变量能够自动解释为 IntPtr,并且我需要该变量的内容是远程进程地址中 DLL 函数的地址空间。

感谢您的阅读,感谢任何和所有建设性的帮助!

4

1 回答 1

2

您应该使用指针而不是DWORD. 在 C# 方面IntPtr可能没问题。也许一个代表会更好。没有代码很难确定。

在 C++ 方面,您可以使用void*但更好的可能是正确类型的函数指针:

typedef DWORD (__stdcall *ThreadProc)(void*);

您可以使用LPTHREAD_START_ROUTINE.

这些选项中的任何一个都适用于 32 位和 64 位。

但是,请注意注入的 DLL 必须与目标进程具有相同的位数。您不能将 64 位 DLL 注入 32 位进程,反之亦然。更重要的是,您不能通过从 32 位进程调用来注入 64 位CreateRemoteThread进程。

于 2014-04-23T05:02:22.067 回答