所以我想在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,然后自动填充struct字段时,它将识别ageis_male字段,但不能识别name字段,因为这是一个不透明的std::string对象。

至此,当我反转另一个(更大)二进制文件时,我只是手动创建了一个新结构:

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


ghidra是否有可以自动执行此操作的功能?我还想知道,如果我始终假设上述结构会存在任何可移植性问题吗?

评论

不清楚您的问题,您介意粘贴示例代码吗?

添加了示例代码

无法添加评论,但这是指向GitHub Issue
的链接

#1 楼

编辑:我读错了问题。我提供的解决方案仅显示如何手动添加结构。在Ghidra中似乎没有一种通过文本blob导入结构的方法。


是的。

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



评论


嗯,是的,我想这就是我想的...您认为Ghidra将来会为c ++结构实现类似的东西吗?

–theKidOfArcrania
19 Mar 10 '19 at 21:46