声明多个struct字段

时间:2013-03-08 21:06:46

标签: ida

当一个struct是malloc时,很明显这个结构有多大。然而,为256字节的结构声明64个伪dword字段是非常繁琐的。声明结构具有固定大小的数组没有多大帮助,因为您无法单独命名元素。目前我正在使用AutoHotKey脚本添加字段,这些字段因任何原因今天停止工作。

那么:有没有办法一次在结构声明中添加多个字段?也许通过一些idc api?

2 个答案:

答案 0 :(得分:3)

我会给你两个解决方案。根据情况,第一个可能不完全是你想要的。如果你愿意,我可以详细说明这两种方法。

廉价方法:使用填充阵列

如果您有一个大型结构并且只有少数成员的目的或大小已知,那么通过创建临时虚拟数组填充结构的间隙通常很有用。这使得结构定义在IDA中更具可读性和可维护性,并且它还允许您将结构整形为特定大小,而无需定义比您需要的更多成员。

假设您有一个已知大小为0x400字节的结构,并且您知道偏移量+ 0x0和+ 0x384处的成员的定义。我们还要说你知道+ 0x4和+ 0x6有单词,但你不知道它们代表什么。然后你可以将结构定义为:

00000000 MY_STRUCT       struc ; (sizeof=0x400)
00000000 ProcessID       dd
00000004 field_4         dw
00000006 field_6         dw
00000008 __filler1       db 892 dup(?)
00000384 ProcessObject   dd ?
00000388 __filler2       db 116 dup(?)
000003FC __filler3       dd ?
00000400 MY_STRUCT       ends

这比我在那里没有__fillerX元素时更具可读性。它也可以说更正确,因为如果结构的所有成员都是qwords,你就无法提前知道。

我在底部__filler3的原因是因为如果我想在__filler2区域中定义一个元素,我可以擦除__filler2(以后添加新的填充成员在那个空间里)没有缩小结构的整体尺寸。实际上,如果在结构定义时大小是唯一已知的,那么定义最终元素可能应该是您做的第一件事。那么你永远不需要自己弄清楚填充物阵列的大小; IDA为您提供的默认数组大小始终是正确的。为了快速做到这一点,我通常只需创建一个大小为N-4的数组,并在最后添加dword。

但我实际上想要 32个qwords!

我想不出任何有用的实际情况,但也许你可以!

在任何情况下,您都可以通过IDA API执行此操作。您需要的功能是AddStrucExAddStrucMember。您应该能够从IDA帮助文档中获得所需的大部分信息。

如果您想要一个IDC脚本的工作示例来生成结构,您可以自己生成一个。创建一些结构,然后转到File > Produce File > Dump typeinfo to IDC file...

或者这也应该有效(使用IDAPython):

id = AddStrucEx(-1, "EXAMPLE_STRUCT", 0)
for i in xrange(0,256,8):
    AddStrucMember(id, "field_%x"%i, i, FF_DATA|FF_QWRD, -1, 8)

答案 1 :(得分:2)

在IDA中这是一个巧妙但不直观的技巧,我一直在使用它:定义一个数组,但在数组对话框中取消" Create as array"复选框。这样做可以在结构中创建任意数量的元素,但不会从中创建数组。

工作流程如下:

  • 在您想要元素列表的偏移处创建所需类型的单个元素(例如双字)。 (当你只是创建一个你知道大小但没有内部结构的空结构时,这通常是零。)
  • 按住*键,光标位于刚刚创建的元素上。
  • 在数组对话框中输入所需的元素数。
  • 解开'创建为数组'对话框左下方的复选框。
  • 点击确定。

IDA会根据您的要求创建尽可能多的元素,但不会创建数组。当你了解一切都是什么时,你可能需要稍后重新输入内容,但是这为你提供了一个良好的骨架。