0x0 概述
最近学习arm32的逆向分析,写了一些代码,对照着汇编看。下边分析了对象数组的汇编实现。
0x1 c语言
c语言代码如下:
#include <stdio.h>
class CNumber{
public:
CNumber(){
m_nNumber=1;
m_fNumber=0.1;
}
~CNumber(){
printf("~CNumber\r\n");
}
int m_nNumber;
float m_fNumber;
};
int main(int argc,char **argv){
CNumber *pNumber=NULL;
pNumber=new CNumber[3];
if(pNumber!=NULL){
delete[] pNumber;
pNumber=NULL;
}
}
0x2 对象数组的分配
汇编如下:
对象数组的的内存结构是首先保存对象的大小,然后紧跟对象数组的个数,后边才是每一个对象,其内存结构如下:
sizeof(CNumber) |
3 |
CNumber[0] |
CNumber[1] |
CNumber[2] |
0x3 构造函数
对象数组分配完成后,就就要对每一个对象调用构造函数。构造函数要传入this指针,即每个对象的首地址。其汇编如下:
构造函数的识别有以下几点:1.第一个调用的函数。2.传入this指针。3.返回this指针。构造函数的汇编如下:
0x3析构函数
调用析构函数时,就用到了对象数组保存的对象个数,然后调用每一个对象的析构函数。
0x4 delete[]
调用delete[]的时候传入的地址为对象数组的地址。如果分配了对象数组,调用了delete而不是得delete[]的话,就会忽略掉对象数组的前两个元素,会出现问题。
0x5总结
写的东西比较基础,主要是用来备忘,打好基本功。