试图识别二叉搜索树结构

逆向工程 C++
2021-06-13 11:40:19

假设我在 C++ 中创建了一个 std::map,而 ADDR 是它们在内存中的地址。当我查看内存中的这个位置时,我会找到一个指针,在 ADDR + 4 中将是容器中元素的数量。现在,当我转到 [ADDR] 时,我会发现另外 3 个指针,第一个指向树的最左侧元素,第二个指向树的根,第三个指向树的最右侧元素。现在这是我的问题:

当我创建一个 std::map<int, int> 并且我去一个节点(让我们以 Root 为例)时,我将拥有它->节点+0x10中的第一个,它->节点中的第二个+0x14,但我在一个软件中发现了一个树,它在 Node+0xC 中具有 it->first,在 Node+0x10 中具有 it->second,但我无法发现这是哪种结构。这里有人知道这是什么吗?

例如,如果我创建一个 std::map<std::string, int>: 在此处输入图片说明

这是我要识别的结构: 在此处输入图片说明

PS:本软件是用C++开发的。

1个回答

在对您原始问题的评论中,我提到它可能是 a boost::fusion::map,并询问bool+0x14是否有两个+0x15然后,您使用显示这些位置的布尔值的图像更新了您的帖子。

我认为我最初的猜测是正确的。它似乎是一个boost::fusion::container::map. 对于 MSVC 的 STL 实现,_Tree_node<T>几十年来的定义都是一样的:

// Simplified version of MSVC's xtree _Tree_node<T>
template <typename T>
struct _Tree_node {
  _Tree_node *_Left;   // Pointers to neighbors
  _Tree_node *_Parent;
  _Tree_node *_Right;
  bool _Color;         // Red-Black tree stuff
  bool _Isnil;
  T _Myval;            // Node value. For map<K,V>, this is a pair<K,V>. 
                       // For set<T>, this is just a T.
};

这就是我在使用std::set或 对MSVC 代码进行逆向工程时 100%std::map看到的情况,您可以在Microsoft STL GitHub 存储库xtree上看到自己的真实实现

当我对 boost 程序进行逆向工程时,我注意到数据结构实际上与 MSVC STL 相同,只是T数据位于两个bool之前它看起来像这样:

// Replica of boost tree nodes
template <typename T>
struct _Tree_node {
  _Tree_node *_Left;   // Same as before
  _Tree_node *_Parent;
  _Tree_node *_Right;
  T _Myval;            // Data. In MSVC, is after booleans.
  bool _Color;         // Booleans. In MSVC, is before data.
  bool _Isnil;
};

我会直接链接到显示可比较类定义的 boost 存储库,但实际上我一直无法找到它,尽管我花了 30 多分钟试图这样做。(如果您认为 MSVC STL 代码难以阅读,请尝试阅读 boost。)