我正在使用Monotouch编写iPhone应用程序,最近该应用程序已开始崩溃说明
Mprotect failed at 0x863a000 (length 8192) with errno 12
接着是一个相当长的堆栈跟踪和Springboard,通知“应用程序正常退出信号6”。
I've read this question表示该应用已耗尽iPhone上的所有可用内存。 我们已经为应用程序应用了一些通用的Dispose模式,并且我们尽快处理掉任何重物。这意味着应用程序现在使用更少的内存运行。但是我们仍然收到MProtect失败的消息。
另外值得注意的是,当在乐器下运行应用程序时,乐器会报告设备有足够的可用内存(~40mb)。
我想知道是否有人能够解释MProtect和这次失败,因为我认为我并没有完全理解它。
答案 0 :(得分:1)
mprotect(2)
要求操作系统内核更改某些地址空间的保护模式。
mprotect(2)
通常用于使地址空间的数据部分不可执行,因此buffer overflows,format string vulnerabilities,use after free或freeing unallocated memory错误,或类似的攻击无法返回攻击者提供的数据。此外,mprotect(2)
用于确保程序text
空间不能被这些相同的漏洞修改。 (如果攻击者可以简单地覆盖您提供的功能,那就不行了。)
但是mprotect(2)
并不神奇;它无法阻止return to libc攻击,或system(3)
或其他代码解释器的不当使用等。
iPhone上errno
值12
的C符号是什么? Monotouch在哪里以及为何使用mprotect(2)
本身?您的软件是否有机会使用mprotect(2)
?
答案 1 :(得分:1)
您的应用是否使用泛型?
谨防在Generics的类型上使用虚拟方法,对于Monotouch而言,在使用蹦床时需要进行大量的黑客攻击以及更多魔法蹦床,它会导致一些方法劫持或内存损坏,根据我的经验,YMMV
为了安全起见,在通用类上使所有方法都是非虚拟的。