iOS越獄開(kāi)發(fā)指南

1. 前言

若干年前,大家看到iPhone互相問(wèn)好的第一件事是“你越獄了嗎”春贸。據(jù)不完全統(tǒng)計(jì)居触,早期有80%左右的iPhone用戶(hù)會(huì)選擇越獄。但是隨著iOS系統(tǒng)的逐步完善痹屹,這個(gè)比例已經(jīng)在慢慢降低章郁,甚至很多人已經(jīng)不知道越獄為何物,是美劇嗎志衍?那么作為iOS開(kāi)發(fā)者暖庄,有沒(méi)必要了解越獄,越獄完之后我們能干嘛楼肪?答案顯然是肯定的培廓,那么這篇文章將帶你進(jìn)入越獄的世界里。

2. 什么是越獄

越獄(jailbreaking)在漢語(yǔ)詞典里面的指的是監(jiān)獄中的囚犯非法地離開(kāi)或逃離監(jiān)獄的行為春叫。眾說(shuō)周知肩钠,iOS是相對(duì)比較封閉的操作系統(tǒng),用戶(hù)和開(kāi)發(fā)者所擁有的權(quán)限(自由)只能局限在特定的沙盒之中暂殖。那么iOS 越獄則指的是通過(guò)系統(tǒng)漏洞蔬将,打破這種限制的過(guò)程。使得用戶(hù)最終能夠以root權(quán)限訪問(wèn)文件系統(tǒng)和管理器央星,隨心所欲的駕馭我們自己的iOS設(shè)備。


3. 越獄的意義

3.1. 用戶(hù)

大概可以分為這么幾個(gè)方面:

3.1.1. 任意安裝第三方應(yīng)用惫东,包括免費(fèi)和收費(fèi)的莉给,不需要繁瑣的注冊(cè)和輸入Apple ID

第三方應(yīng)用市場(chǎng):91助手,百度助手廉沮,PP助手颓遏,360助手等

3.1.2 . 擴(kuò)展定制系統(tǒng)應(yīng)用和服務(wù)

比如快捷設(shè)置,來(lái)電歸屬地滞时,一鍵清理叁幢,更換界面主題,動(dòng)態(tài)壁紙坪稽,蘋(píng)果公司近幾年的iOS系統(tǒng)更新所添加的新功能有很多都是從越獄插件中借鑒的曼玩;
代表:91桌面鳞骤,SBSettings


91桌面

SBSettings

3.1.3. 解除運(yùn)營(yíng)商限制

可以非正式地解開(kāi)運(yùn)營(yíng)商對(duì)iPhone的鎖定,使得能夠使用其它運(yùn)營(yíng)商提供的服務(wù)黍判,比如一些定制機(jī)或者其他地區(qū)版本限制了移動(dòng)4G服務(wù)

3.1.4. 修復(fù)漏洞

可在蘋(píng)果漏洞未修復(fù)前豫尽,提前進(jìn)行修復(fù)

3.2. 開(kāi)發(fā)者

以上總結(jié)的是越獄之后的對(duì)于用戶(hù)來(lái)說(shuō)大致幾個(gè)方面的意義,但是隨著蘋(píng)果對(duì)iOS的逐步完善和免費(fèi)App(下載免費(fèi))成為趨勢(shì)顷帖,不可否認(rèn)的是越獄的人群正逐步減少美旧,作為iOS開(kāi)發(fā)者還有哪些更重要的意義呢?
主要包括以下幾個(gè)方面:

3.2.1. 了解整個(gè)iOS系統(tǒng)和架構(gòu)贬墩,能夠站在更高的維度看問(wèn)題

包括iOS整體框架榴嗅,比如私有API,能夠更好的擴(kuò)展App功能陶舞,也意味著蘋(píng)果未來(lái)可能開(kāi)放這部分接口嗽测,更早的掌握核心技術(shù);
常用的私有API特性:
a. 實(shí)現(xiàn)更豐富的UI效果吊说,比如CAAnimation未公開(kāi)的API
b. 打開(kāi)受限制的硬件特性论咏,比如iOS7上實(shí)現(xiàn)視頻硬解碼
c. 獲取已安裝App列表以及App信息
d. 獲取特殊的設(shè)備信息,比如IMEI颁井,UDID等
e. 應(yīng)用內(nèi)安裝卸載IPA軟件包


私有庫(kù)列表

