首页
社区
课程
招聘
[求助][讨论]产生类的实例的时候,是否会在内存中重新分配函数代码,如果分配,那么是在哪个段?
发表于: 2012-6-27 09:46 5507

[求助][讨论]产生类的实例的时候,是否会在内存中重新分配函数代码,如果分配,那么是在哪个段?

2012-6-27 09:46
5507
我在想一个对象是如何将函数和变量成员连接起来的。

变量成员是在运行时分配的,那么它就占了一块内存空间,那么函数的代码要紧挨着这些成员的话,那么就必须是函数的代码也是动态分配出来的。

是这样的吗?

动态分配:
{
虚函数表
变量1

函数1

}

还是说函数的代码一直都处于代码段,只是用其它的方式产生的对象罢了。并没有再次拷贝成员函数代码到新类的实例中?

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (11)
雪    币: 128
活跃值: (27)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
2
函数不占用 你创建实例的 内存

动态分配:
{
虚函数表 【这个是指针】 指向虚函数表(表里面有虚函数1 2 3 4 5 等等,不是虚函数的也不会在这里)
变量1

函数1 【这个没有】

}
2012-6-27 09:50
0
雪    币: 73
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
那函数1是如何联合成类的呢,假设我在逆向中发现了一个类实例的指针,我该如何定位到该类的成员函数呢?
2012-6-27 09:54
0
雪    币: 128
活跃值: (27)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
4
你从一个类实例指针,遍历虚函数倒是可以从那个虚函数表指针, 但不能遍历出该类的所有普通成员函数啊,
应该只能自己看那个实例的指针被传递到进哪个函数,并且this通常不是 push 传参,而是放ecx
2012-6-27 10:11
0
雪    币: 118
活跃值: (20)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
首先说下,函数是不暂对象的内存空间的

函数就像是一个公共库,它的位置是固定的,只有一份。

在编译代码时,所以的函数生成的位置,编译器肯定是知道,你调用所有的成员函数(非虚函数), 都是绝对调用
call  xxxxxx,  而虚函数   就是取虚表的第几项去调用       虚表里函数的位置  在编译的时候也确定拉
2012-6-27 10:22
0
雪    币: 118
活跃值: (20)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
如果是虚函数的,就去这个实例构造的时候,因为构造时,会把虚表赋值给你的实例。

根据虚表,你就可以拿到他所有的虚函数。

而成员函数,只能是他调用了什么函数,你就逆什么函数。

并没有直接对应的关系····
2012-6-27 10:23
0
雪    币: 31
活跃值: (48)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
7
个人认为,成员函数包括虚函数只有一份。成员变量归每个类的实例所有,根据this对对象操作。
2012-6-27 11:15
0
雪    币: 73
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
那么意思就是说,当我修改一个普通成员函数的代码内容时,将导致拥有该成员函数的所有类的实例都改变。
2012-6-27 11:29
0
雪    币: 73
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
那么虚表调用是否是call dword ptr[虚表指针+size*表项] 、
2012-6-27 11:30
0
雪    币: 3253
活跃值: (3296)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
10
在编译的过程中 基本都 成了 call dword ptr[虚表指针+size*表项] 来调用相关的成员函数了 , 你在逆向这一过程的时候应该能注意到   

那么意思就是说,当我修改一个普通成员函数的代码内容时,将导致拥有该成员函数的所有类的实例都改变。 这句我是没明白什么意思

你修改成员函数的实现代码 也仅仅只局限于此, 影响不到对象的内存中的变化,  不过会影响与这个函数相关的 成员变量和返回值
2012-6-27 11:48
0
雪    币: 73
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
[QUOTE=小调调;1083048]在编译的过程中 基本都 成了 call dword ptr[虚表指针+size*表项] 来调用相关的成员函数了 , 你在逆向这一过程的时候应该能注意到   

那么意思就是说,当我修改一个普通成员函数的代码内容时,将导致拥有该成员函数的所有类的实例都改变。 这句我是没明白什么意思

你修改成员函数的...[/QUOTE]

假设一个类的普通成员函数被多个派生对象调用的情况下,那么我修改了这个成员函数内的"赋值"代码,将会影响到所有派生类的结果不是吗。
2012-6-27 12:16
0
雪    币: 73
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
而跟踪普通成员函数看来唯一的办法就只有通过判断call XXXXXXX的ecx传值来看它是否为一个类的成员函数了。this指针
2012-6-27 12:18
0
游客
登录 | 注册 方可回帖
返回
//