数据结构逆向分析-Vector

这个应该是家喻户晓了的东西把,如果说C/C++程序员Vector都不用的话,可能就是一个不太好的程序员。

Vector就是一个STL封装的动态数组,数组大家都知道是通过连续的地址空间来处理的,vector的原理就是如果原来的不够了要扩展,就会开辟一段更大的内存,然后将原来的内容再复制到新的内存里面,释放掉原来的,然后再插入要扩充的。

Vector常用Api:

push_bak()  //尾部插入数据
Insert() //插入数据


pop_back() //删除尾部数据
erase() //删除数据

逆向分析:

插入数据

尾部插入

首先是最简单的,一直往里面插入数据

#include<iostream>
#include<vector>
using std::vector;

int main()
{
vector<int> MyVector;
MyVector.push_back(100);
MyVector.push_back(600);
MyVector.push_back(200);
MyVector.push_back(300);
MyVector.push_back(1000);
MyVector.push_back(150);


return 0;
}

一个只创建了的vector的大小只有16

然后通过内存来查看:

指向的这个地址:

又指回去了。

画个图就是这个样子:

跑第一条插入数据的指令:

    MyVector.push_back(100);

内存变成了这样:

这个vector指向的内容还是没有改变。

然后新加入了三个挨着的地址:

目前的情况来看,应该是vector的第二个内容是数组的首地址,然后第三第四个内容是数组的结束地址。

执行:

    MyVector.push_back(600);

变成了这样:

比较奇怪的是,如果是后面两个字段表示数组的结束地址,为什么会要两个字段来存放,一个就够了呀,肯定有问题,所以我这里多push几个,且观察这两个字段有没有值不一样的情况出现。

当执行完第五个push_back的时候终于变化了:

查看一下我们这个MyVector的数据结构:

capacity是指不再分配内存的情况下容器的容量,然后size是指容器当前存放了的大小。再对比我们在内存中的情况,那么很有可能就是size就是第三个字段地址减去第二个字段数组首地址,然后除以结构体大小得到的内容,而capacity容器大小就是最后一个字段和第二个字段数组首地址之间的差值。

再往下执行一个看看:

    MyVector.push_back(150);

破案了,就是我们想的那样,vector会开辟一段空间,然后往里面加内容,如果超过了容器大小再重新开辟一个。

任意位置插入数据:

红色表示数据改动过,其实就是相当于往后移动,然后再插入进去,就是正常C语言里面会有的动态数组的操作。

删除数据

尾部删除

这里你会发现,用尾删除的办法来说,并没有删除掉这块地址,只是把范围往上移动了。

任意位置删除:

这里也没有删除,只是把后面往前移动了,然后vector的数组大小又缩小:

实质数组大小和容器大小是不一样的

总结

vector就是一个封装好了动态数组,里面采取的还是C里面的动态数组的思想,只不过引入了容器大小的概念用的时候稍微会比纯C动态数组效率高。