3.2.2. 學(xué)習(xí)優(yōu)秀的設(shè)計(jì)和實(shí)現(xiàn)方法

作為開(kāi)發(fā)者厅贪,總是驚嘆于很多優(yōu)秀的App能夠做的如此之好,tableview可以如絲般順滑雅宾;那么在贊嘆之余养涮,我們能夠動(dòng)起手來(lái)了解這些App的設(shè)計(jì)思想,算法眉抬,以及實(shí)現(xiàn)方式贯吓,弄清楚程序運(yùn)行的本來(lái)面目。


3.2.3. 提高開(kāi)發(fā)效率

a. 遠(yuǎn)程調(diào)試蜀变,遠(yuǎn)離找數(shù)據(jù)線煩惱悄谐;
b. app,bundle库北,framwork等可動(dòng)態(tài)替換和加載爬舰,不需要重復(fù)安裝加載;
c. 文件目錄自由訪問(wèn)寒瓦,動(dòng)態(tài)修改替換配置文件情屹,特別是iOS8.4之后限制了App的文件目錄讀取,顯得尤為重要杂腰;
iOS系統(tǒng)目錄:

Applications            // 存放所有系統(tǒng)的App和Cydia安裝的App
Library                 // 存放提供系統(tǒng)支持的數(shù)據(jù)垃你,其中系統(tǒng)插件一般存放在/Library/MobileSubstrate
System                  // 系統(tǒng)組件目錄,如SpringBoard桌面管理器,F(xiàn)onts字體等
User -> /var/mobile     // 用戶(hù)目錄惜颇,如用戶(hù)安裝的程序相冊(cè)照片等都在這里
Developer               // Xcode調(diào)試設(shè)備自動(dòng)生成的目錄
 
bin                     // "binary"的縮寫(xiě)皆刺,存放用戶(hù)級(jí)基礎(chǔ)功能的二進(jìn)制文件,如cp,ls等
dev                     // "device"的縮寫(xiě)官还,存放BSD設(shè)備文件
sbin                    // "system binary"的縮寫(xiě)芹橡,存放系統(tǒng)級(jí)基礎(chǔ)功能的二進(jìn)制文件,如fsck望伦,reboot等
usr                     // 包含了大多數(shù)用戶(hù)的工具和程序
private                 // 主要鏈接的目標(biāo)目錄
etc -> private/etc/     // "Et Cetera"的縮寫(xiě)林说,存放系統(tǒng)腳步及配置文件
tmp -> private/var/tmp/ // 臨時(shí)文件存放目錄
var -> private/var/     // 存放經(jīng)常變化的文件,如日志文件
 
boot                    // 存放系統(tǒng)啟動(dòng)文件屯伞,iOS此目錄為空
cores                   // 內(nèi)核轉(zhuǎn)儲(chǔ)文件存放目錄腿箩,iOS此目錄為空
lib                     // 存放系統(tǒng)庫(kù)文件,內(nèi)核模塊及設(shè)備驅(qū)動(dòng)等劣摇,iOS此目錄為空
mnt                     // "mount"的縮寫(xiě)珠移,存放臨時(shí)的文件掛載點(diǎn),iOS此目錄為空

d. 更好的進(jìn)行性能測(cè)試和監(jiān)控
一個(gè)top命令就可以了解整體的一個(gè)運(yùn)行情況末融, 一個(gè)簡(jiǎn)單的ping即可調(diào)試當(dāng)前設(shè)備的網(wǎng)絡(luò)情況钧惧。還有更高級(jí)的用法,我們平時(shí)開(kāi)發(fā)中經(jīng)常使用Instruments監(jiān)測(cè)我們的應(yīng)用程序勾习,但是功能往往比較局限浓瞪,這時(shí)候通過(guò)越獄插件的形式能夠更好的監(jiān)測(cè)我們應(yīng)用程序的整體運(yùn)行情況;



3.2.4. 了解越獄技術(shù)之后巧婶,更好的保障自身安全

a. 核心代碼保護(hù)乾颁,反逆向,進(jìn)行代碼混淆
b. 保證信息安全艺栈,本地?cái)?shù)據(jù)加密英岭,內(nèi)存數(shù)據(jù)保護(hù)
c. 防劫持,防注入湿右,阻止GDB等動(dòng)態(tài)調(diào)試工具依附

