【问题标题】:How can I store the address of a non member function in a DWORD (c++)如何将非成员函数的地址存储在 DWORD (c++) 中
【发布时间】:2014-04-23 04:00:58
【问题描述】:

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

DWORD AddressOfDllFunction;

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

struct->AddressOfDllFunction = DllFunction; 

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

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

【问题讨论】:

    标签: c# c++ pointers memory-mapped-files createremotethread


    【解决方案1】:

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

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

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

    您可以使用LPTHREAD_START_ROUTINE,而不是自己定义它。

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

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

    【讨论】:

    • 哈哈,谢谢!我知道我忽略了一些明显的东西。我已经习惯阅读不为 IPC 使用 void*,以至于我没有想到大多数人不想使用的原因正是我想要使用的原因。
    猜你喜欢
    • 2012-06-22
    • 2013-11-22
    • 1970-01-01
    • 2014-08-12
    • 1970-01-01
    • 1970-01-01
    • 2011-12-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多