使用mprotect保护整个地址空间
Protect the whole address space using mprotect
对于我的大学项目,我需要写入保护进程的整个地址空间。我正在阅读/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()返回时发生的。
仔细想想,在"保护"内存后,执行内存(即共享库或可执行代码)时,甚至可能出现分段错误。
事实上,所有可以安全应用只读/不执行标志的内存位都已经设置了这些标志。
我怀疑这就是这个独一无二的项目要给你的洞察力。
相关文章:
- C++/地址空间:每个地址 2 个字节?
- 任务管理器 - C/C++ 应用程序 - 分配的地址空间与已用内存
- size_t ptrdiff_t和地址空间
- C++中是否有一个函数可以为您获取指向该节点的所有指针的地址空间
- ptrA = ptrB 是否等同于 ptrA = &*ptrB?,空值是否共享一个地址空间?
- 优化大型地址空间上的循环
- 如何表示指向地址空间开头的指针
- 从某个特定但很大的虚拟地址空间(例如,20GB以上)分配内存
- Do C和C++标准意味着地址空间中必须只存在一个特殊值来表示空指针的值
- 使用mprotect保护整个地址空间
- 关于取消引用和地址空间的基本C++指针问题
- 进程如何访问不属于其虚拟地址空间的内存映射 IO 地址?
- 在虚拟地址空间中使用内存映射文件
- 由 shmat 返回的指针位于地址空间的末尾,这给出了 SEG 错误
- 与地址空间无关的对象表示
- 以何种形式,可以通过管道将空指针发送到不同进程地址空间中的另一个进程
- 窗口中的虚拟地址空间
- 在Clang中使用指向成员和地址空间的指针
- 更新进程地址空间中的HTML内容
- 如何判断共享库在进程地址空间中的加载位置