// 未混淆的被逆向的登錄接口
- (void)login:(id)arg1 password:(id)arg2;
// 混淆后的登錄接口
- (void)lSjsBDmteIagjEhG:(id)arg1 chnIVERjpXdqYbbp:(id)arg2;

綜上所述诅妹,作為開(kāi)發(fā)者,雖然面對(duì)的用戶(hù)(利益)可能越來(lái)越少毅人,學(xué)習(xí)和應(yīng)用越獄知識(shí)依然意義重大漾唉,使得技術(shù)更加純粹;

4. 越獄開(kāi)發(fā)的軟硬件環(huán)境

桌面操作系統(tǒng): Mac OS X
iOS設(shè)備: iPhone堰塌,iPod touch,iPad
設(shè)備越獄:
(1). 確定對(duì)應(yīng)設(shè)備系統(tǒng)版本是否能夠完美越獄分衫,尋找對(duì)應(yīng)的越獄工具
目前完美越獄的iOS系統(tǒng)版本:
iOS 1.0 ~ iOS 10.2.1(個(gè)別小版本不支持场刑,比如iOS 9.3.5)
(2). 使用iTunes進(jìn)行數(shù)據(jù)備份,越獄有風(fēng)險(xiǎn),一定要謹(jǐn)慎牵现,記得備份铐懊,備份,備份
(3). 各個(gè)越獄工具瞎疼,步驟可能略有不同科乎,隨著越獄技術(shù)的成熟,目前基本上支持一鍵越獄
Cydia:
越獄環(huán)境下的App Store贼急,一般越獄工具會(huì)自動(dòng)安裝

5. 實(shí)現(xiàn)流程以及通用技術(shù)

5.1. 砸殼茅茂,脫去App保護(hù)的外衣

5.1.1 自給自足

從App Store官方途徑下載的ipa包是經(jīng)過(guò)加殼的,也就是做了一層加密處理太抓。所以我們第一步就需要通過(guò)一定的技術(shù)手段剝開(kāi)這層保護(hù)殼空闲,才能深入內(nèi)部去探尋我們感興趣的東西。
相關(guān)技術(shù):
a. AppCrackr: 早期使用的工具走敌,簡(jiǎn)便好用碴倾,但是目前已被和諧
b. dump decrypted: 流程稍微復(fù)雜一些,需要在iOS設(shè)備上進(jìn)行
詳細(xì)教程:http://wiki.sankuai.com/pages/viewpage.action?pageId=500734074

5.1.2 嗟來(lái)之食

最方便快捷的途徑是去第三方的應(yīng)用分發(fā)平臺(tái)掉丽,比如91跌榔,PP助手等直接下載相應(yīng)的ipa包,但是一些國(guó)外或者冷門(mén)的App在上述平臺(tái)可能沒(méi)有捶障,那就必須自己動(dòng)手了僧须。

5.2. 靜態(tài)分析

5.2.1. 查看可執(zhí)行文件(Mach-O)

什么是Mach-O?它是一種用于可執(zhí)行文件残邀,目標(biāo)代碼皆辽,動(dòng)態(tài)庫(kù),內(nèi)核轉(zhuǎn)儲(chǔ)的文件格式芥挣,目前Mac OS X驱闷,iOS的可執(zhí)行文件都是采用的這種文件格式。所以空免,無(wú)論基于何種目的空另,我們的入口基本都是從這里入手
可視化查看工具:
MachOView,免費(fèi)開(kāi)源的項(xiàng)目蹋砚,能夠可視化查看Mach-O的文件信息
dmg:http://sourceforge.net/projects/machoview/
GitHub:https://github.com/gdbinit/MachOView

5.2.2. 解析可執(zhí)行程序(Mach-O)的頭文件信息

逆向解析出目標(biāo)程序所有的頭文件信息扼菠,把盤(pán)子鋪開(kāi)
原理:
在Mach-O結(jié)構(gòu)中主要通過(guò)以下幾個(gè)Section段,“__objc_classname” Section段保存有Objective-C所有的類(lèi)名信息坝咐,“__objc_methname”的Section段則保存了所有的方法列表循榆,而"__objc_classlist"的Section段則具有所有類(lèi)的信息,包括類(lèi)名墨坚,變量秧饮,函數(shù)等關(guān)聯(lián)信息。所以通過(guò)以上幾點(diǎn),從而能夠針對(duì)App盗尸,bundle柑船,framwork,static library等的可執(zhí)行程序?qū)С鏊蠴bjective-C的頭文件信息泼各;
Class-dump
class dump是一個(gè)命令行工具鞍时,它可以dump出破解之后的iOS二進(jìn)制文件的頭文件信息
教程:http://wiki.sankuai.com/display/~zhangzifeng02/Class-dump
官網(wǎng):http://stevenygard.com/

