Ghidra 定义 C++ 字符串

逆向工程 吉德拉
2021-06-21 06:10:24

所以我想在 ghidra 结构中定义一个 C++ 字符串。我注意到在对 C++ 二进制文件进行逆向工程时,我发现它basic_string在符号树中定义了一个类。

现在我想在结构中定义一个std::string(不是指向它的指针)。现在有没有办法自动完成它,还是我仍然需要手动定义一个basic_string结构并从那里开始?目前有没有办法像这样将类和结构关联在一起(目前我认为类只充当命名空间?

我还尝试basic_string在我的结构中简单地添加一个具有该类型的字段,但它抱怨这basic_string只是一个占位符结构。

尚未测试 ghidra 如何处理std::string局部变量。

编辑:我上面描述的示例代码:

#include <string>
#include <iostream>

struct Human {
  int age;
  bool is_male;
  std::string name;

public:
  Human(int age, bool is_male, const std::string &name) : age(age), is_male(is_male), 
    name(name) { }

  void say_hello() {
    std::cout << "Hello, I am a " << (is_male ? "male " : "female ") << age << 
      "-year old named " << name << "!" << std::endl;
  }
};

int main() {
  Human *human = new Human(17, true, "Adam");
  human->say_hello();
}

当您将其放入 ghidra,然后执行自动填充结构字段时,它会识别ageis_male字段,但不会识别name字段,因为这是一个不透明的std::string对象。

到目前为止,当我反转另一个(更大的)二进制文件时,我只是手动创建了一个新结构:

struct basic_string {
  char *ptr;
  size_t len;
  char buff[0x10]
};

ghidra 是否可以自动执行此操作?另外我想知道如果我总是假设上面的结构会不会有任何可移植性问题?

1个回答

编辑:我误读了这个问题。我提供的解决方案只展示了如何手动添加结构。Ghidra 中似乎没有办法通过文本 blob 导入结构。


是的。

要在 Ghidra 中添加结构,您必须转到数据类型管理器 - 对我而言,它是最左侧垂直窗格中的第三帧。

在此处输入图片说明