0

我正在尝试在给定的反汇编指令列表中识别所有寄存器以注册指令..

我正在使用 capstone 作为反汇编引擎。

检查“英特尔® 64 和 IA-32 架构软件开发人员手册”后,我发现我需要查看 MOD\RM 字节中的 MOD 位,如果它的 11b 则该指令位于两个寄存器之间。

在我遇到下一个指令(十六进制)之前,它工作得很好:

1) 81 EC 24 06 00 00 
2) 83 C4 30

根据顶点(http://www.cenigma.org/4AM3UGY):

1) sub  esp, 0x624
2) add  esp, 0x30

在第一条指令 MOD\RM='EC' (11101100b) 所以 MOD=11b 在第二条指令 MOD\RM='C4' (11000100b) 所以再次 MOD=11b

并且两者都没有注册注册!

我错过了什么?除了MOD位还有更多吗?

谢谢 !

4

1 回答 1

1

来自英特尔的手册:

如果指令不需要第二个 [寄存器/内存] 操作数,则 Reg/Opcode 字段可用作操作码扩展。这种使用由表中的第六行表示(标记为“/digit (Opcode)”)。

然后,如果我们EC从关联表中的第一个示例指令中查找,我们会发现它可以对应于您在ESP/SP/AHMM4/XMM4没有任何额外寄存器/内存操作数的情况下使用的情况。在这种情况下,指令描述中应该有一个/5

转到SUB同一手册中的描述,我们看到:

81 /5 id   SUB r/m32, imm32 

因此,我们在这里得到的是从 32 位寄存器中减去 32 位立即数,该寄存器是其中之一ESP/SP/AHMM4/XMM4(当然,ESP其中只有一个 32 位寄存器)。

有关详细信息,请参阅Intel 手册中的2.1.5 ModR/M 和 SIB 字节的寻址模式编码。

于 2016-02-22T18:06:40.780 回答