逆向分析c++ vector向量
测试源码
#include<stdio.h>
#include<stdlib.h>
#include <iostream>
#include <vector>
#include <list>
#include <map>
using namespace std;
struct MyVector
{
struct MyVector* pSelf;
int* pDataStart;
int* pDataEnd;
int* pBufEnd;
};
void testVector() {
// 动态数组,数据存储在堆内存中
// 当元素发生改变之后,会动态增加内存。
vector<int> vecObj;
vecObj.push_back(1);
vecObj.push_back(2);
vecObj.push_back(3);
vecObj.pop_back();
vecObj.push_back(4);
// 遍历vector
for (size_t i = 0; i < vecObj.size(); i++)
{
printf("vecObj[%d] = %d", i, vecObj[i]);
}
// 遍历vector
vector<int>::iterator iter = vecObj.begin();
while (iter != vecObj.end())
{// iter.operator!=(vecObj.end())
int n = *iter;
printf("vecObj i = %d", n);
int main()
{
testVector();
getchar();
return 0;
}
2.编译
3.去掉随机基址(为了容易查找)
改为0
4.用ida打开 找到 main函数中调用函数
5.选择地址用od 载入查看
6.call非常多 只看关键的找到 向量的构造函数 与对象基址 找东西用ida 调试用od
7。运行到下断处 数据跟随
果然 是cc
8。运行构造函数
初始化 (stl对象都有一个特点 第一个总是一个指针指向自己)
指向自己
运行push_back(1)
进去看看 果然
那其它俩个字段呢 慢慢来 再push几个 试试
push 3 个
再pop一个看看
没变 只是第三个字段减小了 而最后一个不变
再push 一个 发现第三个就了最后一个还是不变
进入看看
原来pop内存不变只是 索引减小
那都表示什么 呢
第三个 表示为最后一个元素地址 第四个为缓冲区的最后一个元素地址
自己定义一个结构体去解析它