C中的非法汇编指令

时间:2017-10-09 22:10:23

标签: c gcc assembly intel-pin

我试图使用C程序生成汇编指令跟踪。我正在使用asm函数来插入在x86_64中非法的汇编指令并检测它们。

我有以下C程序 -

int main()
{
    asm(".byte 0x16"); // Illegal in x86_64
    asm(".byte 0x17"); // Illegal in x86_64
    return 0;
}

这是主函数的指令跟踪,预期 -

.text:004004d6 55                               push   %rbp
.text:004004d7 48 89 e5                         mov    %rsp,%rbp
.text:004004da 16                               (bad)  
.text:004004db 17                               (bad)  
.text:004004dc b8 00 00 00 00                   mov    $0x0,%eax
.text:004004e1 5d                               pop    %rbp
.text:004004e2 c3                               retq   
.text:004004e3 66 2e 0f 1f 84 00 00 00 00 00    nopw  %cs:0x0(%rax,%rax,1)
.text:004004ed 0f 1f 00                         nopl   (%rax)

我正在使用英特尔PIN来运行程序跟踪,并根据我得到的指令进行某种分析。因此,对于(坏)指令,它们是非法的,从而导致程序崩溃。我检查跟踪中每条指令的指令地址以及下一条指令的地址。

指令mov%rsp,%rbp(地址0x004004d7,0x16指令之前的指令)的下一个指令地址,如Pin所示为0x0。当下一条指令是条件/无条件转移指令时,引脚显示0x0。由于它也显示为坏指令,我怀疑坏指令正在调用一个异常处理程序,它终止程序并给出以下消息 -

Illegal instruction (core dumped)

我正在使用Pin来检测指令,当我收到非法指令时,我会进行某种模拟,然后删除该指令,以便跟踪可以继续进行。

是否有任何设置/标志来禁用此非法指令异常生成?

我正在使用gcc生成我的可执行文件,它可以简单编译而不会产生错误。当我执行指令时出现问题。当遇到非法指令时,是否有任何设置只是简单地遍历指令?

1 个答案:

答案 0 :(得分:2)

根据要求,这是我用于在{1}上将ud2未定义指令修补到单核机器上的代码和nop nop多核机器上的代码。我删除了与您的用例完全无关的代码:

nop lock

void __gmon_start__(void)
{
   if(ill) return;
   ill=true;
   struct sigaction act;
   memset((void *) &act, 0, sizeof(act));
   act.sa_sigaction=sigill;
   act.sa_flags=SA_SIGINFO;
   sigaction(SIGILL, &act, NULL);
   // more code to set IsUP goes here
}

对不起,代码很乱。