当一个struct是malloc时,很明显这个结构有多大。然而,为256字节的结构声明64个伪dword字段是非常繁琐的。声明结构具有固定大小的数组没有多大帮助,因为您无法单独命名元素。目前我正在使用AutoHotKey脚本添加字段,这些字段因任何原因今天停止工作。
那么:有没有办法一次在结构声明中添加多个字段?也许通过一些idc api?
答案 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。
我想不出任何有用的实际情况,但也许你可以!
在任何情况下,您都可以通过IDA API执行此操作。您需要的功能是AddStrucEx
和AddStrucMember
。您应该能够从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会根据您的要求创建尽可能多的元素,但不会创建数组。当你了解一切都是什么时,你可能需要稍后重新输入内容,但是这为你提供了一个良好的骨架。