数据结构逆向分析-Vector
数据结构逆向分析-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的更多相关文章
- 数据结构逆向分析-List
数据结构逆向分析-List 首先STL中的List就是一个链表,但是肯定C++用了很多封装,所以这里我们来一探究竟. 开始 首先先写一些简单的分析的源代码: #include<iostream& ...
- 数据结构逆向分析-Map
数据结构逆向分析-Map map是一个典型的二叉树结构,准确的来说是一个平衡二叉树或者红黑树,特点是数据存储是有序的存储. 参考侯杰老师的stl源码剖析,map里面采用的是RB-TREE也就是红黑树 ...
- C++反汇编与逆向分析技术揭秘
C++反汇编-继承和多重继承 学无止尽,积土成山,积水成渊-<C++反汇编与逆向分析技术揭秘> 读书笔记 一.单类继承 在父类中声明为私有的成员,子类对象无法直接访问,但是在子类对象的 ...
- 一文了解安卓APP逆向分析与保护机制
"知物由学"是网易云易盾打造的一个品牌栏目,词语出自汉·王充<论衡·实知>.人,能力有高下之分,学习才知道事物的道理,而后才有智慧,不去求问就不会知道."知物 ...
- RE-1 逆向分析基础
逆向分析基础 0x01-0x0C 本笔记使用汇编指令为x86架构下汇编指令,ARM架构汇编指令不做介绍 0x01. 关于RE 逆向工程(Reverse Engineering RE) 逆向分析方法: ...
- 从Android设备中提取内核和逆向分析
本文博客链接:http://blog.csdn.net/qq1084283172/article/details/57074695 一.手机设备环境 Model number: Nexus 5 OS ...
- 【C++】从零开始的CS:GO逆向分析1——寻找偏移与基址的方法
[C++]从零开始的CS:GO逆向分析1--寻找偏移与基址的方法 前言:此文章主要用于提供方法与思路,fps游戏基本都能如此找偏移,文章里找的偏移比较少,主要用来演示寻找思路,文章的后记中会附一个 ...
- IM通信协议逆向分析、Wireshark自定义数据包格式解析插件编程学习
相关学习资料 http://hi.baidu.com/hucyuansheng/item/bf2bfddefd1ee70ad68ed04d http://en.wikipedia.org/wiki/I ...
- 技术分享:逆向分析ATM分离器
文章内容仅供技术交流,请勿模仿操作! 背景(作者) 每一次外出时, Elizabeth和我总是格外的小心,同时把我们身上的钱藏在特殊的皮带上面,这样还不够,我们还采取了“狡兔三窟”的方式来藏身上带的银 ...
随机推荐
- 深入了解jvm-2Edition-虚拟机字节码执行引擎
1.概述 Java虚拟机规范制定了虚拟机字节码执行引擎的概念模型,本章主要从概念模型层次来探究虚拟机的方法调用和字节码执行. 方法调用中,最核心的,是如何确定调用的方法,也就是方法的分派. 字节码执行 ...
- Go语言笔记[实现一个Web框架实战]——EzWeb框架(一)
Go语言笔记[实现一个Web框架实战]--EzWeb框架(一) 一.Golang中的net/http标准库如何处理一个请求 func main() { http.HandleFunc("/& ...
- 【死磕 Java 基础】— 我同事一个 select 分页语句查出来了 3000W 条数据
大家好,我是大明哥,一个专注于[死磕 Java]系列创作的男人 个人网站:https://www.cmsblogs.com/.专注于 Java 优质系列文章分享,提供一站式 Java 学习资料 某天我 ...
- NOIP 模拟 $33\; \rm Hunter$
题解 \(by\;zj\varphi\) 结论题. 对于 \(1\) 猎人,他死的期望就是有多少个死在它前面. 那么对于一个猎人,它死在 \(1\) 前的概率就是 \(\frac{w_i}{w_i+w ...
- labuladong 05.16 微信直播
labuladong 05.16 微信直播 一.基础: 1.校招相关 1)扫盲 秋招:8-10月 提前批:7月 暑期实习:3-5月 非必须 2)关注公司前景,部门信息,公司财报 企查查,天眼查,多获取 ...
- redisson 分布式加锁
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring- ...
- qt 中的QlistWidget
- wpf中INotifyPropertyChanged的用法
using System;using System.Collections.Generic;using System.ComponentModel;using System.Linq;using Sy ...
- Flink 保证ExactlyOnce
Flink 保证 ExactlyOnce 1.使用执行ExactlyOnce 的数据源,比如 kafka 2.使用FlinkConsumer,开启CheckPointing,偏移量会保存通过Check ...
- opencv入门系列教学(四)处理鼠标事件
一.鼠标事件的简单演示 opencv中的鼠标事件,值得是任何与鼠标相关的任何事物,例如左键按下,左键按下,左键双击等.我们先来看看鼠标事件有哪些,在python中执行下面代码: import cv2 ...