所以我想在 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,然后执行自动填充结构字段时,它会识别age
和is_male
字段,但不会识别name
字段,因为这是一个不透明的std::string
对象。
到目前为止,当我反转另一个(更大的)二进制文件时,我只是手动创建了一个新结构:
struct basic_string {
char *ptr;
size_t len;
char buff[0x10]
};
ghidra 是否可以自动执行此操作?另外我想知道如果我总是假设上面的结构会不会有任何可移植性问题?