-
-
[讨论]关于获取类成员函数地址的问题
-
发表于:
2015-10-27 19:30
6444
-
参考了:
http://bbs.pediy.com/showthread.php?t=47835 的里提到的:
#include <stdio.h>
#include <stdarg.h>
class C
{public:
void f() {}
};
int func(int unused,...)
{
va_list args;
va_start(args,unused);
return va_arg(args,int);
}
void main()
{
printf("%p\n",func(0,C::f));
}
发现在VS2015下编译通过,但是取得的地址并不是成员函数的地址。
我的部分代码:
int getclsfuncaddr(int unused, ...)
{
int ret;
va_list args;
va_start(args, unused);
ret = va_arg(args, int);
va_end(args);
return ret;
}
int main()
{
...
xx = getclsfuncaddr(0, &CMyWnd::Create);
...
}
反汇编之后的代码:
...
0FA21EBB |> \68 961FA20F push NAC.CMyWnd::`vcall'{84}'
0FA21EC0 |. 6A 00 push 0x0
0FA21EC2 |. E8 99FFFFFF call NAC.getclsfuncaddr
...
0FA21F96 NAC.CMyWnd::`vcall'{84}' . 8B01 mov eax, dword ptr ds:[ecx]
0FA21F98 . FF60 54 jmp dword ptr ds:[eax+0x54]
0FA21F9B NAC.AfxNewHandler . E9 21040000 jmp NAC.AfxThrowMemoryException
...
可见&CMyWnd::Create该成员函数的地址在编译时push的是0x0FA21F96.而该地址处只有3条指令,有经验的人应该一眼就看出来了,这并不是标准VC++函数入口的样式。
因为是release版本的,并且CMyWnd::Create没有其它的引用了,发现该函数好像被编译器优化掉了。
但是取地址操作为什么返回的是这3条指令的地址呢?
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)