5.2.3. 反匯編可執(zhí)行程序(Mach-O)

對(duì)于逆向出的各個(gè)頭文件信息,可能有幾百上千個(gè)文件扣蜻,就像一幅圖上眾多的點(diǎn)逆巍,你很難有效的組織起來(lái),從而能夠看穿一切弱贼。這就需要更加深入的分析蒸苇,利用反匯編反編譯的手段,將點(diǎn)連成線吮旅,深入了解目標(biāo)程序的整體邏輯關(guān)系
原理:
反匯編(Disassembly)溪烤,是把目標(biāo)代碼轉(zhuǎn)換為更加便于易讀的匯編代碼的過(guò)程,對(duì)于任何的計(jì)算機(jī)程序都可以實(shí)施反匯編庇勃,并且對(duì)于有些強(qiáng)大的反匯編工具檬嘀,甚至能夠轉(zhuǎn)換為高級(jí)語(yǔ)言的代碼;
反匯編反編譯工具:
IDA
逆向工程界的神器责嚷,功能強(qiáng)大鸳兽,支持Windows,Mac OS X和Linux等平臺(tái)罕拂。正式版需要收費(fèi)揍异,價(jià)格不菲,有免費(fèi)試用版本爆班,但是功能受限衷掷,對(duì)于初學(xué)者來(lái)說(shuō)其實(shí)功能也夠用,但是不支持64位的CPU柿菩,對(duì)于目前iOS設(shè)備普遍都是64位的CPU來(lái)說(shuō)有點(diǎn)尷尬戚嗅;
官網(wǎng):https://www.hex-rays.com/products/ida/index.shtml


Hopper Disassembler
后起之秀,主要針對(duì)Mac OS X平臺(tái)枢舶,能夠逆向32位和64位可執(zhí)行程序懦胞,功能也相當(dāng)強(qiáng)大。有免費(fèi)和收費(fèi)版本凉泄,對(duì)比于IDA收費(fèi)版本價(jià)格更加親民躏尉,個(gè)人版本700左右人民幣即可收入囊中。
官網(wǎng):https://www.hopperapp.com/

5.3. 動(dòng)態(tài)調(diào)試

對(duì)目標(biāo)程序進(jìn)行靜態(tài)分析之后后众,我們能夠窺探程序的整個(gè)邏輯結(jié)構(gòu)醇份。正如我們了解了一個(gè)工具的基本構(gòu)造之后稼锅,它是如何使用的呢?所以我們還必須通過(guò)動(dòng)態(tài)調(diào)試的手段探測(cè)程序的運(yùn)行時(shí)情況僚纷。
動(dòng)態(tài)調(diào)試指的是利用調(diào)試器在軟件運(yùn)行時(shí),動(dòng)態(tài)的調(diào)試跟蹤軟件的運(yùn)行情況拗盒。作為iOS開(kāi)發(fā)人員怖竭,我們應(yīng)該都會(huì)用Xcode的在Debug模式下調(diào)試我們的程序,那么對(duì)于已發(fā)布的Release程序陡蝇,我們能否進(jìn)行動(dòng)態(tài)調(diào)試呢痊臭,答案是肯定的。

5.3.1. 遠(yuǎn)程連接

OpenSSH是使用SSH協(xié)議進(jìn)行遠(yuǎn)程登錄的首選連接工具登夫, 可以安全方便的遠(yuǎn)程調(diào)試iOS設(shè)備广匙。首次越獄后需要單獨(dú)安裝,也可進(jìn)入Cydia搜索"openssh"進(jìn)行在線安裝恼策。安裝成功之后鸦致,默認(rèn)密碼為"alpine",為了避免安全隱患涣楷,記得及時(shí)修改root和mobile賬戶(hù)的默認(rèn)密碼分唾。

// 修改密碼
passwd root
// 連接iOS設(shè)備
ssh root@192.168.x.xxx(mobile賬戶(hù) ssh mobile@192.168.x.xxx)
// 退出連接
exit(或者熱鍵Ctrl+D)

