如何将 IDA 结构应用于结构的指针

逆向工程 艾达 结构 结构体
2021-07-08 10:25:08

我遇到过这个函数,它接受一个指向我认为是自定义 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

而且,离上面不远,我看到它被填充了:

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

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

我的自定义结构:

00000000 custom_sturct   struc ; (sizeof=0xF14)
00000000                 db ? ; undefined
00000001                 db ? ; undefined
00000002                 db ? ; undefined
[...same stuff...]
00000F11                 db ? ; undefined
00000F12                 db ? ; undefined
00000F13 field_F13       db ?
00000F14 custom_sturct   ends
00000F14

我正在使用 IDA Pro 6.3

1个回答

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

让我们以从 calc.exe 中获取的以下代码片段为例:

初始状态示例

在选择相关代码并点击T自动识别的 IDA 后,我们正在设置ECX寄存器,向左建议可能的有效结构以及偏移量和所选结构的值。

结构偏移对话框

分配有效结构后,代码如下所示:

结构偏移赋值后的代码

请注意以下警告/备注:

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

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