0. 我为什么又开始越狱了
盼着能够越狱最新版本 iOS 的软件放出,第一时间下载软件、固件刷机越狱已经是两、三年以前的事情了。那时候越狱大概有这样两个原因:
- 有锁。在淘宝买的第一个iPhone —— iPhone 1代,是个有锁版,不越狱破解没办法打电话、发短信。
- 盗版。喜欢尝试新出的软件和游戏,而许多优秀的应用又收费,再加上当时没有购买正版的习惯,iTunes 充值也不方便,所以就图个不花钱、方便,越狱装盗版的游戏和软件。
这几年不太折腾越狱了是因为几方面的原因:
- 能打电话了。买的 iPhone 不需要越狱就能打电话。
- 充值方便。用银联卡就可以给 iTunes 充值,信用卡则连充值都不需要。相比过去折腾个几个小时去安装那些盗版的软件,现在我更倾向于花钱买自己喜欢的软件。
- 没那么强烈的试用欲望了。越狱的时候游戏、应用装多了,现在基本上只要看看截图基本上就能猜出来是个什么样的软件或者游戏,没有当初那么想试玩了。
而最近又把 iPad 越狱了是主要是为了窥探一下别人应用的界面和代码。
1. 使用 Reveal 窥探别人应用的界面
Reveal 是一个刚发布不久的软件。具体的用法是将 Reveal.Framework (官方提供的一个库)拖拽到你的 Xcode 工程中,不需要添加一行代码就可以在 Reveal 中查看 View 结构以及各个控件的一些属性。
正式 Reveal 这个软件勾起了我想要窥探别人应用界面如何构建的想法:既然可以通过这个软件查看自己应用的 View 结构,那可不可以查看别人的 View 结构呢?一经搜索,发现已经有了比较成熟的解决方案(怀疑 Reveal 的开发者自己是不是也有查看别人 View 结构的需求):
- 用 Evasi0n 把 iOS 越狱了
- 安装 OpenSSH,MobileSubstrate 等实用工具(Cydia源里安装)
- 拷贝framework和dylib到越狱机
scp -r /Applications/Reveal.app/Contents/SharedSupport/iOS-Libraries/Reveal.framework root@192.168.0.X:/System/Library/Frameworks
scp /Applications/Reveal.app/Contents/SharedSupport/iOS-Libraries/libReveal.dylib root@192.168.0.X:/Library/MobileSubstrate/DynamicLibraries
- 创建并编辑 iOS 中 /Library/MobileSubstrate/DynamicLibraries/libReveal.plist
{
Filter = {
Bundles = ("com.apple.AppStore");
};
}
- 重启越狱机
- 执行 killall SpringBoard
- 也可以重启设备
然后就可以用 Reveal 看看别人的 app 是怎么布局的了:
2. 窥探别人应用的代码
2.1 应用做了哪些网络的请求,做了什么加密的操作
有一个越狱后的软件可以方便地告诉你这些内容——Introspy。
这篇文章里有详细的说明,就不重复了。
iOS安全攻防(十六):使用introspy追踪分析应用程序 - 念茜的博客 - 博客频道 - CSDN.NET
2.2 为应用加上钩子
你就可以在应用的启动前或者运行中添加一些你自己的代码。
2.2.1 启动前写好代码
为 iOS 或者 Mac 系统设置钩子的方法有很多,但是论起基本的原理来说,就是通过设定 DYLD_INSERT_LIBRARIES 这个环境变量,加载自己写好的 dylib,替换原有函数的内容。
完成这种动态库的插入有几种方法:
- 自己写 dylib,自己设置环境变量。(iOS安全攻防(十九):基于脚本实现动态库注入 - 念茜的博客 - 博客频道 - CSDN.NET)
- 自己写 dylib,通过 MobileSubstrate 帮忙注入
- 借助 Theos - iPhone Development Wiki 完成 dylib 的编写和编译,通过 MobileSubstrate 帮忙注入
我只尝试过最后一种,设置好环境后,非常方便,推荐使用。
2.2.2 运行时修改程序
除了使用这种加载动态库的方式注入,还可以使用 Jay Freeman 开发的 Cycript 在程序运行时进行变量的修改、函数的运行,非常适合对目标函数进行试错。
2.3 生成应用头文件,反汇编
2.3.1 二进制文件解密
App Store 上下载的二进制文件都经过了加密,所以在使用之前,需要先对二进制文件进行解密,可以用来解密的工具有:
2.3.2 二进制文件阅读
解密以后的二进制文件就可以使用 class_dump_z 生成头文件了,这样基本上获取了一个应用的组织架构了。
其实 Class Dump 有好几个版本,具体的区别可以见 [Objective-C Class Dump Zhiwei Li](http://zhiwei.li/text/2010/11/objective-c-class-dump/)
使用 IDA 或者 Hopper 等反汇编软件阅读二进制文件。接下来就是学习一下阅读汇编代码了。
3. 总结
以上的内容只是我折腾过程中比较粗浅的一个总结,没有太多具体的东西,更多的是索引一下。因为很多内容网络上都有了类似的内容,所以等遇到了比较有价值的东西,才会再写一些相关的内容。
好的程序员应该理解程序中的每一个字节。
在折腾的过程中,我读了一些别人的代码,学到了很多东西。想对那些没在越狱的设备上玩过的开发者们说,如果越狱以后学到的东西能让我们写出更美观、更安全的应用,那为什么不越狱呢?
参考链接:
- EOF -