我試圖用動態生成的代碼做一些令人討厭的hacky事情,並且我希望操作系統在它到達未知操作碼時向我發送SIGILL。這可以讓我添加一層關於我的程序的元信息等等。如何強制將SIGILL發送到我的程序?
但是,對於我的小測試程序,似乎OS不發送SIGILL,而是發送SIGBUS或SIGSEGV。我猜這意味着內存所在的頁面上有一個NX位。
有關如何使內存可執行的任何提示?
供參考,這是我的測試程序:
#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;
}
還可以考慮使用[ 'mmap(3)'](http://linux.die.net/man/3/mmap),它允許您在一次系統調用中爲相應的保護位分配內存,並避免無意中更改保護位在恰好位於同一頁面的其他內存上。 – 2012-02-16 15:59:54
@AdamRosenfield,好點!聽起來更好:-) – 2012-02-16 16:02:59
我很想知道它是否工作。我在mmap中使用這種方法,但只獲取SIGSEGV。 'addr = mmap(NULL,8,PROT_EXEC,MAP_ANONYMOUS,0,0); ((FUNC)addr)();' – 2016-03-04 16:16:13