我如何强制SIGILL发送到我的程序?

我试图用dynamic生成的代码做一些令人讨厌的黑客事情,并且当操作系统到达一个未知的操作码时,我希望操作系统给我一个SIGILL。 这可以让我添加一层关于我的程序的元信息等等。

但是,对于我的小testing程序,似乎OS不发送SIGILL,而是发送一个SIGBUS或一个SIGSEGV。 我猜这意味着内存所在的页面上已经设置了一个NX位。

有关如何使内存可执行的任何提示?

作为参考,这里是我的testing程序:

#include <stdio.h> #include <signal.h> #include <stdlib.h> #include <string.h> void SIGILL_handler(int sig) { printf("Handling SIGILL\n"); } typedef void(*FUNC)(void); int main() { signal(SIGILL, SIGILL_handler); int *bad = malloc(16); memset(bad, 255, 16); ((FUNC)bad)(); printf("Returning like it's no big deal\n"); return 0; } 

Solutions Collecting From Web of "我如何强制SIGILL发送到我的程序?"

mprotect是你的朋友在这里。 它是POSIX兼容的(SVr4,POSIX.1-2001),所以它应该在OS X和Linux下工作。

 int pagesize = sysconf(_SC_PAGE_SIZE); if (pagesize == -1) { perror("sysconf"); exit(1); } /* allocate 16 aligned pages */ void *bad = memalign(pagesize, 16 * pagesize); if (NULL == bad) { fprintf("aah, out of mem :-(\n"); exit(1); } if (-1 == mprotect(bad, 16 * pagesize, PROT_READ | PROT_WRITE | PROT_EXEC)) { perror("mprotect"); exit(1); } 

应该这样做。

第二编辑: memalign的兼容性似乎并不那么容易。 我会尝试memalign ,在OS X和Linux下的valloc ,如果两者都不工作,只需使用普通的malloc并添加足够的字节到返回的指针,以便它对齐:-)。

我意识到这是旧的,但如果其他人正试图强制SIGILL生成,那么另一种选择是使用内联汇编,如下所示:

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

要么

 asm("ud2");