2

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

Mprotect failed at 0x863a000 (length 8192) with errno 12

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

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

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

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

4

2 回答 2

1

mprotect(2)要求操作系统内核更改某些地址空间的保护模式。

mprotect(2)通常用于使地址空间的数据部分不可执行,从而导致缓冲区溢出格式化字符串漏洞、释放后使用释放​​未分配的内存错误或类似的攻击无法返回攻击者提供的数据。此外,mprotect(2)用于确保程序text空间不会被这些相同的漏洞修改。(如果攻击者可以简单地覆盖您提供的函数,那就不好了。)

但这mprotect(2)不是魔术;它无法防止返回 libc攻击,或不当使用system(3)或其他代码解释器等。

iPhone上的errno值的C符号是什么?12Monotouch 在哪里以及为什么使用mprotect(2)它自己?您的软件使用的任何机会mprotect(2)

于 2011-03-22T10:55:37.463 回答
1

您的应用程序使用泛型吗?

谨防在具有泛型的类型上使用虚拟方法,对于 Monotouch,它必须在预抖动和蹦床的一些更多魔法时进行大量黑客攻击,根据我的经验,它可能会导致一些方法劫持或内存损坏,YMMV。

为安全起见,在泛型类上将所有方法设为非虚拟方法。

于 2011-03-24T01:45:42.987 回答