问题标签 [mprotect]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
293 浏览

linux - mprotect 并不总是折叠 /proc/pid/maps 中的相邻行

我有一个过程,一段时间后,调用mprotect()失败并显示ENOMEM. 该错误是由“无法分配内部内核结构”引起的:此时,该文件/proc/<pid>/maps包含 65531 行,这当然是可疑的接近 2^16。

该过程首先使用 mmap (1280MB, MAP_PRIVATE | MAP_ANONYMOUS) 获取一块内存,然后mprotect()在单个页面(或少量页面)上调用以启用和禁用对它们的访问,以进行调试。1280MB 映射区域最初显示为 中的一行/proc/<pid>/maps,但每次调用mprotect()都可能将该区域“拆分”为三部分:之前的内存、修改后的页面和之后的内存。经过多次更改,当两个相邻(但独立修改)的内存区域最终具有相同的访问标志时,通常会再次合并它们,因此总行数保持合理。

但只是“通常”。在失败的情况下,/proc/<pid>/maps最终会产生大量具有相同保护的连续内存区域,我不明白为什么它们不合并。在单页示例中,它们被正确合并。什么时候它的工作方式不同,为什么?

作为参考,失败的程序是多线程的,尽管这不应该产生影响(对于每个线程,/proc/<tid>/maps文件都是相同的)。见于 Linux 内核“2.6.35-30-generic #56-Ubuntu SMP”和“3.2.0-37-generic #58-Ubuntu SMP”。

编辑:如何重现:

它应该失败err = mprotect(..); assert(err == 0);

0 投票
2 回答
6202 浏览

c - 使用 mprotect 的 PROT_READ 和 PROT_WRITE 的行为

我一直在尝试先mprotect反对阅读,然后再写作。

这是我的代码吗

在 Linux 下,结果如下:

这是输出PROT_WRITE

并且对于PROT_READ

在 Mac OS X 10.7 下:

这是输出PROT_WRITE

并且对于PROT_READ

到目前为止,我知道 OSX / Linux 的行为可能会有所不同,但我不明白为什么PROT_WRITE在使用printf.

有人可以解释这部分吗?

0 投票
0 回答
249 浏览

c - mprotect 在 mmap-ed 共享内存段上

当两个进程共享使用 shm_open 和 mmap-ed 打开的一段内存时,在一个进程中对共享内存的一部分执行 mprotect 是否会影响另一个进程在同一部分上看到的权限?即,如果一个进程将共享内存段的一部分设为只读,那么它是否也对另一个进程变为只读?

0 投票
1 回答
269 浏览

c++ - mprotect:如何获取导致违反保护的指令?

我正在使用 mprotect 将一些内存页面设置为写保护。当在该内存区域尝试任何写入时,程序会收到一个 SIGSEGV 信号。从信号处理程序中,我知道在哪个内存地址中尝试了写操作,但我不知道如何找出导致写保护违规的指令。因此,在信号处理程序内部,我正在考虑读取程序计数器(PC)寄存器以获取错误指令。有没有简单的方法可以做到这一点?

0 投票
2 回答
987 浏览

linux - 如何在 mprotect 处理程序中获取当前程序计数器并更新它

我想在 mprotect 处理程序中获取当前的程序计数器(PC)值。从那里我想将 PC 的值增加“n”条指令,以便程序跳过一些指令。我想为 linux 内核版本 3.0.1 做所有这些。关于我可以获得 PC 值的数据结构以及如何更新该值的任何帮助?示例代码将不胜感激。提前致谢。

我的想法是在写入内存地址时使用一些任务。所以我的想法是使用 mprotect 使地址写保护。当一些代码试图在那个内存地址上写一些东西时,我将使用 mprotect 处理程序来执行一些操作。处理好处理程序后,我想让写操作成功。所以我的想法是使内存地址在处理程序内部不受保护,然后再次执行写操作。当代码从处理函数返回时,PC 将指向原始写指令,而我希望它指向下一条指令。因此,无论指令长度如何,我都想将 PC 增加一条指令。

检查以下流程

内部主要功能:

0 投票
1 回答
430 浏览

c - 如何保护和取消保护单字节内存?

我知道 mprotect 用于保护整个内存页面。谁能告诉我是否有办法保护和取消单个内存字节?

0 投票
1 回答
865 浏览

c++ - 使用 mprotect 保护整个地址空间

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

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

0 投票
3 回答
4407 浏览

c - mprotect 总是返回无效参数

我正在尝试使用保护修改 .text 段中的值以授予我写入权限:

mprotect 从不工作。它总是返回一个mprotect failed with error:: Invalid argument错误。

foo 是一种返回 int 的方法,该 int 存储在函数之后 5 个字节(这就是 foo+5 的原因)

0 投票
5 回答
2160 浏览

c++ - 在 C++ 中创建成员函数名称并在运行时调用它

有人可以给我这个问题的想法。我已经在互联网上搜索过这个,但无法获得我想要的太多信息。

说有课。

现在给出一个令牌列表 {"var1", "var2", ... "varN"},有什么方法可以在运行时创建函数名并调用 Foo 类型的某些对象的那些成员函数。喜欢例如

使用 if else 适用于少量变量,但不适用于大量变量。使用 bind 和 functors 也不能解决这个问题。一个网页建议在运行时使内存可执行,然后使用 reinterpret_cast,我不知道这是否可行。

更新

好的,从互联网上的答案和其他搜索中,我看到在 C++ 中没有优雅的方式来做到这一点。到目前为止,C++ 中还没有反射。所有 hack 都需要成员函数指针的编译时解析。当你有很多变量和 setter 和 getter 函数时,有人可以给我关于替代类设计的想法......或者 getter 和 setter 在 c++ 中是否是好的实践?

0 投票
2 回答
110 浏览

c++ - 这些对齐功能有什么区别?

我正在编写一个自修改程序;已经开始工作了。我找到了这两个函数,但不确定它们到底做了什么,我喜欢正确地评论我的代码。

pagesize 是使用 getpagesize 获得的

我发现 offset 的函数被用于内存对齐检查。我隐约知道他们在做什么,但不知道有什么区别?

谢谢。