官網(wǎng):http://www.openssh.com/

11.gif

5.3.2 動(dòng)態(tài)代碼調(diào)試

a. GDB
GDB是GNU開(kāi)源組織發(fā)布的,功能強(qiáng)大的命令行調(diào)試器狮斗,支持C, C++, Objective-C, Pascal等多種流行的程序語(yǔ)言绽乔。
支持的功能:
? 啟動(dòng)程序,指定可影響程序運(yùn)行的任何內(nèi)容
? 可以讓程序在指定的斷點(diǎn)條件下停止
? 在程序停止時(shí)(斷點(diǎn)處)碳褒,檢查程序運(yùn)行的情況
? 可以動(dòng)態(tài)修改程序運(yùn)行時(shí)的內(nèi)容
GDB的基本調(diào)試步驟:

ps –ax                    // 輸出所有進(jìn)程的信息折砸,找到輸出信息中目標(biāo)進(jìn)程的pid
gdb –p pid                // 從上面的輸出信息得到進(jìn)程pid,啟動(dòng)相應(yīng)進(jìn)程
info sh                   // 查看目標(biāo)的基地址沙峻,記為base
// GDB常用調(diào)試技巧
break *(0X00ABCD+base)    // 一般通過(guò)IDA來(lái)靜態(tài)查找想斷點(diǎn)的地址睦授,比如0X00ABCD加上基地址即為需要斷點(diǎn)的地址
display                   // 設(shè)置程序中斷后欲顯示的數(shù)據(jù)及其格式
p                         // 打印指定變量的值
ni                        // 執(zhí)行一行源程序代碼,此行代碼中的函數(shù)調(diào)用也一并執(zhí)行
si                        // 執(zhí)行一行源程序代碼专酗,如果此行代碼中有函數(shù)調(diào)用睹逃,則進(jìn)入該函數(shù)
bt                        // 顯示堆棧信息
c                         // Continuing,繼續(xù)運(yùn)行
q                         // Quit的簡(jiǎn)寫(xiě),退出GDB調(diào)試環(huán)境祷肯。

官網(wǎng):https://www.gnu.org/software/gdb/

b. LLDB
從Xcode5開(kāi)始LLDB取代了GDB成為了Xcode新的默認(rèn)調(diào)試器沉填,它是具有REPL(read-eval-print-loop,交互式解釋器)特征的開(kāi)源調(diào)試器佑笋,其可以安裝C++或者Python插件翼闹。它與LLVM編譯器一起,帶給我們更豐富的流程控制和數(shù)據(jù)檢測(cè)的調(diào)試功能蒋纬。所以隨著官方GDB被取代的趨勢(shì)猎荠,在iOS動(dòng)態(tài)調(diào)試使用LLDB也就比用GDB來(lái)得更加靠譜坚弱。
LLDB的基本調(diào)試步驟:
(1). LLDB只能運(yùn)行在Mac上,在iOS上調(diào)試需要安裝debugserver关摇,從而能夠進(jìn)行遠(yuǎn)程調(diào)試荒叶,首先需要裝載Mac上的DeveloperDiskImage,注意要選擇對(duì)應(yīng)設(shè)備系統(tǒng)版本下的DeveloperDiskImage

hdiutil attach /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/DeviceSupport/8.4/DeveloperDiskImage.dmg

(2). 拷貝debugserver到本地目錄

cp /Volumes/DeveloperDiskImage/usr/bin/debugserver ~/Desktop/debugserver/debugserver
cd ~/Desktop/debugserver/debugserver

(3). 對(duì)debugserver進(jìn)行瘦身输虱,只取對(duì)應(yīng)的設(shè)備的架構(gòu)包(這邊我的是iPhone5S對(duì)應(yīng)的是arm64)

lipo -thin arm64 debugserver -output ~/Desktop/debugserver/debugserver

(4). 創(chuàng)建一個(gè)名為entitlements.plist的文件些楣,并且輸入相應(yīng)的簽名文件內(nèi)容,保存到當(dāng)前目錄

vim
// 文本內(nèi)容
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>com.apple.springboard.debugapplications</key>
    <true/>
    <key>run-unsigned-code</key>
    <true/>
    <key>get-task-allow</key>
    <true/>
    <key>task_for_pid-allow</key>
    <true/>
