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

巧了我就是萌 提交于 2019-12-12 04:18:46

问题


I'm using a PIN based simulator to test some new architectural modifications. I need to test a "new" instruction with two operands (a register and a memory location) using my simulator.

Since it's tedious to use GCC Machine description to add only one instructions it seemed logical to use NOPs or Undefined Instructions. PIN would easily be able to detect a NOP instruction using INS_IsNop, but it would interfere with NOPs added naturally to the code, It also has either no operands or a single memory operand.

The only option left is to use and undefined instruction. undefined instructions would never interfere with the rest of the code, and can be detected by PIN using INS_IsInvalid.

The problem is I don't know how to add an undefined instruction (with operands) using GCC inline assembly. How do I do that?


回答1:


So it turns out that x86 has an explicit "unknown instruction" (see this). gcc can produce this by simply using:

asm("ud2");

As for an undefined instruction with operands, I'm not sure what that would mean. Once you have an undefined opcode, the additional bytes are all undefined.

But maybe you can get what you want with something like:

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



回答2:


Try using a prefix that doesn't normally apply to an instruction. e.g.

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

will assemble just fine. Some instruction set extensions are done this way. e.g. lzcnt is encoded as rep bsf, so it executes as bsf on older CPUs, rather than generating an illegal instruction exception. (Prefixes that don't apply are ignored, as required by the x86 ISA.)

This will let you take advantage of the assembler's ability to encode instruction operands, which as David Wohlferd notes in his answer, is a problem if you use ud2.



来源:https://stackoverflow.com/questions/34710769/insert-an-undefined-instruction-in-x86-code-to-be-detected-by-intel-pin

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!