问题标签 [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.
python - 如何在 Linux 上调用 Python 中的内联机器代码?
我正在尝试从 Linux 上的纯 Python 代码调用内联机器代码。为此,我将代码嵌入到字节文字中
然后调用mprotect()
viactypes
以允许执行包含代码的页面。最后,我尝试使用ctypes
来调用代码。这是我的完整代码:
此代码在最后一行出现段错误。
为什么会出现段错误?调用表示成功,
mprotect()
所以我应该被允许在页面中执行代码。有没有办法修复代码?我真的可以在纯 Python 和当前进程中调用机器代码吗?
(一些进一步的评论:我并不是真的试图实现一个目标 - 我试图了解事情是如何工作的。我还尝试使用2*pagesize
而不是pagesize
在mprotect()
调用中排除我的 5 字节代码落在页面边界——无论如何这应该是不可能的。我使用 Python 3.1.3 进行测试。我的机器是 32 位 i386 机器。我知道一种可能的解决方案是从纯 Python 代码创建一个 ELF 共享对象并加载它via ctypes
,但这不是我要找的答案:)
编辑:以下 C 版本的代码工作正常:
编辑 2:我在我的代码中发现了错误。线
首先创建一个char*
指向bytes
实例开头的 ctypes code
。 addressof()
应用于这个指针的不是返回这个指针指向的地址,而是指针本身的地址。
我设法弄清楚实际获取代码开头地址的最简单方法是
更简单的解决方案的提示将不胜感激:)
修复这一行会使上面的代码“工作”(意味着它什么都不做,而不是段错误......)。
assembly - 如何强制 GDB 执行没有符号的代码
我有一个 C 程序(有充分的理由)分配内存,向其中复制一些代码,使用 mprotect() 赋予它执行权限,然后调用该代码。是的,我知道这是不便携且不安全的,但这是有充分理由的。无论如何,我需要通过汇编代码(使用 si 命令)单步执行 gdb,但它不会让我 - 它一直说:“没有函数包含所选帧的程序计数器”
有没有办法强制 gdb 执行这段代码?我应该使用另一个调试器来代替这种类型的东西吗?
谢谢!
c++ - 如何获取内存区域的保护标志,标志是mprotect中的PROT_READ /PROT_EXEC
我使用 mprotect() 将保护标志设置到内存区域。稍后,我想恢复这个内存区域的保护标志。
我的问题是,如何获取内存区域的保护标志?标志包括 PROT_READ ...
我的解决方法是手动解析 /proc/self/maps 。但是这个解决方案很笨拙......
我想知道是否有任何我可以使用的系统调用。
c - 字节级写访问保护?
保护页面以进行读取和/或写入访问是可能的,因为页表条目中有可以在内核级别打开和关闭的位。有没有一种方法可以保护某些内存区域免受写访问,比如说在 C 结构中,有某些变量需要写保护,并且对它们的任何写访问都会触发段错误和核心转储。它类似于 mprotect() 的缩小功能,因为它在页面级别工作,在用户空间的字节级别是否有类似的机制。
谢谢,卡皮尔 Upadhayay。
c - mprotect 整个程序,运行危险代码
我有一个小程序,它映射潜在危险的可执行代码(使用 PROT_EXEC),调用prctl(PR_SET_SECCOMP, 1)
然后执行这个 mmap'd 代码。这一切都很好,并且允许我通过将 mmap'd 区域同步到磁盘来“保存”评估状态,并稍后重新加载(很可能在另一台机器上进行负载平衡)。然而,这种技术并不总是有效——因为这段代码可能已经对不在 mmap'd 区域中的程序进行了更改,并且这些信息将会丢失。
所以我想做的是在调用代码之前将所有内容(除了这个mmap'd区域)设为只读。这样我就可以保证可执行代码不能改变除了 mmap'd 区域之外的任何东西的状态,我可以随意序列化/反序列化。
顺便说一句,这是 x86_64 上的 Linux
谢谢
loader - 在运行时注入指令时的 SIGSEGV 处理程序和 mprotect 和循环效果。处理程序无法获取信息->si_addr
我查看了与此相关的各种主题,但找不到我遇到的这个特定问题。
我看过的东西: 在运行时将代码注入可执行文件 C SIGSEGV 处理程序和 Mprotect 我可以写保护 Linux 进程地址空间中的每个页面吗? 如何编写信号处理程序来捕获 SIGSEGV?
当需要在处理程序中将保护设置为 PROT_READ 或 PROT_WRITE 时,我能够优雅地处理 SIGSEGV。但是,当我尝试使用 mmap 注入指令,然后使用 mprotect 将其设置为仅 PROT_READ,然后通过内联汇编执行指令时,它会按预期导致 SIGSEGV,但处理程序无法获取导致信号,所以我无法将它保护到 PROT_READ | PROT_EXEC。
例子:
这是结果输出:
接收到的信号编号:11
信号源自进程 0
SIGSEGV,由该地址引起:?(零)
//上面的输出重复循环,因为它无法“重新保护”该页面。
架构:x86 32 位操作系统:Ubuntu 11.04 - Linux 版本 2.6.38-12-generic (buildd@vernadsky) (gcc 版本 4.5.2 (Ubuntu/Linaro 4.5.2-8ubuntu4))
有任何想法吗?上述逻辑适用于简单地读取和写入内存。与内联汇编相比,有没有更好的方法在运行时执行指令?
提前致谢!
linux - linux中的mprotect
如果我mprotect
是一个带有 PROT_NONE 的段,并且如果 aSIGSEGV
是由于由sigaction
with处理的写入而发生的sa_sigaction
,我们将能够使用siginfo_t
's找到发生故障的地址si_addr
。但是有没有办法找到试图写入的数据和数据的长度?
我正在尝试这样做,因为我为我的项目尝试了一种写时复制机制。
android - Android mprotect() 不改变保护
我一直在尝试使用 mprotect() 来更改 Android 上某个内存区域的保护。但是,无论我做什么,我都无法使该区域可写(无论我做什么,它似乎仍然保持 PROT_READ|PROT_EXEC。也许我对 Android 的内存保护有些不理解?它绝对会拒绝我写入可执行文件的权利吗?内存区域?如果是这样,有系统选项可以禁用它吗?
代码看起来像这样:
我尝试使用 mmap 并直接调用 mprotect 系统调用,但无济于事。我也试过 PROT_READ|PROT_WRITE。
我在 iOS 上做过类似的事情,效果非常好......
linux - 在 Linux 中获取内存权限详细信息
我正在使用 mmap 分配内存,并使用 mprotect 将一些页面标记为 PROT_READ,而将一些页面标记为 PROT_NONE。我的实现具有基于内存权限的逻辑。目前我有内存位置信息,我如何获得它的当前保护状态?(PROT_READ/PROT_NONE)
c - C 编程:跨 fork() 的受保护内存
我需要保护父页面免受子页面的影响
- 我尝试过在 mmap 中不使用带有 MAP_ANONYMOUS 标志和 fd = -1 的 shm_open。
- 我试过用 fchmod 保护底层内存。
我目前正在使用以下设置:
我需要子进程能够保护页面(使用 mprotect 或其他方式),以便父进程无法再读取/写入页面。
收到的输出是:
当我期望(或者更确切地说,想要)在 *z = 3 行发生分段错误时。
不幸的是,孩子必须具有此功能,因为它还充当 TCP 服务器,并且将通过 TCP 连接接收阻止页面的请求(除非有另一种我没有想到的方法?)。
有什么建议吗?