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

map存储的数据是以键值对的形式来存储的,Key:Value
优势:查找数据效率高,因为是平衡二叉树
缺点:插入数据效率低,因为要插入后变成平衡二叉树。

开始分析:
采用比较简单的代码:
#include<map>
using std::map;
using std::pair;
int main()
{
map<int, int> MyMap;
int SizeMap = sizeof(MyMap);
MyMap.insert(pair<int, int>(1, 100));
MyMap.insert(pair<int, int>(2, 300));
MyMap.insert(pair<int, int>(3, 150));
MyMap.insert(pair<int, int>(4, 200));
MyMap.insert(pair<int, int>(5, 170));
MyMap.insert(pair<int, int>(6, 180));
MyMap.insert(pair<int, int>(7, 90));
return 0;
}

然后画图表示一下:这就是初始化一个map的内存图,从分析stl的经验上来看MyMap中的第一个指针指向的这个0081e5f8又指回去了好像stl容器都有个这个东西,猜测来讲没啥用。然后这个后面的0081F5F8很有可能是一个指向整个平衡二叉树的头,然后第三个000很有可能就是一个size来记录节点的个数,当然这是我们的猜测,还要看内存来说话。

执行第一条插入指令:
MyMap.insert(pair<int, int>(1, 100));
成了这样:

再来猜测一下,首先这个MyMap的第一个字段肯定是没啥用了,然后最后一个字段确实是里面的大小,然后第二个字段指向的内容,很有可能是指向来了根节点,然后节点的内容里面,最后两个字段是来存放 key->value键值对的。有一些字段暂时不知道有啥用,继续往下弄几个看看。
执行第二条和第三条指令:
MyMap.insert(pair<int, int>(2, 300));
MyMap.insert(pair<int, int>(3, 150));
首先这里的平衡二叉树应该是这样的:

如果所有箭头都标出来会比较乱,所以这里只用了一些关键的:

由此可以推出来,这个map第二个字段指向的应该是一个总领作用的结构体,其中第二个字段指向的是平衡二叉树的根节点,然后第一个和第三个字段是什么意思暂时不知道,最后一个结束字段的0101也不知道,然后数据节点的话,通过对根节点猜测,第一个字段应该指向的是左节点,第三个字段指向的是右节点。
目前的结果是这样:

再参考侯杰老师的stl源码剖析书后:

可以确定很多东西了:

根据侯杰老师的定义重新写代码分析:
由于目前只有cdcd后面哪两个字节的内容不知道了,这里我选择根据官方书重新写代码来观察这个字段的内容:
#include<map>
using std::map;
using std::pair;
int main()
{
map<int, int> MyMap;
int SizeMap = sizeof(MyMap);
MyMap.insert(pair<int, int>(5, 100));
MyMap.insert(pair<int, int>(6, 300));
MyMap.insert(pair<int, int>(8, 150));
MyMap.insert(pair<int, int>(7, 200));
MyMap.insert(pair<int, int>(11, 170));
MyMap.insert(pair<int, int>(10, 180));
MyMap.insert(pair<int, int>(12, 90));
MyMap.insert(pair<int, int>(13, 400));
MyMap.insert(pair<int, int>(15, 400));
return 0;
}
这里画图太麻烦,我只画比较关键的内容了:

