问题标签 [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 投票
2 回答
6756 浏览

c - 有没有比解析 /proc/self/maps 更好的方法来找出内存保护?

在 Linux(或 Solaris)上,有没有比/proc/self/maps反复手动解析更好的方法来确定您是否可以读取、写入或执行存储在内存中一个或多个地址的任何内容?

例如,在 Windows 中,您有VirtualQuery.

在 Linux 中,我可以mprotect更改这些值,但我无法将它们读回。

此外,除了做一些非常侵入性的事情并在进程中的所有线程上使用并拦截任何可能影响内存的尝试之外,还有什么方法可以知道这些权限何时更改(例如,当有人mmap在我背后使用文件时)地图?ptracesyscall

更新:

不幸的是,我在 JIT 内部使用了它,它几乎没有关于它正在执行的代码的信息来获得常量的近似值。是的,我意识到我可以拥有可变数据的常量映射,例如 Linux 使用的 vsyscall 页面。我可以放心地假设初始解析中未包含的任何内容都是可变且危险的,但我对该选项并不完全满意。

现在我要做的是阅读/proc/self/maps并构建一个结构,我可以通过二进制搜索来获得给定地址的保护。任何时候我需要了解一个不在我的结构中的页面,我会重新阅读 /proc/self/maps 假设它已经被同时添加,否则我将要进行段错误。

似乎解析文本以获取此信息并且不知道它何时更改是非常笨拙的。(/dev/inotify几乎对任何东西都不起作用/proc

0 投票
4 回答
1305 浏览

c - OS X Tiger 上的 mprotect API

我正在尝试在 MacOSX 10.4 (tiger) 上使用 mprotect API,我尝试了所有可能的方法,它总是返回 -1,错误码为 13,这意味着在我尝试添加写入权限时“权限被拒绝”一些可执行代码。

相同的代码完全适用于 MacOS X 10.5(豹)。

代码很简单

其中 pFunc 是进程地址空间中加载的任何函数的地址。我尝试在添加 PROT_WRITE 访问权限之前删除 PROT_EXEC,但没有运气。我还尝试将 pFunc 与内存页面大小对齐,也没有运气..

知道如何使它工作吗?

0 投票
1 回答
574 浏览

c - 为什么用 5 个参数调用我的 mprotect 函数?

根据mprotect 的 Linux 手册页,该函数有 3 个参数:

但是在我正在分析的程序上运行 ltrace 时,我看到 mprotect 是这样调用的:

第 4 和第 5 个论点是为了什么?

我正在使用 ltrace 0.5 版。和内核 2.6.24-24-generic

0 投票
3 回答
1879 浏览

c - 将文件中的机器代码加载到内存中并在 C 中执行——mprotect 失败

您好我正在尝试将原始机器代码加载到内存中并从 C 程序中运行它,现在当程序执行时它会在尝试在内存上运行 mprotect 以使其可执行时中断。我也不完全确定如果内存设置正确,它将执行。我目前在 Ubuntu Linux x86 上运行它(也许问题是 Ubuntu 的过度保护?)

我目前拥有的是以下内容:

我确实收到了编译器警告:

我还没有让程序访问这个代码,所以我无法看到我的汇编代码是否在做它应该做的事情。

0 投票
5 回答
87695 浏览

c - 如何编写信号处理程序来捕获 SIGSEGV?

我想编写一个信号处理程序来捕获 SIGSEGV。我保护一块内存以供读取或写入使用

这可以保护从缓冲区开始的页面大小字节的内存免受任何读取或写入。

其次,我尝试读取内存:

这将生成一个 SIGSEGV,并且我的处理程序将被调用。到现在为止还挺好。我的问题是,一旦调用了处理程序,我想通过执行更改内存的访问写入

并继续我的代码的正常运行。我不想退出该功能。在将来写入同一内​​存时,我想再次捕获信号并修改写权限,然后记录该事件。

这是代码

问题是只有信号处理程序运行,捕获信号后我无法返回主函数。

0 投票
3 回答
4145 浏览

signals - C SIGSEGV 处理程序和 Mprotect

我正在构建一个程序,它使用 mprotect() 来限制访问一块内存。当请求内存时,会抛出一个 SIGSEGV,我使用 signal() 调用来监听它。

一旦检测到 SIGSEGV,我需要以某种方式访问​​指向所请求(引发故障)的内存的指针以及所请求的段的大小。这可能吗?

此外,有没有办法确定当前分配的内存块的 mprotect() 级别(PROT_NONE、PROT_READ 等)?

0 投票
3 回答
1972 浏览

linux - mprotect 是否刷新 ARM Linux 上的指令缓存?

我正在 ARM Linux 上编写一个 JIT,它执行包含自修改代码的指令集。该指令集没有任何缓存刷新指令(在这方面类似于 x86)。

如果我将一些代码写入页面然后mprotect在该页面上调用,这足以使指令缓存无效吗?或者我是否还需要cacheflush在这些页面上使用系统调用?

0 投票
2 回答
1395 浏览

linux - 我可以写保护 Linux 进程地址空间中的每个页面吗?

我想知道是否有一种方法可以写保护 Linux 进程地址空间中的每个页面(从进程本身内部,通过 mprotect())。“每一页”是指进程地址空间的每一页,它们可能被在用户模式下运行的普通程序写入——所以,程序文本、常量、全局变量和堆——但我只对常量、全局变量和堆感到满意。我不想写保护堆栈——这似乎是个坏主意。

一个问题是我不知道从哪里开始写保护内存。查看/proc/pid/maps,它显示了给定 pid 正在使用的内存部分,它们似乎总是以 address 开头 0x08048000,以程序文本开头。(在 Linux 中,据我所知,进程的内存布局是底部的程序文本,然后是上面的常量,然后是全局变量,然后是堆,然后是大小不同的空空间,具体取决于大小堆或堆栈,然后堆栈从虚拟地址的内存顶部向下增长0xffffffff。)有一种方法可以判断堆的顶部在哪里(通过调用sbrk(0),它只是返回一个指向当前“中断”的指针,即,堆的顶部),但并不是真正判断堆从哪里开始的方法。

如果我试图保护所有页面0x08048000不被中断,我最终会得到一个mprotect: Cannot allocate memory错误。我不知道为什么mprotect要分配内存——谷歌也不是很有帮助。有任何想法吗?

顺便说一句,我想这样做的原因是因为我想创建一个在程序运行期间写入的所有页面的列表,我能想到的方法是写保护所有页面,让任何尝试的写入导致写入错误,然后实现一个写入错误处理程序,将页面添加到列表中,然后删除写保护。我想我知道如何实现处理程序,只要我能弄清楚要保护哪些页面以及如何去做。

谢谢!

0 投票
1 回答
839 浏览

iphone - iPhone 应用程序因 Mprotect 失败错误 (MonoTouch) 而崩溃

我使用 MonoTouch 开发的 iPhone 应用程序有问题。
我正在开发一个联系 WCF 服务的应用程序,当 WCF 服务回复时,我用返回的数据更新 UITableView,完成后它发送一个新的 WCF 异步调用,当它回复时它再次更新表等等。

问题是,当它在可变的时间内完成此操作时,它会崩溃并显示 Mprotect failed 错误 12。这仅在应用程序直接在手机上而不是在模拟器中运行时发生。

我试图注释掉表更新发生的位置,并在向 WCF 服务发送下一个异步请求之前发出 Thread.Sleep(1000),但仍然是相同的错误,但可以运行更长时间而不会失败。

我通过 SlSvcUtil.exe /noConfig http://mydomain/myservice.svc生成的“代理”文件联系 WCF 服务

我的问题是,是否可以通过某种方式或解决方法来避免此错误?是我的错,还是bug?实际上是因为我将在我的期末学校项目中使用该应用程序,所以如果我能修复它会很好。

我发布了控制台输出和崩溃报告的一部分,但如果您需要更多信息,请告诉我,我会发布。我不是第一次使用 Mono 或 MonoTouch 环境的专业人士,所以详细的回复会很好。

控制台输出:

崩溃报告:

0 投票
2 回答
1896 浏览

iphone - MProtect Errno 12 (ENOMEM) 的解释

我正在使用 Monotouch 编写一个 iPhone 应用程序,最近该应用程序开始崩溃,说明

随后是相当长的堆栈跟踪和 Springboard 通知“应用程序异常退出,信号 6”。

我读过这个问题,它指出该应用程序已经用尽了 iPhone 上的所有可用内存。我们在应用程序中应用了一些通用的 Dispose 模式,并且通常会尽快处理任何重物。这意味着应用程序现在使用更少的内存运行。但是,我们仍然收到 MProtect 失败消息。

还需要注意的是,当在仪器下运行应用程序时,仪器报告有大量可用内存可供设备使用(~40mb)。

我想知道是否有人能够解释 MProtect 和这次失败,因为我认为我没有完全理解它。