通常 I struct 是固定大小。是否可以定义包含具有不同大小的元素的结构?
为了说明我的意思是这样的。
文件中数据的布局如下所示:
ID WORD 0
FunctionPtr DWORD OFFSET Fkt
Name db 'Name of the function',0
align 4
'Name' 现在是一个 C 字符串,它的长度与末尾的 0 字节一样长,然后跟随着对齐指令。那么是否有可能告诉 IDA 该结构包含字符串,无论它有多长?
通常 I struct 是固定大小。是否可以定义包含具有不同大小的元素的结构?
为了说明我的意思是这样的。
文件中数据的布局如下所示:
ID WORD 0
FunctionPtr DWORD OFFSET Fkt
Name db 'Name of the function',0
align 4
'Name' 现在是一个 C 字符串,它的长度与末尾的 0 字节一样长,然后跟随着对齐指令。那么是否有可能告诉 IDA 该结构包含字符串,无论它有多长?
除非字符串在结构的末尾,否则尝试在 IDA 中创建这个结构是没有意义的,因为它甚至可能不存在于 C(或任何原始语言)中。
现在,如果字符串是在该结构的末端,这可能关联到一个实际的C结构的定义。这称为“零长度”数组或“灵活数组成员”。当然,就目前而言,这个数组的大小为零sizeof
。
不幸的是,这在 IDA 中仍然不存在。我过去所做的(同样,字符串是最后一个)是继续创建一个一字节的字段,所以你至少知道字符串的开始位置。如果您尝试使用size mystruct
代码中的任何常量,这将使事情变得复杂,但至少您的字符串偏移量是正确的。
IDA 介绍了“可变长度结构”,并通过一个非常直接的教程描述了它的用法。
简而言之,您需要确保“灵活”项是结构的最后一项,并将其定义为大小为 0 的数组。为此,定义一个新的结构成员char Name
,单击它并按*。然后,将“数组大小”设置为 0。
现在,缺点是 IDA 不会查找空终止符来定义字符串,而是每次要使用该结构时都必须告诉它它的大小。