如何在 IDA 的函数中将寄存器设置为结构体?

逆向工程 艾达 拆卸 结构
2021-07-08 03:26:41

例如,在以下反汇编中:

.text:007C6834 014                 mov     eax, [esi+4]
.text:007C6837 014                 mov     dword ptr [esi], offset ??_7CAvatar@@6B@ ; const CAvatar::`vftable'

我如何能够将 esi 寄存器的类型设置为结构体,以便在理想的世界中反汇编将变成:

.text:007C6834 014                 mov     eax, [esi.field_04]
.text:007C6837 014                 mov     dword ptr [esi.vtable], offset ??_7CAvatar@@6B@ ; const CAvatar::`vftable'
2个回答
  1. 创建一个结构
  2. 以四种方式之一应用结构:

    • 使用T热键。
    • 右键单击操作数并从“结构偏移”子菜单中选择结构。
    • 菜单编辑|操作数类型|偏移|偏移(结构)
    • 使用操作数类型工具栏上的相应按钮

这是一个简短的教程:https : //www.hex-rays.com/products/ida/support/tutorials/structs.shtml

伊戈尔说得对,这里有一些我必须提供的额外提示。

确保在您的结构中声明变量时,您准确地适应了变量的大小。例如,它是 DWORD 还是其他一些多字节缓冲区(在这些情况下,memset/memcpy 可以为您提供有关其大小的线索)?

在处理具有许多对象的结构时,准确地考虑这些类型的事情很重要。它可以帮助您全面了解它在程序中的使用方式,以及进一步定义结构成员

另外,请记住,您可以像通常在 IDA 中命名任何其他变量一样命名字段。为了彻底,您还可以在结构选项卡中声明字段类型,为此,右键单击该字段,然后选择字段类型。

最后,例如,当在结构中声明多字节数组的大小时,您实际上可以通过在数组大小字段中预先添加“0x”来以十六进制方式实现。看起来不多,但这是一个可以派上用场的小技巧。

关于结构及其在 IDA 中的使用,还有更多内容需要探索。如果您想了解更多关于这个和 IDA 的一般信息,那么我强烈推荐 Chris Eagle 的 IDA Pro Book。

http://www.idabook.com/