读取内存保护

7

我想知道在Linux中是否有一种检索内存保护的方法。比如,我想恢复使用mprotect更改后存在的保护。

2个回答

4

2
在Linux系统上,文件/proc/self/maps包含了虚拟内存的当前布局信息,每个段的用途以及该段的内存保护情况。使用mprotect所做的更改将导致该文件相应地更新。
在使用mprotect修改/proc/self/maps之前,通过解析该文件,您应该有足够的信息来恢复先前的布局。
以下示例显示了三种场景下/proc/self/maps的内容:
  • 在执行任何操作之前;
  • mmap之后(文件中显示了一个额外的条目);最后
  • mprotect之后(文件中显示权限位的更改)。
(在32位Linux 2.6上测试通过)。
#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;
}

据我所知,除了Linux提供的/proc/接口外,没有其他机制可以让您确定虚拟内存的布局。因此,解析此文件是您能做的最好的事情。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接