如何获取 Ghidra 脚本中指令的推断寄存器值?

逆向工程 x86 吉德拉 x86-64 登记 脚本
2021-06-19 05:45:03

我想在 Ghidra 脚本的反汇编列表中的特定点获取寄存器的推断值。

在我的例子中,目标指令是一个rdmsrorwrmsr指令,它在ecx. 虽然我可以回顾之前的指令并寻找一个简单的mov ecx, const模式,但有更多的方法可以设置ecx为反编译器能够推断出的某个已知值。

我已经打过电话getRegisterValuerdmsr指令,传递一个Register类型的描述ecx,但是这只是回报None有没有办法在特定指令处推断寄存器值?

下面是拆解:

拆卸

和反编译的结果:

反编译代码

这是 P 代码:

用 p 代码反汇编

1个回答

在稍微研究一下之后,我认为这将在很大程度上取决于确切的上下文。

反编译器绝对可以做这样的基本形式: 在此处输入图片说明

在这种情况下,调用指令的 PCode 操作已经是: (register, 0x0, 4) CALL (ram, 0x125180, 8) , (const, 0x1, 4) , (const, 0x5413, 8)[0],即它已经包含传播的常量,没有任何从寄存器读取它们的引用。

如果您幸运的话,ardmsra 的相关 PCode 操作wrmsr已经包含此信息。不过,我没有二进制文件来测试这些指令是如何准确处理的。如果它们以任何形式包含它们依赖于值的信息,ecx那么我希望反编译器将优化 PCode 指令,以在可能的情况下直接使用常量作为 PCode 参数,就像在附加的图像中一样。快速浏览一下x86.sla似乎RDMSR确实以允许这种情况发生的方式定义。

反编译器内部发生的任何类型的值分析的一般结果都不会以我所知道的方式公开。

[0] 这不是来自指令的 PCode,而是来自反编译器令牌。您可以通过单击令牌来获取此信息(例如ioctl在反编译器中,然后currentLocation.token.pcodeOp在 Jython shell 中访问)