首页
社区
课程
招聘
[讨论]关于获取类成员函数地址的问题
发表于: 2015-10-27 19:30 6444

[讨论]关于获取类成员函数地址的问题

bxc 活跃值
6
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期)

收藏
免费 0
支持
分享
最新回复 (5)
雪    币: 261
活跃值: (51)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
我用VS2015测试取出来的是对的

为何不用union来取成员函数的地址呢?直观又方便
2015-10-27 23:12
0
雪    币: 7048
活跃值: (3527)
能力值: ( LV12,RANK:340 )
在线值:
发帖
回帖
粉丝
3
可以给个实例吗,谢了~
2015-10-28 01:14
0
雪    币: 30031
活跃值: (2477)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
4
VMT也可以的,还所有语言通用。
2015-10-28 03:04
0
雪    币: 261
活跃值: (51)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
class C
{
public:
	void f()
	{
	}
};

int main()
{
	union
	{
		void(*p)();
		void(C::*f)();
	} u;
	u.f = &C::f;
	printf("%p\n", u.p);
    return 0;
}
2015-10-28 08:41
0
雪    币: 7048
活跃值: (3527)
能力值: ( LV12,RANK:340 )
在线值:
发帖
回帖
粉丝
6
3Q~
2015-10-28 12:57
0
游客
登录 | 注册 方可回帖
返回
//