使用mprotect保护整个地址空间

Protect the whole address space using mprotect

本文关键字:地址空间 保护 mprotect 使用      更新时间:2023-10-16

对于我的大学项目,我需要写入保护进程的整个地址空间。我正在阅读/proc/self/maps文件并解析映射。

因此,对于格式为08048000-0804c000 r-xp 00000000 08:03 7971106 /bin/cat的每个条目,我读取前两个条目(此处为08048000 & 0804c000),并将它们转换为十进制。让我们假设小数等价物是A&B。然后我执行mprotect((int*)A, B-A, PROT_READ)。但这种方法给了我分段的错误。我在这里找不出我做错了什么。可能是我在这里有一些知识差距,这就是问题的原因。有人能给我一些建议吗?

假设您的实现是正确的,我仍然希望看到分段错误。

毕竟,您是在告诉内核,您不希望被允许写入内存的任何部分。之后,你只需要继续运行你的流程,下次你试图写任何东西时,你都会遇到分段错误,因为这是不允许的。

这很可能是在"保护"堆栈之后从mprotect()返回时发生的。

仔细想想,在"保护"内存后,执行内存(即共享库或可执行代码)时,甚至可能出现分段错误。

事实上,所有可以安全应用只读/不执行标志的内存位都已经设置了这些标志。

我怀疑这就是这个独一无二的项目要给你的洞察力。