我想知道在Linux中是否有一种检索内存保护的方法。比如,我想恢复使用mprotect更改后存在的保护。
unsigned int read_mprotection(void* addr)
的实现:re_mprot.c,re_mprot.h,来自github上的reDroid项目(该代码适用于Android,应该可以移植到其他Linux系统)。/proc/self/maps
包含了虚拟内存的当前布局信息,每个段的用途以及该段的内存保护情况。使用mprotect
所做的更改将导致该文件相应地更新。mprotect
修改/proc/self/maps
之前,通过解析该文件,您应该有足够的信息来恢复先前的布局。/proc/self/maps
的内容:
mmap
之后(文件中显示了一个额外的条目);最后mprotect
之后(文件中显示权限位的更改)。#include <sys/mman.h>
#include <stdio.h>
#include <errno.h>
#define PAGE_SIZE 4096
void show_mappings(void)
{
int a;
FILE *f = fopen("/proc/self/maps", "r");
while ((a = fgetc(f)) >= 0)
putchar(a);
fclose(f);
printf("-----------------------------------------------\n");
}
int main(void)
{
void *mapping;
/* Show initial mappings. */
show_mappings();
/* Map in some pages. */
mapping = mmap(NULL, 16 * PAGE_SIZE, PROT_READ, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
printf("*** Returned mapping: %p\n", mapping);
show_mappings();
/* Change the mapping. */
mprotect(mapping, PAGE_SIZE, PROT_READ | PROT_WRITE);
show_mappings();
return 0;
}
/proc/
接口外,没有其他机制可以让您确定虚拟内存的布局。因此,解析此文件是您能做的最好的事情。