用联合体获取类成员函数地址

最近学习了一下外挂的原理,主要是一些内存操作。然后在这个过程中我发现了一个——类成员函数的地址好像从类外直接获取不到(静态函数除外)。
下面我从网上找到了一个很巧妙的方法:用联合体获取类成员函数地址

template<typename dst_type,typename src_type>
dst_type union_cast(src_type src)
{
    union{
        src_type s;
        dst_type d;
    }u;
    u.s = src;
    return u.d;
}

这是类型转换函数
可以这样调用:

    typedef void (A::*Good)(void);
    typedef void (*Golobal)(void);
    cout<<union_cast<Golobal,Good>(&A::good);

这样就可以获得全局地址了。可以用OD打开看一下输出的地址位置是什么指令,打开OD可以发现这个地址是这样一个指令 jmp XXXXX
而且那一片指令都是这个,不难猜测是函数的地址表。虽然这样是获得了函数的可调用地址,但这还不是函数真正的地址。
~~~~~~~~编辑后~~~~~~~~~~~~
后来我用Release版本才发现 这是真正的地址。。如果是Debug版本的话 会带很多调试信息。。

Guess you like

Origin blog.csdn.net/qq_16952303/article/details/51722417