我尝试在主线程的堆栈上调用mprotect
,但它总是失败。每次我尝试时,都会产生ENOMEM
错误。我已经检查了/ proc / [pid] / maps,整个堆栈映射在地址空间中。但是,我可以从主堆栈成功调用子线程堆栈上的mprotect
。主线程的堆栈必须有一些特殊的东西,以防止mprotect
改变它自己。但我无法找到任何相关文件。有人有想法吗?
#define _GNU_SOURCE
#include <unistd.h>
#include <sys/mman.h>
#include <assert.h>
#include <pthread.h>
#include <stdio.h>
void * addr;
size_t size;
void * thread(void * tls) {
sleep(1);
if (mprotect(addr, size, PROT_NONE) == -1) perror(NULL);
return NULL;
}
int main(int argc, const char *argv[]) {
pthread_attr_t attr;
pthread_getattr_np(pthread_self(), &attr);
pthread_attr_getstack(&attr, &addr, &size);
pthread_t th;
pthread_create(&th, NULL, thread, NULL);
sleep(2);
pthread_join(th, NULL);
return 0;
}
答案 0 :(得分:3)
您尝试对未映射的页面进行保护。如果您检查pthread_attr_getstack的来源,您会发现没有mmap.Stack页面按需映射。 this might help you
答案 1 :(得分:0)
我使用此code来保护meory。它可以很好地处理您的代码。 调用此方法 - &gt;
39 pthread_attr_getstack(&attr, &addr, &size);
40 __enable_execute_stack(&addr);
并编译:{{1}}