前言
随着iOS系统的逐步开放和与Android平台越来越多的相似性,很多以前只能通过越狱才可以使用的应用在现在的iOS系统中已经有了很多,所以越狱对于目前iOS用户来说,重要性比起以前有了很大的降低,很多用户都已经不再考虑iOS的越狱了。
那么作为iOS开发者,有没必要了解越狱,越狱完之后我们能干嘛?答案显然是肯定的。
什么是越狱
iOS是相对比较封闭的操作系统,用户和开发者所拥有的权限(自由)只能局限在特定的沙盒之中。那么iOS 越狱则指的是通过系统漏洞,打破这种限制的过程。使得用户最终能够以root权限访问文件系统和管理器,随心所欲的驾驭我们自己的iOS设备。
iOS developer 为什么要越狱
- 了解整个iOS系统架构,能够在更高的维度看待问题
- 查看私有的API,扩展APP功能
- 实现更丰富的UI效果,比如CAAnimation未公开的API
- 打开受限制的硬件特性,比如iOS7上实现视频硬解码
- 获取已安装App列表以及App信息
- 获取特殊的设备信息,比如IMEI,UDID等
- 动态调试App,查看debugserver的权限问题
- …
越狱与自身App安全
- 核心代码保护,反逆向,开发时进行代码混淆
- 保证自己App信息安全,本地数据存储加密,内存数据保护等
- 防劫持,防注入,阻止GDB等动态调试工具依附
越狱分两种
- 完美越狱:一次越狱成功后只要不升级系统,就会一直是越狱状态
- 非完美越狱:手机重启后会造成越狱失败,需要重新使用工具进行越狱
登录iPhone基本流程
手机越狱后会默认安装Cydia
Cydia:是越狱后的另一种App Store.类似苹果在线软件商店iTunes Store 的软件平台的客户端,在越狱的过程中被装入到系统中的.Cydia的主要目的是为越狱的iOS用户提供一个高级包装工具的图形界面前端以安装不被App Store接受的程序。它也是一个软件仓库的聚合器,带有几个被社区信任的源以避免对某个服务器的过度依赖
1.Cydia 中安装openSSH.利用openSSH Mac 登录iPhone .
OpenSSH 是 SSH (Secure SHell) 协议的免费开源实现。SSH协议族可以用来进行远程控制, 或在计算机之间传送文件。而实现此功能的传统方式,如telnet(终端仿真协议)、 rcp ftp、 rlogin、rsh都是极为不安全的,并且会使用明文传送密码。OpenSSH提供了服务端后台程序和客户端工具,用来加密远程控制和文件传输过程中的数据,并由此来代替原来的类似服务。
OpenSSH是使用SSH透过计算机网络加密通讯的实现。它是取代由SSH Communications Security所提供的商用版本的开放源代码方案。目前OpenSSH是OpenBSD的子计划。
- WiFi登录(Mac iphone 在同一个网段下): $ ssh root@手机IP地址
- $ ssh mobile@手机IP地址
iOS下有两个账户 root 和 mobile 默认密码都是 alpine ,可以通过passwd , passwd mobile 来修改对应账户的密码
这种登录方式优点是简单方便.缺点就是传输速度慢
SSH的通信过程
在建立安全连接过程中,服务器会提供自己的身份证明
在终端会有这样的提示
SSH - 基于密钥的客户端认证
- 建立安全连接
- 客户端的认证
- 数据的传输
ssh的工作原理
-
服务器建立公钥: 每一次启动 sshd 服务时,该服务会主动去找 /etc/ssh/ssh_host* 的文件,若系统刚刚安装完成时,由于没有这些公钥,因此 sshd 会主动去计算出这些需要的公钥,同时也会计算出服务器自己需要的私钥。
-
客户端主动联机请求: 若客户端想要联机到 ssh 服务器,则需要使用适当的客户端程序来联机,包括 ssh, putty 等客户端程序连接。
-
服务器传送公钥给客户端: 接收到客户端的要求后,服务器便将第一个步骤取得的公钥传送给客户端使用 (此时应是明码传送,反正公钥本来就是给大家使用的)。
-
客户端记录并比对服务器的公钥数据及随机计算自己的公私钥: 若客户端第一次连接到此服务器,则会将服务器的公钥记录到客户端的用户家目录内的 ~/.ssh/known_hosts 。若是已经记录过该服务器的公钥,则客户端会去比对此次接收到的与之前的记录是否有差异。若接受此公钥, 则开始计算客户端自己的公私钥。
-
回传客户端的公钥到服务器端: 用户将自己的公钥传送给服务器。此时服务器:具有服务器的私钥与客户端的公钥,而客户端则是: 具有服务器的公钥以及客户端自己的私钥,你会看到,在此次联机的服务器与客户端的密钥系统 (公钥+私钥) 并不一样,所以才称为非对称加密系统。
-
开始双向加解密: (1)服务器到客户端:服务器传送数据时,拿用户的公钥加密后送出。客户端接收后,用自己的私钥解密 (2)客户端到服务器:客户端传送数据时,拿服务器的公钥加密后送出。服务器接收后,用服务器的私钥解密,这样就能保证通信安全。
把客户端的公钥内容追加到服务器的授权文件(~/.ssh/authorized_keys)尾部
ssh-copy-id root@服务器主机地址 需要输入root用户的登录密码
ssh-copy-id会将客户端/.ssh/id_rsa.pub的内容自动追加到服务器的/.ssh/authorized_keys尾部
22端口问题
21端口提供FTP服务
80端口提供HTTP服务
22端口提供SSH服务(可以查看/etc/ssh/sshd_config的Port字段)
iPhone 默认是使用22端口进行SSH通信的,采用的是TCP协议
为了加快传输速度,也可以通过USB连接的方式进行SSH登录
Mac上有个服务程序usbmuxd(它会开机自动启动),可以将Mac的数据通过USB传输到iPhone
/System/Library/PrivateFrameworks/MobileDevice.framework/Resources/usbmuxd
usbmuxd的使用
-
下载usbmuxd工具包(下载v1.0.8版本,主要用到里面的一个python脚本:tcprelay.py)
https://cgit.sukimashita.com/usbmuxd.git/snapshot/usbmuxd-1.0.8.tar.gz -
将iPhone的22端口(SSH端口)映射到Mac本地的10010端口
-
cd ~/Documents/usbmuxd-1.0.8/python-client
-
python tcprelay.py -t 22:10010
-
加上-t参数是为了能够同时支持多个SSH连接
$ python tcprelay.py -t 22:100012
端口映射完毕后,以后如果想跟iPhone的22端口通信,直接跟Mac本地的10010端口通信就可以了
新开一个终端界面,SSH登录到Mac本地的10010端口
$ ssh root@localhost -p 10010
设备Cydia 中安装 adv-cmds 插件 用于查看所有进程
设备Cydia 中安装 cycript
- $ cycript // 开启
- Control + D // 退出
也可以这样开启 是进入某一个APP内部查看方法参数等. - $ cycript -p 进程号
- 或者 $ cycript -p 进程名字