iOS逆向工程 - 越狱 SSH Cycript

趁着有空总结下这几个月来学逆向的心得~

首先需要一台越狱的iPhone,可以在淘宝买一台已越狱的二手iPhone,推荐iPhone5s(最早的支持arm64架构的iPhone),一般600元之内就能买到了。
也可以自己越狱,用PP助手按教程操作就行了。不过越狱对于iPhone机型和系统都有要求,具体你的iPhone能不能越狱需要查看这里
那么如果查到你的手机支持越狱了,还要看看支持的是完美越狱还是不完美越狱。二者的区别就是,完美越狱的iPhone,重启之后还是越狱的状态,不完美越狱的iPhone,重启的时候会出现各种各样的问题,比如坏一点的是一直卡在开机界面(这种就麻烦了,所以保险起见还是直接淘宝买越狱iPhone吧😆),好一点的重启之后需要重新越狱。像我的 iPhone5s 9.2.1 就是不完美越狱,重启之后需要再越狱一次:

PP守护
重新激活

安装个PP守护,重新激活下越狱状态,一般几秒就OK了。

目前iOS9.1及以下系统是支持完美越狱的,9.1以上的都是不完美越狱,使用PP助手工具越狱能支持的最新系统是iOS10.2。

如果iPhone越狱成功了,会出现这个APP Cydia :


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":


Apple File Conduit "2"

开发者是Jay Freeman,如果还没有安装该插件右上角会显示"安装",点击安装就可以了。
接下来安装AppSync Unified,这个插件的开发者是第三方,第三方开发者需要先在Cydia中添加软件源,然后才能搜索到这个插件:

编辑

添加

输入软件源

添加源完成后,搜索AppSync Unified并安装:


AppSync Unified

接下来需要安装一个APP: iFile,使用这个APP就可以在iPhone上看到完整的手机目录了,安装方法和上面的相同,需要先添加软件源: http://apt.thebigboss.org/repofiles/cydia。但是我试了几次,貌似现在这个APP装不了了💀。不过没关系,可以在mac安装iFunBox,iPhone连上mac就可以通过这个软件查看手机目录了:

iPhone目录

可以把mac的文件拖进去,也可以将iPhone的文件拖到mac上面,非常方便。

接下来需要安装一些调试APP的工具,有了这些神器,进入逆向大门会变得非常简单。
首先是在Cydia安装OpenSSH,这个插件可以让你以ssh的形式登录到iPhone上,这样就可以在mac的终端上对iPhone执行一些操作了:


OpenSSH

什么是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地址,在设置-无线局域网 点击你连接的网络查看:


    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地址对应的公钥:
删除对应IP的公钥

删除之后再次登录就可以了。

因为所有iPhone第一次安装OpenSSH后登录密码都是alpine,所以一般要修改默认密码,操作如下:
修改密码

接下来是设置下免密登录,因为后期调试时需要频繁进行登录操作,如果每次都要输入密码就太麻烦了。

  • 先查看mac是否已经有公钥和私钥,一般只要有上传过代码到github都会有的:
    查看公私钥
  • 如果没有就先生成吧: mac生成公私钥
  • 复制id_rsa.pub到iPhone的根目录:
    复制id_rsa.pub

    scp 是secure copy的缩写,是基于ssh登录进行安全的远程文件拷贝指令。

  • root登录iPhone,在/var/root 创建.ssh文件夹,然后在.ssh文件夹新建一个名为authorized_keys的文件:
    authorized_keys
  • 将id_rsa.pub的内容追加到authorized_keys文件中,并将id_rsa.pub文件删除:
    将id_rsa.pub内容写入authorized_keys文件中
  • 退出登录,再次root登录就不需要输入密码了:
    免密登录

    如果还想让其他mac能免密登录这台iPhone,只需要把这台mac的id_rsa.pub追加到authorized_keys文件中可以了。以上的步骤,也可以把iPhone连上mac使用iFunBox操作。

关于ssh的设置基本上就这些了。接下来要安装另外一个神器 Cycript,它可以附加到一个APP的进程上,修改APP在内存中的值,从而实时的改变APP的行为。Cydia上搜索Cycript:


Cycript

为了获取APP的进程,还需要安装一个命令行软件包,Cydia搜索adv-cmds:
adv-cmds

登录到手机,使用 ps aux 可以查看手机的所有进程:

ps aux

以微信为例,红框里面的分别是微信的进程号和可执行文件的路径,使用 cycript -p 进程ID 或 cycript -p 进程名称 让Cycript附加到进程上:
cycript -p WeChat

进程名称和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; }

这个函数的功能是,传入一个对象,打印该对象的所有属性(包括私有属性),比如可以传入上一步取到的当前控制器:
Snip20180330_41.png
tryPrintIvars(detailViewController)

这样就把它的属性全部打印了出来。

也可以使用 #内存地址 获取一个对象,比如上一步我打印出了当前控制器的所有属性,里面有一个属性是 m_mmSearchBar:#"<FTSVoiceSearchBarController: 0x126360ca0>" 猜测应该是界面上的搜索栏,把 #0x126360ca0 传入自己定义的方法中:
Snip20180330_42.png
tryPrintIvars(#0x126360ca0)

使用Cycript自带的函数choose(类名),打印出当前界面所有属于该类的对象:
Snip20180330_43.png
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端口传输:

Snip20180330_46.png

使用USB传输数据时,数据先传到mac上指定的端口(可以是5001-65535任意一个),mac上再通过usbmuxd传输到iPhone的22端口:
Snip20180331_50.png

下载usbmuxd工具包,解压后使用 tcprelay.py 做端口映射:
Snip20180331_51.png

Snip20180331_52.png

端口映射程序就运行起来了,新开一个终端,ssh登录到本机地址的10010端口:

Snip20180331_53.png

使用远程拷贝指令也是和本机的10010端口通信,比如把桌面的test文件拷贝到iPhone的根目录:
Snip20180331_56.png

注意这里 -P 是大写的。

还有一个问题是关于终端中文输入与输出的,使用ssh登录到iPhone后,默认终端不支持中文输入和输出。把这个.inputrc文件拖到iPhone的 /var/root就能在终端输入中文了。至于输出中文终端会显示unicode编码:

Snip20180331_57.png

没有找到能支持中文输出的方法,目前使用python的编解码字符串方法解决(mac自带):

Snip20180331_58.png

也可以直接使用网站转,更加方便。

先写到这里了,本来想写写Reveal,它的官网居然打不开了/(ㄒoㄒ)/~~。下一篇写写Reveal,Theos和Debugserver。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,242评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,769评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,484评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,133评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,007评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,080评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,496评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,190评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,464评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,549评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,330评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,205评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,567评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,889评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,160评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,475评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,650评论 2 335

推荐阅读更多精彩内容