数据结构逆向分析-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的更多相关文章

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

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

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

    数据结构逆向分析-Vector 这个应该是家喻户晓了的东西把,如果说C/C++程序员Vector都不用的话,可能就是一个不太好的程序员. Vector就是一个STL封装的动态数组,数组大家都知道是通过 ...

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

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

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

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

  5. Android逆向分析工具表

    逆向分析工具表 工具 描述 网址 androidterm Android Terminal Emulator http://code.google.com/p/androidterm/ droidbo ...

  6. RE-1 逆向分析基础

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

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

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

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

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

  9. paip.提升性能---并行多核编程哈的数据结构list,set,map

    paip.提升性能---并行多核编程哈的数据结构list,set,map vector/copyonwritearraylist 都是线程安全的. 或者经过包装的list ::: collection ...

随机推荐

  1. 连通图与Tarjan算法

    引言 Tarjan算法是一个基于深度优先搜索的处理树上连通性问题的算法,可以解决,割边,割点,双连通,强连通等问题. 首先要明白Tarjan算法,首先要知道它能解决的问题的定义. 连通图 无向图 由双 ...

  2. SpringBoot开发八-会话管理

    需求介绍-会话管理 利用Cookie和Seesion使得HTTP变成有会话的连接,写几个实例演示一下 代码实现 先写个例子,表示客户端第一次访问服务器,服务器端创建一个Cookie发送给客户端. 不管 ...

  3. [08 Go语言基础-for循环]

    [08 Go语言基础-for循环] 循环 循环语句是用来重复执行某一段代码. for 是 Go 语言唯一的循环语句.Go 语言中并没有其他语言比如 C 语言中的 while 和 do while 循环 ...

  4. miniFTP项目实战四

    项目简介: 在Linux环境下用C语言开发的Vsftpd的简化版本,拥有部分Vsftpd功能和相同的FTP协议,系统的主要架构采用多进程模型,每当有一个新的客户连接到达,主进程就会派生出一个ftp服务 ...

  5. Longhorn,企业级云原生容器分布式存储 - K8S 资源配置示例

    内容来源于官方 Longhorn 1.1.2 英文技术手册. 系列 Longhorn 是什么? Longhorn 企业级云原生容器分布式存储解决方案设计架构和概念 Longhorn 企业级云原生容器分 ...

  6. 四、vue前端路由(轻松入门vue)

    轻松入门vue系列 Vue前端路由 七.Vue前端路由 1. 路由的基本概念与原理 后端路由 前端路由 实现简单的前端路由 vue-router基本概念 2. vue-router的基本使用 基本使用 ...

  7. IDEA debug启动的时候需要等半个小时甚至更长时间

    debug启动的时候需要等半个小时甚至更长时间 突然有一天发现debug启动不起来了, 在debug时,项目一直会出现 Connected to the VM ,address: 其实这不是debug ...

  8. Git撤销&回滚操作(git reset 和 get revert)

    转自:https://blog.csdn.net/asoar/article/details/84111841 git的工作流 工作区:即自己当前分支所修改的代码,git add xx 之前的!不包括 ...

  9. Spring Data JPA:解析CriteriaBuilder

    源码 在Spring Data JPA相关的文章[地址]中提到了有哪几种方式可以构建Specification的实例,该处需要借助CriteriaBuilder,回顾一下Specification中t ...

  10. vue 优化hash持久化缓存

    公司用的是vue最近在学习react的打包时发现react会额外生成一个runtimeChunk,不知道具体原因所以查资料学习了下, 这里是runtime的功能,文章地址:https://sebast ...