MProtect Errno 12(ENOMEM)的说明

时间:2011-03-22 10:40:09

标签: iphone ipad mono xamarin.ios mprotect

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

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

接着是一个相当长的堆栈跟踪和Springboard,通知“应用程序正常退出信号6”。

I've read this question表示该应用已耗尽iPhone上的所有可用内存。 我们已经为应用程序应用了一些通用的Dispose模式,并且我们尽快处理掉任何重物。这意味着应用程序现在使用更少的内存运行。但是我们仍然收到MProtect失败的消息。

另外值得注意的是,当在乐器下运行应用程序时,乐器会报告设备有足够的可用内存(~40mb)。

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

2 个答案:

答案 0 :(得分:1)

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

mprotect(2)通常用于使地址空间的数据部分不可执行,因此buffer overflowsformat string vulnerabilitiesuse after freefreeing unallocated memory错误,或类似的攻击无法返回攻击者提供的数据。此外,mprotect(2)用于确保程序text空间不能被这些相同的漏洞修改。 (如果攻击者可以简单地覆盖您提供的功能,那就不行了。)

但是mprotect(2)并不神奇;它无法阻止return to libc攻击,或system(3)或其他代码解释器的不当使用等。

iPhone上errno12的C符号是什么? Monotouch在哪里以及为何使用mprotect(2)本身?您的软件是否有机会使用mprotect(2)

答案 1 :(得分:1)

您的应用是否使用泛型?

谨防在Generics的类型上使用虚拟方法,对于Monotouch而言,在使用蹦床时需要进行大量的黑客攻击以及更多魔法蹦床,它会导致一些方法劫持或内存损坏,根据我的经验,YMMV

为了安全起见,在通用类上使所有方法都是非虚拟的。