数据结构逆向分析-Vector的更多相关文章

  1. 数据结构逆向分析-List

    数据结构逆向分析-List 首先STL中的List就是一个链表,但是肯定C++用了很多封装,所以这里我们来一探究竟. 开始 首先先写一些简单的分析的源代码: #include<iostream& ...

  2. 数据结构逆向分析-Map

    数据结构逆向分析-Map map是一个典型的二叉树结构,准确的来说是一个平衡二叉树或者红黑树,特点是数据存储是有序的存储. 参考侯杰老师的stl源码剖析,map里面采用的是RB-TREE也就是红黑树 ...

  3. C++反汇编与逆向分析技术揭秘

    C++反汇编-继承和多重继承   学无止尽,积土成山,积水成渊-<C++反汇编与逆向分析技术揭秘> 读书笔记 一.单类继承 在父类中声明为私有的成员,子类对象无法直接访问,但是在子类对象的 ...

  4. 一文了解安卓APP逆向分析与保护机制

    "知物由学"是网易云易盾打造的一个品牌栏目,词语出自汉·王充<论衡·实知>.人,能力有高下之分,学习才知道事物的道理,而后才有智慧,不去求问就不会知道."知物 ...

  5. RE-1 逆向分析基础

    逆向分析基础 0x01-0x0C 本笔记使用汇编指令为x86架构下汇编指令,ARM架构汇编指令不做介绍 0x01. 关于RE 逆向工程(Reverse Engineering RE) 逆向分析方法: ...

  6. 从Android设备中提取内核和逆向分析

    本文博客链接:http://blog.csdn.net/qq1084283172/article/details/57074695 一.手机设备环境 Model number: Nexus 5 OS ...

  7. 【C++】从零开始的CS:GO逆向分析1——寻找偏移与基址的方法

    [C++]从零开始的CS:GO逆向分析1--寻找偏移与基址的方法   前言:此文章主要用于提供方法与思路,fps游戏基本都能如此找偏移,文章里找的偏移比较少,主要用来演示寻找思路,文章的后记中会附一个 ...

  8. IM通信协议逆向分析、Wireshark自定义数据包格式解析插件编程学习

    相关学习资料 http://hi.baidu.com/hucyuansheng/item/bf2bfddefd1ee70ad68ed04d http://en.wikipedia.org/wiki/I ...

  9. 技术分享:逆向分析ATM分离器

    文章内容仅供技术交流,请勿模仿操作! 背景(作者) 每一次外出时, Elizabeth和我总是格外的小心,同时把我们身上的钱藏在特殊的皮带上面,这样还不够,我们还采取了“狡兔三窟”的方式来藏身上带的银 ...

随机推荐

  1. Notepad++的NppFTP插件连接linux操作系统

    Notepad++的NppFTP插件连接linux操作系统 下载地址:https://notepad-plus-plus.org/downloads/v8.1.2/ 1.安装Npp_FTP插件 两种方 ...

  2. Manage Historical Snapshots in Sonarqube

    Login as admin, go to a dashboard of a project, then click "Configuration -> History" a ...

  3. 【笔记】ROC曲线

    ROC曲线 前文讲了PR曲线 这里说ROC曲线,其描述的是TPR和FPR之间的关系 TPR是什么呢,TPR就是召回率 FPR是什么呢,FPR就是和TPR对应的,即真实值为0的一行中的预测为1的部分比例 ...

  4. 用三个while循环和tkinter实现一个显示屏

    用三个while循环和tkinter实现一个显示屏 import tkinter as tk import time # 输入框是跟程序打交道的一个途径,例如程序要求你输入账号密码,那么它就需要提供两 ...

  5. 使用Java8改造出来的模板方法真的是yyds

    GitHub 21.3k Star 的Java工程师成神之路,不来了解一下吗! GitHub 21.3k Star 的Java工程师成神之路,真的不来了解一下吗! 我们在日常开发中,经常会遇到类似的场 ...

  6. COM笔记-动态链接

    在实现了IUnknown之后,组件和客户之间只是一种非常松散的连接,这使用组件和客户各自可以发生变化而不会对对方造成什么影响. 下面讨论如何将组件放入到动态链接库(dll)中. 关于DLL更多内容可以 ...

  7. python编程指南

    1.python文件引入同一个模块的python文件, 在命令行执行的时候需要定位到模块内部,加入参数PYTHONPATH=../ 在pycharm中  import package一般都是按照绝对路 ...

  8. Python中的reduce()函数

    reduce()函数也是Python内置的一个高阶函数.reduce()函数接收的参数和 map()类似,一个函数 f,一个list,但行为和 map()不同,reduce()传入的函数 f 必须接收 ...

  9. 使用Eclipse搭建SSM框架(Spring + Spring MVC + Mybatis)

    1.创建项目 1)打开Eclipse,点击File --> New --> Other 2)输入maven,找到Maven Project 3)然后一直按Next,直到出现一下界面: 4) ...

  10. [转]dd大牛的《背包九讲》

    P01: 01背包问题 题目 有N件物品和一个容量为V的背包.第i件物品的费用是c[i],价值是w[i].求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大. 基本思路 这是最 ...