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