在X86代码中插入未定义的指令以通过英特尔PIN检测

时间:2016-01-10 21:06:47

标签: gcc assembly x86 inline-assembly intel-pin

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

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

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

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

2 个答案:

答案 0 :(得分:2)

事实证明,x86有一个明确的"未知指令" (见this)。 gcc可以通过简单地使用:

来产生这个
asm("ud2");

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

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

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

答案 1 :(得分:0)

尝试使用通常不适用于指令的前缀。 e.g。

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

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

这将让你利用汇编程序编写指令操作数的能力,正如David Wohlferd在他的回答中指出的那样,如果你使用ud2就会出现问题。