在 IDAPython 中访问 xmm 寄存器

逆向工程 蟒蛇
2021-07-05 23:27:48

我正在尝试为 IDA 编写一个 Python 脚本,该脚本与调试事件挂钩,并打印有关 xmm 寄存器的一些信息。我试过

idc.GetRegValue("xmm0")

但这会返回一个随机的 long,每次调用该函数时都会发生变化。我查看了源代码,它看起来GetRegValue总是返回一个整数值。

所以我尝试直接运行底层代码:

rv = idaapi.regval_t()
idaapi.get_reg_val("xmm0", rv)
print (rv.fval)

哪个打印:

<Swig Object of type 'UINT16 *' at 0x073E1F08>

似乎也没有办法从中提取浮点数。

那么我如何实际获得 xmm 寄存器的值呢?

1个回答
rv = idaapi.regval_t()
idaapi.get_reg_val("xmm0", rv)
print (rv.bytes().encode('hex'))

这将为您提供 xmm0 寄存器的原始 256 位值。根据您正在调试的程序如何使用寄存器,这可能包含各种内容。就我而言,我正在调试的代码将其用作 4 个浮点值。解析它们:

import struct
print(struct.unpack('ffff', rv.bytes()))

如果您的调试对象将寄存器用作两个双打,您将使用“dd”而不是“ffff”。

通常,查找 SDK 文档而不是(不是很好)IDAPython 文档。这是相关的页面:https : //www.hex-rays.com/products/ida/support/sdkdoc/structregval__t.html