繁体   English   中英

获取成员函数的内存地址?

[英]Get memory address of member function?

如何在C++中获取成员函数的绝对地址? (我需要这个来重击。)

成员函数指针不起作用,因为我无法将它们转换为绝对地址( void * )——我需要知道内存中实际函数的地址,而不仅仅是相对于类型的地址。

存在获取 MSVC 中成员函数地址的语法(从 MSVC 2005 恕我直言)。 但这很棘手。 而且,获得的指针无法通过常规方式转换为其他指针类型。 尽管有一种方法可以做到这一点。

这是示例:

// class declaration
class MyClass
{
public:
    void Func();
    void Func(int a, int b);
};

// get the pointer to the member function
void (__thiscall MyClass::* pFunc)(int, int) = &MyClass::Func;

// naive pointer cast
void* pPtr = (void*) pFunc; // oops! this doesn't compile!

// another try
void* pPtr = reinterpret_cast<void*>(pFunc); // Damn! Still doesn't compile (why?!)

// tricky cast
void* pPtr = (void*&) pFunc; // this works

即使使用reinterpret_cast传统演员也不起作用这一事实可能意味着 MS 不强烈推荐这种演员。

不过你可以这样做。 当然这都是依赖于实现的,你必须知道适当的调用约定来进行 thunking + 具有适当的汇编技能。

试试这个。 应该让你把任何东西都投给任何东西:)

template<typename OUT, typename IN>
OUT ForceCast( IN in )
{
    union
    {
        IN  in;
        OUT out;
    }
    u = { in };

    return u.out;
};

然后

void* member_address = ForceCast<void*>(&SomeClass::SomeMethod);

默认情况下,C++ 成员函数使用 __thiscall 调用约定。 为了绕开成员函数,trampoline 和 detour 必须与目标函数具有完全相同的调用约定。 不幸的是,VC 编译器不支持 __thiscall,因此创建合法的 detour 和 trampoline 函数的唯一方法是使它们成为“detour”类的类成员。

此外,C++ 不支持将指向成员函数的指针转换为任意指针。 要获得原始指针,必须将成员函数的地址移动到临时成员函数指针中,然后通过获取它的地址,然后取消引用它来传递。 幸运的是,编译器会优化代码以去除多余的指针操作。

来自 Microsoft Detour 库。 他们处理代码注入并讨论获取非虚拟成员函数的地址。 当然,它是编译器实现特定的东西。

你可以在这里找到图书馆http://research.microsoft.com/en-us/downloads/d36340fb-4d3c-4ddd-bf5b-1db25d03713d/default.aspx

对于仍在寻找获取函数的内存地址(而不是跳转)的答案的任何人,这是我的解决方案:

UINT32 RelativityToTrampoline = *(UINT32*)((UINT64)&Func + 1);
UINT64 RealFuncAddr = (UINT64)&Func + RelativityToTrampoline + 5;

暂无
暂无

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

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