首页
社区
课程
招聘
VC 逆向研究的一点心得
发表于: 2006-7-21 11:25 4145

VC 逆向研究的一点心得

2006-7-21 11:25
4145
编译器 VC6

1. 类的虚函数

   class CClassA  
{
public:
        CClassA();
        virtual ~CClassA();
public:
        int a;
        void fn1();

        virtual void fn2();
        virtual void fn3();
};

class CClassB : public CClassA
{
        public:
        CClassB();
        virtual ~CClassB();
public:
        int a;
        void fn1();

        virtual void fn3();
        virtual void fn4();
};

所有虚函数会出现在虚函数表(VTAB)中, 在VC编译模式下
虚函数表的第一项指向类析构函数. 父类的虚函数排在较前的位置
子类在构造时子类的虚表覆盖了父类的虚表
虚表放在类实例空间的第一个DWORD, 此后是类的数据成员

如下形式的ASM调用, 则类实例是动态创建的
.text:004011B8     mov     eax, [esi]
.text:004011BA     mov     ecx, esi
.text:004011BC     mov     byte ptr [esp+20h+var_4], 0
.text:004011C1     call    dword ptr [eax+8]
.text:004011C4     mov     ecx, esi
.text:004011C6     call    sub_401060        //类普通成员函数
.text:004011CB     mov     edx, [esi]
.text:004011CD     mov     ecx, esi
.text:004011CF     call    dword ptr [edx+4]        //虚函数
.text:004011D2     mov     eax, [esi]
.text:004011D4     mov     ecx, esi
.text:004011D6     call    dword ptr [eax+0Ch]        //静态创建的类不会有此汇编形式
                                                //直接是函数地址

ESI指向类实例首地址.

如果一个函数在二个虚表中出现, 则此函数在子类中没有实现. 为调用父类虚函数
如果子类有重新实现虚函数, 则此虚函数在父类和子类中各有实现, 虚表中不会重
复出现

[课程]Linux pwn 探索篇!

收藏
免费 0
支持
分享
最新回复 (2)
雪    币: 44229
活跃值: (19965)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
2
文章不错,希望篇幅长些。;)
《黑客反汇编》这本书里也有相关内容
2006-7-21 11:26
0
雪    币: 8155
活跃值: (1880)
能力值: ( LV8,RANK:122 )
在线值:
发帖
回帖
粉丝
3
老大回应真快啊, 继续努力研究
2006-7-21 11:28
0
游客
登录 | 注册 方可回帖
返回
//