</dict>
</plist>
// 保存
wq entitlements.plist

(5). 對(duì)debugserver進(jìn)行簽名

codesign -s - --entitlements entitlements.plist -f debugserver

(5). 將debugserver遠(yuǎn)程拷貝到對(duì)應(yīng)設(shè)備的usr/bin/目錄宪睹,注意@后面為局域網(wǎng)內(nèi)設(shè)備的IP地址

scp debugserver root@192.168.1.xxx:/usr/bin/debugserver

(6). SSH連接iOS端開(kāi)啟監(jiān)聽(tīng)端口愁茁,注意后面跟的是進(jìn)程名字,比如"Elephant"

debugserver *:8888 -a "Elephant"

(7). Mac端遠(yuǎn)程連接iOS亭病,進(jìn)行遠(yuǎn)程調(diào)試

// 打開(kāi)LLDB
lldb
platform select remote-ios
process connect connect://192.168.1.xxx:8888
// 查看ASLR偏移地址
image list -o -f
// 打印對(duì)象
po [[UIApplication sharedApplication] delegate]

注意:由于各種網(wǎng)絡(luò)原因鹅很,有可能會(huì)導(dǎo)致連接會(huì)比較久,不知道還以為程序死了罪帖,其實(shí)等等還是會(huì)有的促煮,這時(shí)可考慮采用USB連接方式
a. 下載usbmuxd,地址為https://cgit.sukimashita.com/usbmuxd.git/snapshot/usbmuxd-1.0.8.tar.gz
b. 解壓到相應(yīng)目錄胸蛛,終端進(jìn)入usbmuxd-1.0.8/python-client/目錄
c. 開(kāi)啟端口轉(zhuǎn)發(fā)污茵,python tcprelay.py -t 8888:8888

(8). 連接成功之后,即可在iOS上對(duì)應(yīng)的App進(jìn)行LLDB動(dòng)態(tài)調(diào)試葬项,其調(diào)試技巧與GDB有些差別泞当,但是基本上大同小異
LLDB與GDB命令的對(duì)照表:http://lldb.llvm.org/lldb-gdb.html
官網(wǎng):http://lldb.llvm.org/

c. Cycript
這是由越獄大神saurik開(kāi)發(fā)的一門(mén)腳本語(yǔ)言,能夠允許開(kāi)發(fā)者對(duì)Objective-C++ 和 JavaScript混合使用民珍,實(shí)現(xiàn)探測(cè)和修改運(yùn)行中的應(yīng)用程序襟士,主要用于注入目標(biāo)進(jìn)程或者鏈接庫(kù)中進(jìn)行動(dòng)態(tài)調(diào)試,它的好處是對(duì)原生程序或者代碼完全無(wú)副作用

