趁着有空总结下这几个月来学逆向的心得~
首先需要一台越狱的iPhone,可以在淘宝买一台已越狱的二手iPhone,推荐iPhone5s(最早的支持arm64架构的iPhone),一般600元之内就能买到了。
也可以自己越狱,用PP助手按教程操作就行了。不过越狱对于iPhone机型和系统都有要求,具体你的iPhone能不能越狱需要查看这里。
那么如果查到你的手机支持越狱了,还要看看支持的是完美越狱还是不完美越狱。二者的区别就是,完美越狱的iPhone,重启之后还是越狱的状态,不完美越狱的iPhone,重启的时候会出现各种各样的问题,比如坏一点的是一直卡在开机界面(这种就麻烦了,所以保险起见还是直接淘宝买越狱iPhone吧😆),好一点的重启之后需要重新越狱。像我的 iPhone5s 9.2.1 就是不完美越狱,重启之后需要再越狱一次:
安装个PP守护,重新激活下越狱状态,一般几秒就OK了。
目前iOS9.1及以下系统是支持完美越狱的,9.1以上的都是不完美越狱,使用PP助手工具越狱能支持的最新系统是iOS10.2。
如果iPhone越狱成功了,会出现这个APP Cydia :
Cydia是由越狱界的骨灰级大神Jay Freeman(saurik)开发的,中文名: 杰 免费的男人。Jay Freeman开发了各种各样的越狱神器,而且一般都是免费的。越狱之后的手机默认会安装Cydia,可以在上面搜索到各种越狱才能使用的软件。
越狱之后的手机相比之前有什么好处呢?有以下几点好处:
(1) iPhone手机在没越狱时只能安装签名过的APP,越狱之后可以安装签名被破坏的APP。
(2) 可以自由访问文件系统,从此以后手机可以当U盘用了~。
省略n点...
(n)最重要的是可以用来研究逆向的各种东西啦。
至于有什么坏处,这个不是重点就不写了😆,总之不要用自己平时用的iPhone去越狱。
但是!只是越狱还是不能安装签名被破坏的APP和访问手机的文件目录,还需要安装两个插件你的iPhone才能拥有这两个功能:
- Apple File Conduit "2": 用于访问手机文件目录
- AppSync Unified: 用于绕过系统验证,安装签名被破坏的APP
在Cydia中搜索Apple File Conduit "2":
开发者是Jay Freeman,如果还没有安装该插件右上角会显示"安装",点击安装就可以了。
接下来安装AppSync Unified,这个插件的开发者是第三方,第三方开发者需要先在Cydia中添加软件源,然后才能搜索到这个插件:
添加源完成后,搜索AppSync Unified并安装:
接下来需要安装一个APP: iFile,使用这个APP就可以在iPhone上看到完整的手机目录了,安装方法和上面的相同,需要先添加软件源: http://apt.thebigboss.org/repofiles/cydia。但是我试了几次,貌似现在这个APP装不了了💀。不过没关系,可以在mac安装iFunBox,iPhone连上mac就可以通过这个软件查看手机目录了:
可以把mac的文件拖进去,也可以将iPhone的文件拖到mac上面,非常方便。
接下来需要安装一些调试APP的工具,有了这些神器,进入逆向大门会变得非常简单。
首先是在Cydia安装OpenSSH,这个插件可以让你以ssh的形式登录到iPhone上,这样就可以在mac的终端上对iPhone执行一些操作了:
什么是ssh?简单来说就是一种为远程登录提供安全保障的协议,复杂的请自行谷歌因为我也不会😆。而OpenSSH是ssh协议的开源实现,通过它你就可以让mac远程登录到iPhone。
安装完成后试下能不能登录。先确认下mac和iPhone是不是连的同个WiFi(以后如果连不上了,也先确认这个),需要两者是同一局域网。然后在mac终端有如下操作:
ssh root@192.168.0.56:
- 以root身份登录手机。iPhone可以用两种身份登录:root和mobile,root是以最高权限登录,操作文件不受限制,mobile是以普通账户登录,只能操作普通文件,不能操作系统文件。iPhone没越狱的时候,我们就是以mobile身份去使用手机。如果想以mobile用户登录,就使用 ssh mobile@192.168.0.56 登录,但是为了能够操作所有文件,一般以root用户登录。
-
192.168.0.56是手机的IP地址,在设置-无线局域网 点击你连接的网络查看:
The authenticity of host '192.168.0.56 (192.168.0.56)' can't be established.
RSA key fingerprint is SHA256:7nfGRROfoiPrdwqaTo+kSQOj0BkpJH44I8q1uM+8MBg.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.0.56' (RSA) to the list of known hosts. :
如果mac是第一次登录这台iPhone,就会出现以上的提示信息。这个和ssh的通信过程有关,它的意思就是,服务器(iPhone现在就相当于服务器)在接受到客户端(mac)的登录请求时,会先发送服务器的公钥给客户端,客户端收到公钥后,验证 ~/.ssh/known_hosts 文件是否保存有该公钥,如果没有保存,就会提示是第一次登录这台服务器,是否确认要登录。如果确认要登录,就会将公钥写入到known_hosts 文件中,再次登录该服务器时就不会出现以下提示信息。
root@192.168.0.56's password:
接下来服务器要求输入密码验证。iPhone安装OpenSSH后,root和mobile账户的密码都是alpine。
nixiangzhuanyongceshiji:~ root#
表示已经以root账户登录到iPhone上,nixiangzhuanyongceshiji是iPhone的名称。
这样就已经成功登录到iPhone上了,iOS和Mac OS X是相同的操作系统内核(Darwin),所以在mac上的命令行指令在iPhone上也是适用的。退出登录使用exit。
登录的时候可能会出现以下错误:这是因为客户端(mac)发现服务器(iPhone)发送过来的公钥和known_hosts 文件保存的公钥不同(相同的IP地址,不同的公钥)。解决方法是打开~/.ssh/known_hosts 文件,删除iPhone的IP地址对应的公钥:
删除之后再次登录就可以了。 因为所有iPhone第一次安装OpenSSH后登录密码都是alpine,所以一般要修改默认密码,操作如下:
接下来是设置下免密登录,因为后期调试时需要频繁进行登录操作,如果每次都要输入密码就太麻烦了。
-
先查看mac是否已经有公钥和私钥,一般只要有上传过代码到github都会有的:
- 如果没有就先生成吧: mac生成公私钥
-
复制id_rsa.pub到iPhone的根目录:
scp 是secure copy的缩写,是基于ssh登录进行安全的远程文件拷贝指令。
-
root登录iPhone,在/var/root 创建.ssh文件夹,然后在.ssh文件夹新建一个名为authorized_keys的文件:
-
将id_rsa.pub的内容追加到authorized_keys文件中,并将id_rsa.pub文件删除:
-
退出登录,再次root登录就不需要输入密码了:
如果还想让其他mac能免密登录这台iPhone,只需要把这台mac的id_rsa.pub追加到authorized_keys文件中可以了。以上的步骤,也可以把iPhone连上mac使用iFunBox操作。
关于ssh的设置基本上就这些了。接下来要安装另外一个神器 Cycript,它可以附加到一个APP的进程上,修改APP在内存中的值,从而实时的改变APP的行为。Cydia上搜索Cycript:
为了获取APP的进程,还需要安装一个命令行软件包,Cydia搜索adv-cmds:
登录到手机,使用 ps aux 可以查看手机的所有进程:
以微信为例,红框里面的分别是微信的进程号和可执行文件的路径,使用 cycript -p 进程ID 或 cycript -p 进程名称 让Cycript附加到进程上:
进程名称和APP的可执行文件名称相同,一般使用进程名称去附加,因为进程ID每次重开APP都会变化。需要注意的时,执行 cycript -p 需要APP在前台,不然命令会一直卡住。
附加上去后,就可以写代码控制APP的行为了。Cycript的语法混合了OC,JS,Java,具体资料见官网和文档。比如现在想在APP界面上弹框,终端输入如下:
var alert = [[UIAlertView alloc] initWithTitle:@"Title" message:@"cycript" delegate:nil cancelButtonTitle:@"cancel" otherButtonTitles:nil]
[alert show]
先初始化一个UIAlertView,然后调用它的 show 方法,是不是和平时写OC代码很像,只是声明变量换成了JS的语法以及结尾没有分号。
UIApp.keyWindow.recursiveDescription().toString()
取到当前控制器:var tabBarController = [UIApp keyWindow].rootViewController
var detailViewController = tabBarController.selectedViewController.visibleViewController
当前控制器,类名是ContactsViewController,内存地址是0x1249a1000
function tryPrintIvars(a){ var x={}; for(i in *a){ try{ x[i] = (*a)[i]; } catch(e){} } return x; }
这个函数的功能是,传入一个对象,打印该对象的所有属性(包括私有属性),比如可以传入上一步取到的当前控制器:tryPrintIvars(detailViewController)
这样就把它的属性全部打印了出来。
tryPrintIvars(#0x126360ca0)
使用Cycript自带的函数choose(类名),打印出当前界面所有属于该类的对象:choose(UITableViewCell)
使用choose(类名)[下标]可以取到对应下标的对象。
取消输入:Ctrl + C
退出:Ctrl +D
清屏:Command + R
更多Cycript的妙用,还要自己在实际使用过程中慢慢探索😆。以下是Cycript的更多脚本:http://iphonedevwiki.net/index.php/Cycript_Tricks。
Cycript只是改变APP在内存中的值,当APP刷新或者重启的时候,所有的改变就会无效,所以Cycript是用来调试APP和验证你的一些想法的,而想要让改变永久生效就需要另外一个软件:Theos。Theos后面再写了,现在还需要解决一个小问题:以上做的所有操作,都是mac和iPhone在同一局域网,通过WiFi传输的。当你的网络不好的时候,ssh和Cycript输入命令和打印东西就会变得很慢甚至卡住,所以我们可以改为USB连接的方式登录iPhone。
默认情况下,ssh走的是TCP协议,mac通过网络连接的方式登录到iPhone,数据通过iPhone的22端口传输:
使用USB传输数据时,数据先传到mac上指定的端口(可以是5001-65535任意一个),mac上再通过usbmuxd传输到iPhone的22端口:
下载usbmuxd工具包,解压后使用 tcprelay.py 做端口映射:
端口映射程序就运行起来了,新开一个终端,ssh登录到本机地址的10010端口:
使用远程拷贝指令也是和本机的10010端口通信,比如把桌面的test文件拷贝到iPhone的根目录:
注意这里 -P 是大写的。
还有一个问题是关于终端中文输入与输出的,使用ssh登录到iPhone后,默认终端不支持中文输入和输出。把这个.inputrc文件拖到iPhone的 /var/root就能在终端输入中文了。至于输出中文终端会显示unicode编码:
没有找到能支持中文输出的方法,目前使用python的编解码字符串方法解决(mac自带):
也可以直接使用网站转,更加方便。
先写到这里了,本来想写写Reveal,它的官网居然打不开了/(ㄒoㄒ)/~~。下一篇写写Reveal,Theos和Debugserver。