最近学习了一下外挂的原理,主要是一些内存操作。然后在这个过程中我发现了一个——类成员函数的地址好像从类外直接获取不到(静态函数除外)。
下面我从网上找到了一个很巧妙的方法:用联合体获取类成员函数地址
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版本的话 会带很多调试信息。。