gpt4 book ai didi

c - 在数组上使用 mprotect()

转载 作者:行者123 更新时间:2023-11-30 18:52:02 27 4
gpt4 key购买 nike

我试图分配一个整数数组,然后使用mmap()将页面映射到两个不同的静态堆,然后使用mprotect()保护其中一个堆> 具有保护 PROT_NONE。
看来 mprotect() 保护的内容比我告诉它做的堆要多得多

int main(){

//shared data
int *p_array;
struct sigaction sa;
int i=0;

p_array = (int *)malloc(sizeof(int)*NUM_ELEMENTS); // allocate 100 ints
size_t size_of_p_array = sizeof(p_array);

//SIGSEGV Handler initialization
sa.sa_flags = SA_SIGINFO;
sigemptyset(&sa.sa_mask);
sa.sa_sigaction = handler;
if (sigaction(SIGSEGV, &sa, NULL) == -1)
handle_error("sigaction");

protected_Heap = mmap (p_array, size_of_p_array, PROT_READ | PROT_WRITE, MAP_SHARED | MAP_ANONYMOUS, -1, 0); /* anonymous mapping doesn't need a file desc */
nonprotected_Heap = mmap (p_array, size_of_p_array, PROT_READ | PROT_WRITE, MAP_SHARED | MAP_ANONYMOUS, -1, 0); /* anonymous mapping doesn't need a file desc */

//write to the page to obtain a private copy
for (i=0; i<NUM_ELEMENTS;i++){
protected_Heap[i]=i;
nonprotected_Heap[i]=i;
}

// Make the memory unwritable
mprotect(protected_Heap,sizeof(int)*NUM_ELEMENTS, PROT_NONE);

printf("will write and it should not trigger an Access violation\n");
nonprotected_Heap[3] =0; // Should not trigger the SIGSEGV
protected_Heap[NUM_ELEMENTS+2]=0; //Should not trigger signal but it does
printf("will write and it should trigger an Access Violation\n");
protected_Heap[3] =0; // Should trigger the SIGSEGV

//Unmap the memory
munmap (protected_Heap,size_of_p_array);
munmap (nonprotected_Heap,size_of_p_array);
return 0;
}


有没有什么方法可以只保护到数组末尾而不是更进一步?

最佳答案

mprotect 粒度是有限的,它将始终保护整个页面。由于 x86 上页面大小为 4kB,因此无法保护 100 int 数组。

其次,当前的 mmap 有点奇怪,因为您无法 mmap 到进程中已占用的地址。传递 NULL 并分配全新的内存,稍后将通过调用 munmap 释放该内存。

最后但并非最不重要的 - 要实现上述目标,您可以分配整页,然后调整数组指针,使末尾指向页面的末尾。

关于c - 在数组上使用 mprotect(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35391405/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com