【问题标题】:x86 32bit Assembly Parser | logical problemx86 32 位汇编解析器 |逻辑问题
【发布时间】:2021-09-06 18:12:34
【问题描述】:

我目前正在开发用于组装 x86 程序集的混淆器(使用原始字节)。

为此,我首先需要构建一个简单的解析器,以“理解”字节。 我使用的数据库主要是通过网站为自己创建的:https://defuse.ca/online-x86-assembler.htm

现在我的问题是: 有些字节可以用两种方式解释,例如(intel 语法):

1. f3 00 00                repz add BYTE PTR [eax],al
2. f3                      repz

我的想法是循环遍历字节并将每条指令单独处理, 但是当我到达字节'0xf3'时,我有两种解释方式。

我知道那里有可用的 x86 反汇编程序,我怎么知道这是什么情况?

【问题讨论】:

标签: parsing assembly x86 disassembly


【解决方案1】:

前缀,包括repz前缀,没有后续指令是没有意义的。后续指令可能包含前缀(repz noppause),改变其含义(repzxrelease,如果在某些互锁指令之前使用),或者前缀可能只是无效。

解码始终是明确的,否则 CPU 无法执行指令。仅当您不知道从何处开始解码的确切字节偏移量时才可能模棱两可(因为 x86 使用可变指令长度)。

【讨论】:

  • 解码总是明确的 - 或者至少,任何给定的 CPU 都会选择一种解码方式。英特尔的手册说,在一条指令上有多个 REX 前缀是“非法的”,但例如,他们的 Skylake CPU 将采用最后一个 (like with other repeated prefixes),而不是 #UD 故障。 AFAIK 没有英特尔文档表明这将发生。但是,是的,它们仍然是 REX 前缀,在这个意义上非常明确。
  • 终于找到了我测试重复 REX 前缀的问答:Segmentation fault when using DB (define byte) inside a function
猜你喜欢
  • 2011-11-04
  • 2021-07-29
  • 1970-01-01
  • 2017-10-20
  • 2011-02-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多