我正在使用Monotouch编写一个iPhone应用程序,最近该应用程序开始崩溃,声明
Mprotect failed at 0x863a000 (length 8192) with errno 12随后是一个相当长的堆栈跟踪和Springboard通知“应用程序以信号6异常退出”。
I've read this question表明应用程序已经耗尽了iPhone上的所有可用内存。我们已经对应用程序应用了一些通用的Dispose模式,并且通常会尽可能快地处理任何重物。这意味着该应用程序现在运行时使用的内存更少。但是,我们仍然收到MProtect失败的消息。
同样值得注意的是,当在instruments下运行应用程序时,instruments报告设备有足够的可用内存(~40mb)。
我想知道是否有人能够解释MProtect和这个失败,因为我认为我没有完全理解它。
发布于 2011-03-22 18:55:37
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 value 12的C符号是什么?Monotouch在哪里使用mprotect(2)本身,为什么使用它?您的软件是否有可能使用mprotect(2)
发布于 2011-03-24 09:45:43
你的应用使用泛型吗?
注意在泛型的类型上使用虚方法,对于Monotouch来说,它必须在预编译的时候做很多的hack,还有一些关于trampolines的魔法,根据我的经验,YMMV可能会导致一些方法劫持,或者内存崩溃。
为了安全起见,将泛型类上的所有方法都设为非虚的。
https://stackoverflow.com/questions/5389947
复制相似问题