C 检测英特尔引脚上的非法指令操作码

C 检测英特尔引脚上的非法指令操作码,c,assembly,x86-64,intel,intel-pin,C,Assembly,X86 64,Intel,Intel Pin,我正在编写一个Pin工具,希望在其中检测具有特定操作码的指令。我有一个示例C程序的可执行文件,我正在打印hello world。使用的架构是x86_64,我在程序中有汇编指令的跟踪。我将此程序的汇编指令跟踪提供给英特尔引脚工具,在该工具上运行指令跟踪并执行操作 我的目标是从我的原始程序中检测特定的操作码。例如,我在我的C程序中添加了以下行- asm(".byte 0x17"); // pop ss in 32-bit mode, but illegal in x86-64 因此,0x17是

我正在编写一个Pin工具,希望在其中检测具有特定操作码的指令。我有一个示例C程序的可执行文件,我正在打印hello world。使用的架构是x86_64,我在程序中有汇编指令的跟踪。我将此程序的汇编指令跟踪提供给英特尔引脚工具,在该工具上运行指令跟踪并执行操作

我的目标是从我的原始程序中检测特定的操作码。例如,我在我的C程序中添加了以下行-

asm(".byte 0x17");   // pop ss in 32-bit mode, but illegal in x86-64
因此,0x17是我的C程序跟踪中的一条指令。在我的英特尔引脚工具中,我有这样一个指令跟踪-

VOID Instruction(INS ins, VOID *v) 
{
   if(INS_Opcode(ins)==0x17)
   {
        //Do something
   }
}
但是,当我运行指令跟踪时,我的Pin工具由于我放置的非法指令0x17而失败


当我打印指令操作码时,我看到它们的操作码与x86_64不同。例如,当我打印时,指令和操作码为0x17。我是否必须进行某种解码,或者我以错误的方式检测操作码?

这是对的重新询问。这可能是重复的,反之亦然。即使在到达
0x17
之前,是否也会对“错误”进行解码?PIN如何知道它是单字节指令,而不是它无法识别的较长指令的开头?自定义解码还需要指令长度解码。(我没有使用PIN,所以IDK如何做。)PIN操作码不是汇编操作码。它们是此文件中的常量:。还有无效的操作码,它可能会触发您的自定义解码。非常感谢@rkapl。现在我明白了为什么我解码了错误的指令。当我需要检测0x17指令并根据它执行某些任务时,是否有任何方法可以获取正确的程序集操作码。@rkapl我尝试使用XED_ICLASS_无效枚举器,但我的程序无法识别它,并且由于非法指令而崩溃。这是对rkapl的重新询问。这可能是重复的,反之亦然。即使在到达
0x17
之前,是否也会对“错误”进行解码?PIN如何知道它是单字节指令,而不是它无法识别的较长指令的开头?自定义解码还需要指令长度解码。(我没有使用PIN,所以IDK如何做。)PIN操作码不是汇编操作码。它们是此文件中的常量:。还有无效的操作码,它可能会触发您的自定义解码。非常感谢@rkapl。现在我明白了为什么我解码了错误的指令。当我需要检测0x17指令,然后根据它执行一些任务时,有没有办法获得正确的程序集操作码。@rkapl我尝试使用XED_ICLASS_无效枚举器,但我的程序无法识别它,并且由于非法指令而崩溃。