// 注入進(jìn)程
cycript -p SpringBoard
// 正常進(jìn)入cycript后即可進(jìn)行相應(yīng)的操作嚷量,比如創(chuàng)建一個(gè)UIAlertView
alertView = [[UIAlertView alloc] initWithTitle:@"test" message:@"hello cycript" delegate:nil cancelButtonTitle:@"OK" otherButonTitles:nil]
#"<UIAlertView: 0x1379b40d0; frame = (0 0; 0 0); layer = <CALayer: 0x174a3e120>>"
[alertView show]
或者直接訪問(wèn)指針地址[#0x1379b40d0 show]
// 查找某個(gè)類(lèi)對(duì)象的內(nèi)存地址
choose(SBIconModel)
[#"<SBIconModel: 0x1702ae5e0>"]

官網(wǎng):http://www.cycript.org/

(3) UI動(dòng)態(tài)調(diào)試工具
Reveal
Reveal是iOS上強(qiáng)大動(dòng)態(tài)UI調(diào)試工具陋桂,能夠?qū)崿F(xiàn)注入,修改蝶溶,調(diào)試iOS應(yīng)用程序嗜历。需要收費(fèi),第一次下載有14天的免費(fèi)期限
普通集成方式:
a. CocoaPods 集成
b. 斷點(diǎn)加載
c. 項(xiàng)目依賴(lài)
越獄集成方式:
a. 將Reveal目錄下的Reveal.framework和libReveal.dylib拷貝到設(shè)備上的相應(yīng)目錄抖所;

scp -r /Applications/Reveal.app/Contents/SharedSupport/iOS-Libraries/Reveal.framework root@192.168.1.xxx:/System/Library/Frameworks 
scp /Applications/Reveal.app/Contents/SharedSupport/iOS-Libraries/libReveal.dylib root@192.168.1.xxx:/Library/MobileSubstrate/DynamicLibraries

b. 在設(shè)備的/Library/MobileSubstrate/DynamicLibraries/目錄下創(chuàng)建libReveal.plist梨州,并且編輯匹配的目標(biāo)程序的BundleID,內(nèi)容如下田轧;

{  
    Filter = { 
         Bundles = ("com.apple.AppStore");
         Bundles = ("com.tencent.xin");  
    };  
}

c. 保證Mac端和設(shè)備處在同一局域網(wǎng)內(nèi)暴匠,這時(shí)Mac打開(kāi)Revea,并且在iOS設(shè)備上打開(kāi)目標(biāo)程序傻粘,即可進(jìn)行UI動(dòng)態(tài)調(diào)試每窖;
官網(wǎng):https://revealapp.com/

5.4. 工程構(gòu)建

MacPorts和dpkg
MacPorts一個(gè)軟件包管理系統(tǒng)帮掉,可用于簡(jiǎn)化OS X和Darwin操作系統(tǒng)內(nèi)軟件的安裝。而dpkg則是Debian軟件包管理器的基礎(chǔ)窒典,是一個(gè)底層工具蟆炊,主要用于安裝,卸載和管理deb軟件包瀑志,dpkg通過(guò)MacPorts來(lái)安裝
https://www.macports.org/
Theos
Theos最初是一個(gè)“iphone-framework”盅称,以簡(jiǎn)化在iOS設(shè)備(主要是越獄設(shè)備)上命令行的代碼構(gòu)建。后面演變?yōu)榛趍ake的構(gòu)建系統(tǒng)后室,可運(yùn)行在OSX,iOS混狠,Linux和Windows上岸霹,主要用于iOS越獄軟件的開(kāi)發(fā)。
(1). 安裝ldid将饺,在Theos開(kāi)發(fā)中贡避,ldid替代Xcode自帶的Codesign對(duì)插件進(jìn)行簽名;

sudo brew install ldid

(2). 安裝Theos予弧,一般是安裝在/opt/目錄下

sudo git clone --recursive https://github.com/theos/theos.git /opt/theos

(3). 創(chuàng)建工程

export THEOS=/opt/theos
$THEOS/bin/nic.pl
// 選擇工程模版
  [1.] iphone/application
  [2.] iphone/library
  [3.] iphone/preference_bundle
  [4.] iphone/tool
  [5.] iphone/tweak
Choose a Template (required):

(4). 工程代碼編寫(xiě)刮吧,以tweak為例子

control    // 用于存儲(chǔ)deb包管理的基本信息,包括包名掖蛤,工程名杀捻,版本,作者信息等
Makefile   // 工程配置文件蚓庭,用來(lái)指定工程用到的文件致讥、框架、庫(kù)器赞、使用的SDK等
projectName.plist // 配置需要hook的Bundle ID
Tweak.xm   // 程序的入口垢袱,一般進(jìn)行進(jìn)程,類(lèi)港柜,函數(shù)等的hook和其他操作
// 基礎(chǔ)語(yǔ)法
%hook ClassName
// Hooking a class method
+ (id)sharedInstance {
    return %orig;
}
 
// Hooking an instance method with an argument.
- (void)messageName:(int)argument {
    %log; // Write a message about this call, including its class, name and arguments, to the system log.
 
    %orig; // Call through to the original function with its original arguments.
    %orig(nil); // Call through to the original function with a custom argument.
 
    // If you use %orig(), you MUST supply all arguments (except for self and _cmd, the automatically generated ones.)
}
 
// Hooking an instance method with no arguments.
- (id)noArguments {
    %log;
    id awesome = %orig;
    [awesome doSomethingElse];
 
    return awesome;
}
 
// Always make sure you clean up after yourself; Not doing so could have grave consequences!
%end
// Logos語(yǔ)法:http://iphonedevwiki.net/index.php/Logos

(5). 編譯请契,打包和安裝插件

// 編譯
make
// 打包,完成之后會(huì)生成一個(gè)deb的安裝包
make package
// 安裝到指定設(shè)備夏醉,注意需要確認(rèn)Makefile文件中指定的設(shè)備IP是否正確
make install

