能力值:
( LV5,RANK:60 )
|
-
-
2 楼
函数不占用 你创建实例的 内存
动态分配:
{
虚函数表 【这个是指针】 指向虚函数表(表里面有虚函数1 2 3 4 5 等等,不是虚函数的也不会在这里)
变量1
…
函数1 【这个没有】
…
}
|
能力值:
( LV2,RANK:10 )
|
-
-
3 楼
那函数1是如何联合成类的呢,假设我在逆向中发现了一个类实例的指针,我该如何定位到该类的成员函数呢?
|
能力值:
( LV5,RANK:60 )
|
-
-
4 楼
你从一个类实例指针,遍历虚函数倒是可以从那个虚函数表指针, 但不能遍历出该类的所有普通成员函数啊,
应该只能自己看那个实例的指针被传递到进哪个函数,并且this通常不是 push 传参,而是放ecx
|
能力值:
( LV2,RANK:10 )
|
-
-
5 楼
首先说下,函数是不暂对象的内存空间的
函数就像是一个公共库,它的位置是固定的,只有一份。
在编译代码时,所以的函数生成的位置,编译器肯定是知道,你调用所有的成员函数(非虚函数), 都是绝对调用
call xxxxxx, 而虚函数 就是取虚表的第几项去调用 虚表里函数的位置 在编译的时候也确定拉
|
能力值:
( LV2,RANK:10 )
|
-
-
6 楼
如果是虚函数的,就去这个实例构造的时候,因为构造时,会把虚表赋值给你的实例。
根据虚表,你就可以拿到他所有的虚函数。
而成员函数,只能是他调用了什么函数,你就逆什么函数。
并没有直接对应的关系····
|
能力值:
( LV3,RANK:20 )
|
-
-
7 楼
个人认为,成员函数包括虚函数只有一份。成员变量归每个类的实例所有,根据this对对象操作。
|
能力值:
( LV2,RANK:10 )
|
-
-
8 楼
那么意思就是说,当我修改一个普通成员函数的代码内容时,将导致拥有该成员函数的所有类的实例都改变。
|
能力值:
( LV2,RANK:10 )
|
-
-
9 楼
那么虚表调用是否是call dword ptr[虚表指针+size*表项] 、
|
能力值:
( LV4,RANK:40 )
|
-
-
10 楼
在编译的过程中 基本都 成了 call dword ptr[虚表指针+size*表项] 来调用相关的成员函数了 , 你在逆向这一过程的时候应该能注意到
那么意思就是说,当我修改一个普通成员函数的代码内容时,将导致拥有该成员函数的所有类的实例都改变。 这句我是没明白什么意思
你修改成员函数的实现代码 也仅仅只局限于此, 影响不到对象的内存中的变化, 不过会影响与这个函数相关的 成员变量和返回值
|
能力值:
( LV2,RANK:10 )
|
-
-
11 楼
[QUOTE=小调调;1083048]在编译的过程中 基本都 成了 call dword ptr[虚表指针+size*表项] 来调用相关的成员函数了 , 你在逆向这一过程的时候应该能注意到
那么意思就是说,当我修改一个普通成员函数的代码内容时,将导致拥有该成员函数的所有类的实例都改变。 这句我是没明白什么意思
你修改成员函数的...[/QUOTE]
假设一个类的普通成员函数被多个派生对象调用的情况下,那么我修改了这个成员函数内的"赋值"代码,将会影响到所有派生类的结果不是吗。
|
能力值:
( LV2,RANK:10 )
|
-
-
12 楼
而跟踪普通成员函数看来唯一的办法就只有通过判断call XXXXXXX的ecx传值来看它是否为一个类的成员函数了。this指针
|
|
|