识别包含低级控制流的指令

逆向工程 x86 控制流图
2021-06-21 14:48:35

有一些x86指令在其语义中包含低级**控制流,例如div,因为其语义大致为:

if (source == 0)
   throw exception...
else
   return rdx:rax / source

或带有rep前缀的指令等。而 amov或 axor不包含任何控制流。

我试图x86根据这个标准ISA 的指令进行分类,我现在的出发点是研究Xed的 API 以了解是否存在可以提供此类信息的某些函数,但它似乎没有。

具体来说div,我已经检查了xed_decoded_inst_conditionally_writes_registersxed_operand_conditional_read/write,但它们都返回 false。

** 我很抱歉这个词,我不知道这个案例的确切术语。

编辑:非常感谢您的评论,但我表达了我的问题。我在下面的一些讨论中更新,以使上下文更加清晰。

Xed 的 API 不会提供完整的指令语义,但会提供一些。例如,使用一些固定 API(我在上面描述过)我们可以得到:

mov rax, r8

operands:                       2
uses rflag:                     no
has conditional read operand:   no
has conditional write operand:  no
conditionally write register:   no

cmovb rax, r8

operands:                       3
uses rflag:                     yes
has conditional read operand:   no
has conditional write operand:  yes
conditionally write register:   yes

所以至少我知道cmovb它的语义应该有一些条件控制流,而mov没有。

我尝试将此逻辑应用于其他指令:它适用于某些(例如rep movsb,等),但不是全部:

  • 对于div***(或mov),恕我直言,说没有条件控制流是“可接受的”*。我们认为异常是副作用:如果抛出异常,则不执行(或仅部分执行)指令
  • 对于其他情况,例如minps,这种逻辑根本不起作用

*** 我最初认为div包含条件数据流,但后来改变了:)

0个回答
没有发现任何回复~