在 X86 代码中插入一条未定义的指令以供 Intel PIN 检测

Insert an undefined instruction in X86 code to be detected by Intel PIN

我正在使用基于 PIN 的模拟器来测试一些新的架构修改。我需要使用我的模拟器测试带有两个操作数(一个寄存器和一个内存位置)的 "new" 指令。

由于使用 GCC 机器描述仅添加一条指令很乏味,因此使用 NOP 或未定义指令似乎合乎逻辑。 PIN 使用 INS_IsNop 可以很容易地检测到 NOP 指令,但它会干扰自然添加到代码中的 NOP,它也没有操作数或单个内存操作数.

剩下的唯一选择是使用和未定义的指令。未定义的指令永远不会干扰代码的其余部分,并且可以使用 INS_IsInvalid 通过 PIN 检测到。

问题是我不知道如何使用 GCC 内联汇编添加未定义的指令(带操作数)。我该怎么做?

所以事实证明 x86 有一个明确的 "unknown instruction"(参见 this)。 gcc 可以通过简单地使用来产生这个:

asm("ud2");

至于带有操作数的未定义指令,我不确定那是什么意思。一旦你有一个未定义的操作码,额外的字节都是未定义的。

但也许您可以通过以下方式获得您想要的东西:

asm(".byte 0x0f, 0x0b");

尝试使用通常不适用于指令的前缀。例如

rep add eax, [rsi + rax*4 - 15]

会assemble就好了。一些指令集扩展就是这样完成的。例如lzcnt 被编码为 rep bsf,因此它在较旧的 CPU 上执行为 bsf,而不是生成非法指令异常。 (根据 x86 ISA 的要求,忽略不适用的前缀。)

这将使您能够利用 assembler 对指令操作数进行编码的能力,正如 David Wohlferd 在他的回答中指出的那样,如果您使用 ud2.[=15=,这将是一个问题]