以前的九篇文章讲述的是在不越狱的状况下,详细的讲解了对APP重签名的原理,如何动态库注入,以及以后的各类调试技巧。这些功能其实已经很强大了,可以帮助我们在绝大多数状况下去分析而且更改对方的APP了。这对付一些在开发过程当中没有安全意识的APP其实已经足以。可是但凡对方有对APP进行防御,那么重签名就显得有些弱鸡了。
好比:
一、登陆微信后,次日会受到他们的警告。
二、重签名优酷后能够看到他们有相似非法APP的Log
...html
那么这个时候就须要我们对APP,甚至的操做系统拥有更大的掌控权,而这一切的基础就是越狱!python
hackers老是想象若是本身是开发者会怎么写,而后才能找到入手点。同理,开发者们也要想象本身是hackers会怎么作,才能采起相应的防护措施。而后,就是一场递归的博弈。
拿越狱检测这件事来讲,起初你们只需判断有无安装Cydia就行了,hackers们说好,那我就不安装Cydia也能够动手脚。开发者们又说,那你必定得用的上MobileSubstrate,bash,ssh吧,我去检测手机有没有安装这些工具。但是又有什么用呢?你判断什么我绕过去什么。
当class-dump大肆流行,函数符号都被暴露,开发者想尽办法藏起本身的敏感函数代码。hackers们也知道class-dump的死穴在哪里,因而新的检索办法油然而生。也就说,当一个防护手段成为流行,它就不会再是个让hackers大骂“真特么费劲”的防护手段了。好比以前介绍的一个小技巧:内存数据擦除 ,hackers知道开发者都去擦数据了,那我hook memset在你擦以前去读就行了。开发者说:我直接写硬盘上而后删除!hackers说:难道你没据说过文件恢复?
git![]()
以上来自大佬念茜的自言自语。github
因此说,这是一个全新的篇章,从这开始才是真的逆向的起点,让咱们一块儿来享受在iOS世界中安全攻防的其乐穷穷吧。vim
要了解越狱,就必要要先了解iOS系统的启动过程。
iOS启动引导分为三种模式:安全
这里咱们只对「正常模式」进行介绍,其余两种模式能够本身猜一猜。bash
额,这个就不谈了。服务器
全部iOS设备在处理器内都集成有一段名为Boot Room的代码,此代码被烧制处处理器内的一块存储上,而且只读,因此它的完整性的获得保障的。但这也一样会有问题,万一Boot Room自己存在安全漏洞,那么就没法经过更新进行修复。
而Boot Room的功能主要是负责初始化设备,而且引导加载底层引导加载器LLB(Low Level Bootloader)。在这一过程当中,Boot Room会使用Apple Root CA Public证书对LLB进行验证,若是验证成功则加载iBoot,不成功则启动失败。
Boot Room在启动的过程当中的地位相当重要,因为Boot Room只读特性,保证了iPhone上不能安装Android系统。同理,在除了iPhone其余的设备上没有Boot Room,也就没法安装iOS系统。微信
LLB(Low Level Bootloader)不一样于Boot ROM,它不是被内嵌在设备上的,而是在iOS系统中,同其余文件同样,是一种被加密的IMG3格式文件,会随着iOS系统更新而更新。 LLB负责启动更高层次的Bootloader,一样这一步也须要进行验证。验证不成启动失败,成功则继续。网络
iBoot 才是引导过程当中的主加载器,它负责加载操做系统内核。一样这一步也须要进行验证。验证不成启动失败,成功则继续。
iBoot
在内存中被加载至地址0x5FF00000
处。它有一个内建的HFS+驱动,能够直接访问iOS的文件系统,并支持多线程。iBoot一般会派生出两个线程:
一个main
线程,负责显示启动时的苹果logo,并根据auto-boot
和boot-command
环境变量的设置(正常引导模式下boot-command
被设为fsboot
)进行系统引导,引导过程能够根据bootdelay
环境变量延迟进行;
一个是uart reader
线程,苹果可能将这个线程用于调试,其基本处于闲置状态。正常引导模式中,iBoot
调用fsboot()
函数挂载iOS系统分区,定位内核,准备设备数并引导系统,若是引导失败,则进入恢复模式引导。
以上三个步骤只要其中任何一个步骤验证失败,则启动失败。
以前最主要的几部完成以后就剩下启动相关程序了,先启动第一个程序launchd
,再由由launchd
启动守护程序和代理程序,以后是桌面应用SpringBoard
,系统启动完成。
Windows
下最高权限用户是Admin
,Admin
能够对电脑操做任何事情,哪怕是删掉本身。 Linux
下最高权限用户是Root
,Android
下早年就有Root
的说法,其实就是取得Root
权限。 而iOS
衍生与Unix
,其与Linux
基本类似,因此我们这说的越狱其实就是取得Root
权限。
结合上文所说的安全启动链的验证过程,越狱要作的事情也就是找到那三个验证的步骤中的漏洞,而且绕过其验证,从而禁止掉信任链中负责验证的组件,最终取得Root
权限。
目前状况下越狱分两种:
目前完美越狱只支持iOS10一下的设备,因此若是你们须要玩,建议入手一台iOS9的iPhone5s(咸鱼300块以内能包邮到家哦),
自从盘古联合PP助手发布了国内首批越狱工具后,越狱就变得极其简单。一键操做,无痛无烦恼。
笔者利用「爱思助手」助手越狱。
而后根据本身的手机系统选择对应版本的越狱工具便可。
根据提示有对应的简单操做,而后等待自动重启,重启后能打开Cydia即表明越狱成功。固然也有可能越狱失败,重复以上越狱的步骤就行了。
Tips: 笔者在手机机身温度比较高的时候常常越狱失败,因此若是有一样状况的同窗,等待机身温度下降以后再次尝试,应该就能够成功了。
首先在Cyida中添加几个经常使用的源:
一、PP助手:apt.25pp.com
二、雷锋源:apt.abcydia.com
三、Frida:build.frida.re
Apple File Conduit "2":获取访问手机根目录权限
AppSync Unified 关闭签名:绕过签名检测
adv-cmds:命令行
OpenSSH:SSH (Secure SHell) 协议的免费开源实现。SSH协议族能够用来进行远程控制, 或在计算机之间传送文件。
Frida:以后制做砸壳工具须要用到
在上一步已经安装完OpenSSH
插件以后,Wifi登陆就变得很简单。
先确保手机和电脑通处于一个Wifi环境,在手机的网络设置里面找到当前的IP地址,如:172.20.122.108 打开终端
// ssh 用户名@手机IP地址
$ssh root@172.20.122.108
复制代码
第一次登陆会有相似这样的提示:
直接yes就能够了,他会将对应IP生成秘钥保存在目录/.ssh/known_hosts
中
若是将其中对应的IP删掉,下次又会有一样的提示了。
而后就须要填入用户密码,root用户的默认密码为:alpine。 若是你对手机安全性有要求,建议改掉此密码,而且牢记。不然就不要改了,要否则忘记了的话就只能刷机了(刷机有风险)。
出现相似以下图就表明等成功
每次都是用ssh root@1172.20.122.108
有点麻烦,并且也不利于记忆。因此咱们能够给一个对应的IP取一个对应的名字,好比咱们给172.20.122.108
的root用户取名5s(假设个人越狱手机就是5s),那么咱们下次就能够直接使用如下命令来链接:
$ssh 5s
复制代码
方法: 在上面提到的known_hosts
同级目录下新建一个名为config
的文件(建议使用Vim命令建立,由于有权限问题)。
Host 5s
HostName 172.20.122.108
User root
Port 22
复制代码
假设有另一台手机连了另一个IP,则须要多个Host,依次类推:
Host 5s
HostName 172.20.122.108
User root
Port 22
Host 6s
Hostname 172.20.122.163
User root
Port 22
复制代码
上文已经了解到,如何用wifi登陆手机,要了解USB链接以前要知道一个前提:
本机的回环地址默认为127.0.0.1
。 本机地址也能够用localhost
表示。而USB默认的端口号为22
因此在USB端口号开放的前提下,咱们只要链接端口22便可。
点击sukimashita官网或者个人Github下载usbmuxd。
咱们只须要用到其中的python-client
文件夹下的tcprelay.py
和usbmux.py
两个文件。
终端cd进入该目录,开放22端口而且映射到12345端口上(能够是任意端口,前提是此端口没有被占用),使用以下命令:
python tcprelay.py -t 22:12345
复制代码
而后新建一个终端窗口
链接此本地IP下的12345端口便可:
ssh root@127.0.0.1 -p 12345
复制代码
区别于上面的wifi地址,127.0.0.1 又是一个新的ip全部又会出现一次新的公钥保存提示,一样的yes,再输入密码:
命令虽然简单,可是每次都要进入tcprelay.py
对应的目录会很麻烦,因此仍是老规矩,先设置环境变量,再写对应脚本,便可实如今任意目录使用USB链接了。
若是以前有跟笔者以前的文章作过,这一步可跳过。
在用户的根目录下新建文件夹FYSHELL
,专门存放全部的自定义脚本文件。FYSHELL
也能够随意存放,只是该目录的位置在下面要使用到。
在用户的根目录下找到文件.bash_profile
,新增长FYSHELL
的环境变量(找不到.bash_profile
文件?那就新建一个,推荐使用vim新建,避免权限问题)。 以下图,笔者此时拥有两个环境变量FYSHELL
和CY
先将以前的python-client
文件夹拷贝到FYSHELL
中。
新建usbConnect.sh
文件,输入内容:
python /Users/用户名/FYShell/python-client/tcprelay.py -t 22:12345
复制代码
新建loginUsb_5s.sh
文件,输入内容:
ssh root@127.0.0.1 -p 12345
复制代码
以后直接使用这两个脚本就能完成USB登陆手机的任务了!
sh usbConnect.sh
复制代码
// 新建端口后在执行如下命令
sh loginUsb_5s.sh
复制代码
如下内容因为笔者的5s不在身旁,因此换了台iPhone6的手机继续。。。
SSH登陆本职上仍是调RSA加密的运用:
在上文中的公钥保存其实就是这里所说的第一步。
使用终端查看验证
cat ssh_host_rsa_key.pub
复制代码
cat known_hosts
复制代码
两个地方的公钥是相同的,得以验证。
中间人攻击其实就是在SSH登陆的时候,验证失败的结果。
将本地保存的RSA公钥随意改一个字母笔者将最后一个字母f
改为了e
再次尝试登陆手机,便可出现中间人攻击提示。
验证完以后仍是将其改回来吧。
免密码登陆也称“公钥登陆”,原理就是用户将本身的公钥储存在远程主机上。登陆的时候,远程主机会向用户发送一段随机字符串,用户用本身的私钥加密后,再发回来。远程主机用事先储存的公钥进行解密,若是成功,就证实用户是可信的,直接容许登陆 再也不要求密码。
先查看本地(MAC)以前是否已经生成过RSA公私钥,直接进入目录.ssh
下查看,若是其中有id_rsa
和id_rsa.pub
即表明已有,无需从新生成。若是强行生成新的,则会致使以前使用这对秘钥的地方失效。
若是没有,直接使用以下命令生成新的
ssh-keygen
复制代码
接着会出现一些问题,所有留空,直接回车便可。以后就能够发现目录.ssh
下有了id_rsa
和id_rsa.pub
了。
ssh-copy-id root@localhost -p 12345
复制代码
期间会须要输入一次iPhone用户的密码(默认alpine)。
接着,再次尝试登陆,就会发现不用在输入密码就能够登陆了。
相似上一步的验证SSH原理,查看两个端的用公钥。
一样得以验证。
若是说越狱是逆向的开始,那么Mac远程登陆手机就是逆向的大门,只有进入其中,才能一探究竟。后续的全部操做,好比:砸壳,动态分析,动态调试,动态库注入都离不开这个步骤,全部若是能够,但愿你们可以跟着这片文章作一遍。有可能会有坑,可是这样才记忆深入!
下一篇文章将会讲述在登陆手机后如何对APP进行砸壳。