我遇到了此函数,该函数接受一个指向我认为是自定义C结构的指针。我根据后来获得的结论得出了这个结论。 >
arg_0= dword ptr  4   ;struct passed in

push    ebx
push    ebp
mov     ebp, [esp+8+arg_0]  ; store pointer of struct in ebp
push    esi
push    edi
xor     ebx, ebx


我不知道结构的大小,但是我看过[ebp+0f14h]。因此,我定义了一个大小为0xF14的自定义IDA结构。现在,我在将此自定义结构应用于此指针时遇到了麻烦。我尝试了Alt+Q,然后选择了自己的自定义结构,但是它不起作用。输出窗口显示Command "DeclareStructVar" failed

我的自定义结构:

mov     [ebp+0D4h], bl
mov     [ebp+0F4h], bl
mov     [ebp+114h], bl
xor     eax, eax
mov     [ebp+0B8h], eax
mov     [ebp+0BCh], eax
mov     [ebp+0C0h], eax


我正在使用IDA Pro 6.3

评论

“但不起作用”-什么是“不起作用”?

您不能告诉IDA“ ebp是结构指针”,并且使所有使用ebp的指令都自动使用该结构。您必须右键单击每个偏移量,从上下文菜单中选择“结构偏移量”,然后选择您的custom_struct字段。 (或者,作为快捷方式,使用T键。)

@JasonGeffner和@GuntramBlohm都感谢您的回答。应用“ T”操作后,IDA没有投诉。但是,自定义结构仍未显示。然后,我意识到我给ebp注册了一个自定义名称。在删除寄存器的自定义名称后,出现了custom_struct。

@GuntramBlohm,想要根据您的评论和我的想法创建一个新的答案吗?我很高兴您能获得这一荣誉;)

要添加到@GuntramBlohm的注释中:您还可以选择文本区域并按t。将出现一个不同的菜单,允许您选择一个寄存器(选择ebp)和一个结构(选择custom_struct),它将选择中每个ebp的偏移量转换为custom_struct的偏移量。这在线性视图中效果最好。

#1 楼

要将寄存器设置为汇编代码序列中结构的偏移量,您需要选择该序列,然后按T。将出现一个名为“ Structure offsets”的对话框,您可以在其中提供寄存器并对其进行结构指向,您将看到使用它识别出的所有IDA参考。

以下面的摘录自calc.exe的代码段为例:
选择相关代码并单击自动识别的T IDA之后,我们将设置ECX寄存器,在左侧建议可能的有效结构以及偏移量和所选结构的值。 />
分配有效的结构后,代码如下所示:



请注意以下注意事项/说明:


IDA完全忽略了add ecx, 4行,并且因此没有很好地处理mov [ecx+eax*2], dx。为该特定行敲击T并提供非零偏移量增量将使您能够正确地进行处理,尽管需要手动进行。
如评论中所述,手动设置寄存器名称将完全禁用IDA对该寄存器的所有表示,而是显示用户提供的自由文本。这意味着任何偏移量定义都将被任何寄存器自定义名称隐藏。
如果您已经看到[ebp+0f14h],则结构的大小至少为0xF15字节,因为该结构正在偏移量0x0F14处写入,意味着至少0xF15字节可用。如果您已经看到DWORD [ebp+0f14h]的结构至少为0x0F18字节长。

这些警告至少可以通过Autostruct等第三方工具得到部分缓解