C++逆向之从内存角度看继承和多重继承

C++中,类之间的关系与现实社会非常相似。类的继承与派生是一个从抽象到具体的过程。抽象类没有实例。具体类可以存在实例。
指向父类对象的指针除了可以操作父类对象外,还能操作子类对象,指向子类对象的指针不能操作父类对象。
如果强制将父类对象的指针转化为子类对象的指针

1
CDerive *pDerive = (CDerive *)&base; //base为父类对象,CDerive继承自base

这条语句虽然可以编译通过,但是存在潜在的危险。

C++逆向之虚函数

虚函数是面向对象程序设计的关键组成部分。上一篇介绍构造函数和析构函数识别方法。对于具有虚函数的类而言,构造函数和析构函数识别流程更加简单。而且,在类中定义了虚函数后,如果没有提供默认的构造函数,编译器必须提供默认的构造函数。

C++逆向之构造函数和析构函数

构造函数与析构函数是类的重要组成部分,它们在类中担任着至关重要的工作。构造函数常用来完成对象生成时数据初始化工作,而析构函数则常用于销毁时释放对象中所申请的资源。
当对象生成时,编译器会自动产生调用其类构造函数的代码,在编码过程中可以为类中的数据成员赋予恰当的初始值。当对象销毁时,编译器同样也会产生调用其类析构函数的代码。

C++逆向之结构体和类

在C++中,结构体和类都具有构造函数、析构函数和成员函数,两者只有一个区别:结构体的访问控制默认为public,而类的默认访问控制是private。对于C++中的结构体而言,public、private、protected的访问控制都是在编译期进行检查,当越权访问时,编译过程中会检查出此类错误并给予提示。编译成功后,程序在执行的过程中不会在访问控制方面做任何检查和限制。因此,在反汇编中,C++中的结构体与类没有分别,两者的原理相同,只是类型名称不同。

C++逆向之数组和指针的寻址

虽然数组和指针都是针对地址操作,但他们有许多不同之处。数组是相同数据类型的数据集合,以线性方式连续存储在内存中;而指针只是一个保存地址值的4字节变量。在使用中,数组名是一个地址常量值,保存数组首元素地址,不可修改,只能以此为基地址访问内存数据;而指针却是一个变量,只要修改指针中所保存的地址数据就可以随意访问,不受约束。