根据ASLR(地址空间布局随机化),每次进程开始时,它提供随机的堆栈和堆分配和页面加载,并且将对象放置在给定进程的虚拟空间中的地址随机化。
但在我的应用程序运行在ios上,我创build了一个名为ObjectA的对象,经过几次重新加载过程,我发现ObjectA的地址都是一样的,没有随机化。
苹果自己的ASLR实现如何工作? 为什么ObjectA的地址都是一样的?
你的意思是“几次重新加载”? 您应该明确地退出应用程序,因为多任务可能会重新打开相同的进程。
例如。 这是我的一个应用程序打印出一个UIViewController实例的地址,你可以看到每个执行中对象的地址是不同的。
First run: <DCViewController: 0x13d4a0> Second run: <DCViewController: 0x2880f0> Third run: <DCViewController: 0x2a2050>
(我不认为这是事实,但是在XCode中有一个选项可以在“构建设置”下启用PIE(位置独立可执行文件),它被称为“不要创建位置不相关的可执行文件”,你可以很容易地找到它, “在搜索框中,这个选项应该设置为否)。
编辑:
此外,如果部署目标> = 4.3,则Xcode将仅生成PIE二进制文件
希望这有助于=)
为了完整起见,那些为了回答这个问题而努力的人是苹果iOS 4安全评估中的 Dino Zovi。 如果别人在迪诺之前发表过(我不知道你的工作或你是谁),我很抱歉。
Zovi在苹果发布iOS安全性之前就发布了自己的东西。 迪诺的工作还是比较完整的。