数据结构逆向分析-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. IntelliJ IDEA常用的快捷键积累总结

    .personSunflowerP { background: rgba(51, 153, 0, 0.66); border-bottom: 1px solid rgba(0, 102, 0, 1); ...

  2. 【SpringBoot技术专题】「JWT技术专区」SpringSecurity整合JWT授权和认证实现

    JWT基本概念 JWT,即 JSON Web Tokens(RFC 7519),是一个广泛用于验证 REST APIs 的标准.虽说是一个新兴技术,但它却得以迅速流行. JWT的验证过程是: 前端(客 ...

  3. LinuxDHCP配置

    目录 一.DHCP服务 1.1.了解DHCP服务 1.2.使用DHCP的好处 1.3.DHCP的分配方式 1.4.DHCP的租约过程 客户机请求IP地址 重新登录 更新租约 1.5.使用DHCP动态配 ...

  4. Java Swing 盒布局管理器

    Swing 盒布局管理器 因为项目的原因,重新看看swing的东西,在想要将两个横向的容器纵向表示的时候,发现用盒布局 话不多说,直接代码 package ui; import javax.swing ...

  5. SpringBoot开发十三-检查登录状态

    需求介绍-检查登录状态 防止用户知道我们的一些功能的链接,直接就进到了该页面,就像有些功能是管理员访问才能进的,就需要进行登录状态的判断. 我们知道这个功能点很多其他的功能点都需要使用,所以我们需要使 ...

  6. 微信小程序中wx.login和wx.getUserProfile的使用

    在使用微信登录时,通常会在调用wx.login获取code后再通过wx.getUserProfile获取iv和encryptedData(加密数据)一起发到后端进行登录验证 在实际使用中如果在wx.l ...

  7. vue3 自己做一个轻量级状态管理,带跟踪功能,知道是谁改的,还能定位代码。

    上一篇 https://www.cnblogs.com/jyk/p/14706005.html 介绍了一个自己做的轻量级的状态管理,好多网友说,状态最重要的是跟踪功能,不能跟踪算啥状态管理? 因为vu ...

  8. SQL 练习14

    查询两门及其以上不及格课程的同学的学号,姓名及其平均成绩 SELECT Student.SId,Student.Sname,t.不及格课程数,t.平均成绩 from Student, (SELECT ...

  9. 题解 Strange Housing

    传送门 首先想了黑白染色,发现不会染 其实可以考虑如何动态地维护出这个点集 发现题面里对不在点集之中的点之间的连边没有要求 所以考虑不断向图中加点,为了满足要求,每次取一个与当前新图中相连的点 若它与 ...

  10. 物联网协议Coap协议介绍

    COAP协议简介 Coap(Constrained Application Protocol)是一种在物联网世界的类web协议,它的详细规范定义在 RFC 7252.COAP名字翻译来就是" ...