Memory 读存储器保护

Memory 读存储器保护,memory,Memory,我想知道linux是否有一种恢复内存保护的方法。比如,我想用mprotect恢复更改后的保护 Linux上的文件/proc/self/maps包含有关当前虚拟内存布局、每个段是什么以及该段的内存保护的信息。使用mprotect所做的更改将导致文件得到适当更新 在使用mprotect开始修改之前,通过解析/proc/self/maps,您应该有足够的信息来恢复以前的布局 以下示例显示了三种情况下/proc/self/maps的内容: 在进行任何操作之前 在mmap之后(显示文件中的一个附加条目)

我想知道linux是否有一种恢复内存保护的方法。比如,我想用mprotect恢复更改后的保护

Linux上的文件
/proc/self/maps
包含有关当前虚拟内存布局、每个段是什么以及该段的内存保护的信息。使用
mprotect
所做的更改将导致文件得到适当更新

在使用
mprotect
开始修改之前,通过解析
/proc/self/maps
,您应该有足够的信息来恢复以前的布局

以下示例显示了三种情况下
/proc/self/maps
的内容:

  • 在进行任何操作之前
  • mmap
    之后(显示文件中的一个附加条目);最后
  • mprotect
    之后(显示文件中更改的权限位)
(使用32位Linux 2.6进行测试)

#包括
#包括
#包括
#定义页面大小4096
void显示映射(void)
{
INTA;
文件*f=fopen(“/proc/self/maps”,“r”);
而((a=fgetc(f))>=0)
putchar(a);
fclose(f);
printf(“--------------------------------------------------------------\n”);
}
内部主(空)
{
void*映射;
/*显示初始映射*/
显示_映射();
/*在一些页面中绘制地图*/
mapping=mmap(空,16*页面大小,保护读取,映射私有,映射匿名,-1,0);
printf(“***返回的映射:%p\n”,映射);
显示_映射();
/*更改映射*/
mprotect(映射、页面大小、保护读取、保护写入);
显示_映射();
返回0;
}

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

根据davidg的回答,下面是函数
unsigned int read\u mprotection(void*addr)
: ,from(该代码在Android上运行,应该可以移植到其他Linux上)

#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;
}