GitHub:https://github.com/theos/theos

iOSOpenDev
可視化的iOS越獄開(kāi)發(fā)工具爽锥,與Xcode深度整合,不需要通過(guò)命令行授舟,在熟悉的Xcode上即可進(jìn)行iOS越獄開(kāi)發(fā)救恨,調(diào)試也方便。與開(kāi)發(fā)普通App相比释树,熟悉的味道肠槽,一樣的配方
官網(wǎng):http://iosopendev.com/
GitHub:https://github.com/kokoabim/iOSOpenDev

5.5. 可視化管理工具

iTools
國(guó)產(chǎn)iOS系統(tǒng)管理工具擎淤,界面簡(jiǎn)潔,功能全面秸仙,除了有豐富的用戶(hù)端功能之外嘴拢,還有針對(duì)開(kāi)發(fā)者的高級(jí)功能
iFunBox
老外出品,主要功能是針對(duì)iOS系統(tǒng)的文件管理
91手機(jī)助手PC版
最早的iOS系統(tǒng)管理工具寂纪,V3版本之后功能比較臃腫席吴,缺少了開(kāi)發(fā)者工具

5.6. 技術(shù)儲(chǔ)備

(1). 熟悉iOS基礎(chǔ)知識(shí),ObjC語(yǔ)言以及框架
(2). 匯編和編譯原理
(3). 逆向工程

6. 擴(kuò)展閱讀

IDA Pro權(quán)威指南
iOS應(yīng)用逆向工程
看雪論壇
國(guó)內(nèi)逆向論壇

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
禁止轉(zhuǎn)載捞蛋,如需轉(zhuǎn)載請(qǐng)通過(guò)簡(jiǎn)信或評(píng)論聯(lián)系作者孝冒。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市拟杉,隨后出現(xiàn)的幾起案子庄涡,更是在濱河造成了極大的恐慌,老刑警劉巖搬设,帶你破解...
    沈念sama閱讀 206,214評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件穴店,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡拿穴,警方通過(guò)查閱死者的電腦和手機(jī)泣洞,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)默色,“玉大人球凰,你說(shuō)我怎么就攤上這事「么埃” “怎么了弟蚀?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,543評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)酗失。 經(jīng)常有香客問(wèn)我义钉,道長(zhǎng),這世上最難降的妖魔是什么规肴? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,221評(píng)論 1 279
  • 正文 為了忘掉前任捶闸,我火速辦了婚禮,結(jié)果婚禮上拖刃,老公的妹妹穿的比我還像新娘删壮。我一直安慰自己,他們只是感情好兑牡,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,224評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布央碟。 她就那樣靜靜地躺著,像睡著了一般均函。 火紅的嫁衣襯著肌膚如雪亿虽。 梳的紋絲不亂的頭發(fā)上菱涤,一...
    開(kāi)封第一講書(shū)人閱讀 49,007評(píng)論 1 284
  • 那天,我揣著相機(jī)與錄音洛勉,去河邊找鬼粘秆。 笑死,一個(gè)胖子當(dāng)著我的面吹牛收毫,可吹牛的內(nèi)容都是我干的攻走。 我是一名探鬼主播,決...
    沈念sama閱讀 38,313評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼此再,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼昔搂!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起输拇,我...
    開(kāi)封第一講書(shū)人閱讀 36,956評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤巩趁,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后淳附,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,441評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡蠢古,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,925評(píng)論 2 323
  • 正文 我和宋清朗相戀三年奴曙,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片草讶。...
    茶點(diǎn)故事閱讀 38,018評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡洽糟,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出堕战,到底是詐尸還是另有隱情坤溃,我是刑警寧澤,帶...
    沈念sama閱讀 33,685評(píng)論 4 322
  • 正文 年R本政府宣布嘱丢,位于F島的核電站薪介,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏越驻。R本人自食惡果不足惜汁政,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,234評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望缀旁。 院中可真熱鬧记劈,春花似錦、人聲如沸并巍。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,240評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)懊渡。三九已至刽射,卻和暖如春军拟,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背柄冲。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,464評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工吻谋, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人现横。 一個(gè)月前我還...
    沈念sama閱讀 45,467評(píng)論 2 352
  • 正文 我出身青樓漓拾,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親戒祠。 傳聞我的和親對(duì)象是個(gè)殘疾皇子骇两,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,762評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容