【问题标题】:x86 assembly - how to identify register to register instructionsx86 程序集 - 如何识别寄存器到寄存器指令
【发布时间】:2016-02-22 17:24:43
【问题描述】:

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

我正在使用 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 位之外,还有更多内容吗?

谢谢!

【问题讨论】:

  • 在这些指令中,MOD 位指示第一个操作数是寄存器。操作码指示第二个操作数是立即数。所以,是的,你的任务比仅仅解码 MOD 位要困难得多。根据您认为“注册到注册”的内容,还有不使用 MOD/RM 字节的情况,例如 XCHG AX、BX、CBW 和 SAHF。然后是 LEA AX,[BX] 需要考虑。

标签: assembly x86 intel x86-16 capstone


【解决方案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 位寄存器) .

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

【讨论】:

  • 谢谢你解释了很多,但是我怎样才能确定一条指令是否使用两个或更少的寄存器?只能通过遵守手册中的所有说明?
  • 我不知道您是如何构建反汇编程序的。但如果我们以81 为例:它可以对应ADDANDSUB 和其他几个。但它们都有操作数组合r/m32, imm32(或r/m16、imm16). Whether it's an ADD`或AND或任何其他可能性取决于ModR/M字节的值。所以你需要编码该信息以某种方式进入您的反汇编程序。
  • 换一种说法:你的反汇编程序需要知道没有81 /r,所以81 EC必须对应81 /5,而81 /5SUB r/m32, imm32
  • @doroninou 您必须完全解码操作码字节,然后如有必要适当地解释 MOD/RM 字节。一些操作码不使用 MOD/RM 字节,而是“注册到注册”,一些操作码使用 MOD/RM 字节,但从不“注册到注册”。要做到这一点并不容易。
猜你喜欢
  • 2019-01-02
  • 2015-11-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-17
  • 1970-01-01
  • 2013-03-22
相关资源
最近更新 更多