ghidra-python:创建具有大端字段的结构

逆向工程 Python 吉德拉
2021-07-06 10:26:00

使用 ghidra 的 python 脚本引擎,我想创建一个包含大端无符号整数的结构。无论二进制 CPU 的字节序如何,该字段始终是大字节序的。

我的第一次尝试:

def uint32b():
    dt = UnsignedIntegerDataType()
    for s in dt.getSettingsDefinitions():
        if isinstance(s, EndianSettingsDefinition):
            s.setBigEndian(dt.getDefaultSettings(), False)
    return dt

但是,当将结构应用于数据时,我仍然看到小端值。该字段的“默认设置 - > Endian”仍设置为“默认”。

默认设置

1个回答

以下脚本显示了如何使用 Ghidra Python API 创建结构并将其字段设置为 Big Endian 字节顺序。

from ghidra.program.model.data import DataTypeConflictHandler
from ghidra.program.model.data import EndianSettingsDefinition
from ghidra.app.util.cparser.C import CParser


mystruct_txt = """
struct mystruct{
    uint32_t field1; 
    uint32_t field2;
};"""

# Get Data Type Manager
data_type_manager = currentProgram.getDataTypeManager()

# Create CParser
parser = CParser(data_type_manager)

# Parse structure
parsed_datatype = parser.parse(mystruct_txt)

# Add parsed type to data type manager
datatype = data_type_manager.addDataType(parsed_datatype, DataTypeConflictHandler.DEFAULT_HANDLER)

# Extract the first structure member i.e. mystruct.field1
field1 = datatype.components[0]

# Get Default Settings
field1_settings = field1.getDefaultSettings()

# Set endianess to big
field1_settings.setLong('endian', EndianSettingsDefinition.BIG)

如果您之前已经创建了结构(使用编辑器或其他方式),您可以省略创建结构的部分,并使用getDataType从下DataTypeManagerDB获取它

datatype = data_type_manager.getDataType("/mystruct")
field1 = datatype.components[0]
field1_settings = field1.getDefaultSettings()
field1_settings.setLong('endian', EndianSettingsDefinition.BIG)

将结构应用于片段数据后,您可以右键单击字段 -> 数据 -> 默认设置并检查默认字节序确实是大字节序。

在此处输入图片说明