可以看到内容只有0和1,我测试是平衡二叉树的平衡因子,但是不对,如果是平衡因子的画13为啥是0001,由于这个底层是红黑树,所以这里我猜是用来标记红黑的。
红黑树的性质:
规则1:节点是红色或黑色的;
规则2:根节点是黑色的;
规则3:每个叶子节点都是黑色的空节点(NIL节点);
规则4:每个红色节点的两个子节点都是黑色的(从每个叶子到根的所有路径上不可能有两个连续的红色节点);
规则5:从任一节点到其每个叶子节点的所有路径都包含相同数目的黑色节点;
将红黑树的节点默认颜色设置为红色,是为尽可能减少在插入新节点对红黑树造成的影响。
也就是说8肯定是黑色,那么默认是红色的情况下6,11是红色,而红色不能连续,红色的子节点必须是黑色,则5,7,10,13肯定是黑色,而默认是红色,且不会影响别的那么12,15也就是红色。
破案了:情况非常吻合,红色为0000,黑色为0001。
数据结构逆向分析-Map的更多相关文章
- 数据结构逆向分析-List
数据结构逆向分析-List 首先STL中的List就是一个链表,但是肯定C++用了很多封装,所以这里我们来一探究竟. 开始 首先先写一些简单的分析的源代码: #include<iostream& ...
- 数据结构逆向分析-Vector
数据结构逆向分析-Vector 这个应该是家喻户晓了的东西把,如果说C/C++程序员Vector都不用的话,可能就是一个不太好的程序员. Vector就是一个STL封装的动态数组,数组大家都知道是通过 ...
- C++反汇编与逆向分析技术揭秘
C++反汇编-继承和多重继承 学无止尽,积土成山,积水成渊-<C++反汇编与逆向分析技术揭秘> 读书笔记 一.单类继承 在父类中声明为私有的成员,子类对象无法直接访问,但是在子类对象的 ...
- 一文了解安卓APP逆向分析与保护机制
"知物由学"是网易云易盾打造的一个品牌栏目,词语出自汉·王充<论衡·实知>.人,能力有高下之分,学习才知道事物的道理,而后才有智慧,不去求问就不会知道."知物 ...
- Android逆向分析工具表
逆向分析工具表 工具 描述 网址 androidterm Android Terminal Emulator http://code.google.com/p/androidterm/ droidbo ...
- 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游戏基本都能如此找偏移,文章里找的偏移比较少,主要用来演示寻找思路,文章的后记中会附一个 ...
- paip.提升性能---并行多核编程哈的数据结构list,set,map
paip.提升性能---并行多核编程哈的数据结构list,set,map vector/copyonwritearraylist 都是线程安全的. 或者经过包装的list ::: collection ...
随机推荐
- Swagger在线文档使用教程
springboot整合Swagger2 1.首先创建一个springboot工程,在pom文件内导入依赖 <!--swagger依赖--> <!--Swagger2- ...
- git常用命令究极记忆大法
第一点,我觉得也是最最重要的,就是明确git的三个区,工作区(working),暂存区(index),仓库(repository). 第二就是区与区之间的操作了. working与index之间: g ...
- Python - pydantic 入门介绍与 Models 的简单使用
前言 为啥要学这个,因为 FastAPI 是基于它进行开发的,而且是个不错的框架,所以有必要深入学习 前置学习 Python 类型提示:https://www.cnblogs.com/poloyy/p ...
- Sqli-Labs less54-65
less-54 从54关开始,就是提升巩固的关卡,并且开始慢慢偏向实际. 第54关就是对输入的次数做了限制,需要在十次之内获取信息,否则就会刷新表名列名等信息. 以下的步骤截图就直接从上帝视角截图说明 ...
- noip31
T1 关于我考场上乱冲平衡树这件sb事 很快就冲了出来 然后手抖打错样例,把我hack了 sb字典序 正解: 先不考虑字典序问题,先将最大分数找出来,然后按照顺序考虑每一个位置填什么那个数能让分数尽可 ...
- Spring-Boot注入自定义properties文件配置
创建wzq.properties wzq.properties注入User实体类中 @PropertySource(value = "classpath:wzq.properties&quo ...
- jsoup的Element类
一.简介 该类是Node的直接子类,同样实现了可克隆接口.类声明:public class Element extends Node 它表示由一个标签名,多个属性和子节点组成的html元素.从这个元素 ...
- 从一个URL加载一个Document
存在问题 你需要从一个网站获取和解析一个HTML文档,并查找其中的相关数据.你可以使用下面解决方法: 解决方法 使用 Jsoup.connect(String url)方法: Document doc ...
- Oracle基本用法(一)
一.简介 数据库:Oracle数据库的概念和其他数据库不一样,这里的数据库是一个操作系统只有一个库,可以看做Oracle就是一个大的数据库. 实例:一个Oracle实例有一系列的后台进程和内存结构组成 ...
- 从拟阵基础到 Shannon 开关游戏
从拟阵基础到 Shannon 开关游戏 本文中的定理名称翻译都有可能不准确!如果有找到错误的同学一定要联系我! 本文长期征集比较好的例题,如果有比较典型的题可以联系我 目录 从拟阵基础到 Shanno ...