iOS越獄開發(fā)指南

1. 前言

若干年前偎窘,大家看到iPhone互相問好的第一件事是“你越獄了嗎”购公。據(jù)不完全統(tǒng)計蕴侣,早期有80%左右的iPhone用戶會選擇越獄。但是隨著iOS系統(tǒng)的逐步完善数苫,這個比例已經(jīng)在慢慢降低聪舒,甚至很多人已經(jīng)不知道越獄為何物,是美劇嗎虐急?那么作為iOS開發(fā)者过椎,有沒必要了解越獄,越獄完之后我們能干嘛戏仓?答案顯然是肯定的疚宇,那么這篇文章將帶你進(jìn)入越獄的世界里。

2. 什么是越獄

越獄(jailbreaking)在漢語詞典里面的指的是監(jiān)獄中的囚犯非法地離開或逃離監(jiān)獄的行為赏殃。眾說周知敷待,iOS是相對比較封閉的操作系統(tǒng),用戶和開發(fā)者所擁有的權(quán)限(自由)只能局限在特定的沙盒之中仁热。那么iOS 越獄則指的是通過系統(tǒng)漏洞榜揖,打破這種限制的過程。使得用戶最終能夠以root權(quán)限訪問文件系統(tǒng)和管理器抗蠢,隨心所欲的駕馭我們自己的iOS設(shè)備举哟。

image

3. 越獄的意義

3.1. 用戶

大概可以分為這么幾個方面:

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

第三方應(yīng)用市場:91助手妨猩,百度助手,PP助手秽褒,360助手等

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

比如快捷設(shè)置壶硅,來電歸屬地,一鍵清理销斟,更換界面主題庐椒,動態(tài)壁紙,蘋果公司近幾年的iOS系統(tǒng)更新所添加的新功能有很多都是從越獄插件中借鑒的蚂踊;
代表:91桌面约谈,SBSettings

image
image

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

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

3.1.4. 修復(fù)漏洞

可在蘋果漏洞未修復(fù)前棱诱,提前進(jìn)行修復(fù)

3.2. 開發(fā)者

以上總結(jié)的是越獄之后的對于用戶來說大致幾個方面的意義,但是隨著蘋果對iOS的逐步完善和免費(fèi)App(下載免費(fèi))成為趨勢特纤,不可否認(rèn)的是越獄的人群正逐步減少军俊,作為iOS開發(fā)者還有哪些更重要的意義呢?
主要包括以下幾個方面:

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

包括iOS整體框架粪躬,比如私有API,能夠更好的擴(kuò)展App功能昔穴,也意味著蘋果未來可能開放這部分接口镰官,更早的掌握核心技術(shù);
常用的私有API特性:
a. 實(shí)現(xiàn)更豐富的UI效果吗货,比如CAAnimation未公開的API
b. 打開受限制的硬件特性泳唠,比如iOS7上實(shí)現(xiàn)視頻硬解碼
c. 獲取已安裝App列表以及App信息
d. 獲取特殊的設(shè)備信息,比如IMEI宙搬,UDID等
e. 應(yīng)用內(nèi)安裝卸載IPA軟件包

image

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

作為開發(fā)者笨腥,總是驚嘆于很多優(yōu)秀的App能夠做的如此之好拓哺,tableview可以如絲般順滑;那么在贊嘆之余脖母,我們能夠動起手來了解這些App的設(shè)計思想士鸥,算法,以及實(shí)現(xiàn)方式谆级,弄清楚程序運(yùn)行的本來面目烤礁。

image

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

a. 遠(yuǎn)程調(diào)試,遠(yuǎn)離找數(shù)據(jù)線煩惱肥照;
b. app脚仔,bundle,framwork等可動態(tài)替換和加載舆绎,不需要重復(fù)安裝加載鲤脏;
c. 文件目錄自由訪問,動態(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     // 用戶目錄茅坛,如用戶安裝的程序相冊照片等都在這里
Developer               // Xcode調(diào)試設(shè)備自動生成的目錄

bin                     // "binary"的縮寫音半,存放用戶級基礎(chǔ)功能的二進(jìn)制文件,如cp,ls等
dev                     // "device"的縮寫贡蓖,存放BSD設(shè)備文件
sbin                    // "system binary"的縮寫曹鸠,存放系統(tǒng)級基礎(chǔ)功能的二進(jìn)制文件,如fsck斥铺,reboot等
usr                     // 包含了大多數(shù)用戶的工具和程序
private                 // 主要鏈接的目標(biāo)目錄
etc -> private/etc/     // "Et Cetera"的縮寫彻桃,存放系統(tǒng)腳步及配置文件
tmp -> private/var/tmp/ // 臨時文件存放目錄
var -> private/var/     // 存放經(jīng)常變化的文件,如日志文件

boot                    // 存放系統(tǒng)啟動文件晾蜘,iOS此目錄為空
cores                   // 內(nèi)核轉(zhuǎn)儲文件存放目錄邻眷,iOS此目錄為空
lib                     // 存放系統(tǒng)庫文件,內(nèi)核模塊及設(shè)備驅(qū)動等剔交,iOS此目錄為空
mnt                     // "mount"的縮寫肆饶,存放臨時的文件掛載點(diǎn),iOS此目錄為空

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

image
image

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

a. 核心代碼保護(hù)冯乘,反逆向蛉鹿,進(jìn)行代碼混淆
b. 保證信息安全,本地數(shù)據(jù)加密往湿,內(nèi)存數(shù)據(jù)保護(hù)
c. 防劫持,防注入惋戏,阻止GDB等動態(tài)調(diào)試工具依附

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

綜上所述领追,作為開發(fā)者,雖然面對的用戶(利益)可能越來越少响逢,學(xué)習(xí)和應(yīng)用越獄知識依然意義重大绒窑,使得技術(shù)更加純粹;

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

桌面操作系統(tǒng): Mac OS X
iOS設(shè)備: iPhone舔亭,iPod touch些膨,iPad
設(shè)備越獄:
(1). 確定對應(yīng)設(shè)備系統(tǒng)版本是否能夠完美越獄,尋找對應(yīng)的越獄工具
目前完美越獄的iOS系統(tǒng)版本:
iOS 1.0 ~ iOS 10.2.1(個別小版本不支持钦铺,比如iOS 9.3.5)
(2). 使用iTunes進(jìn)行數(shù)據(jù)備份订雾,越獄有風(fēng)險,一定要謹(jǐn)慎矛洞,記得備份洼哎,備份,備份
(3). 各個越獄工具沼本,步驟可能略有不同噩峦,隨著越獄技術(shù)的成熟,目前基本上支持一鍵越獄
Cydia:
越獄環(huán)境下的App Store抽兆,一般越獄工具會自動安裝

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

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

5.1.1 自給自足

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

5.1.2 嗟來之食

最方便快捷的途徑是去第三方的應(yīng)用分發(fā)平臺揍瑟,比如91白翻,PP助手等直接下載相應(yīng)的ipa包,但是一些國外或者冷門的App在上述平臺可能沒有,那就必須自己動手了滤馍。

5.2. 靜態(tài)分析

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

什么是Mach-O岛琼?它是一種用于可執(zhí)行文件,目標(biāo)代碼巢株,動態(tài)庫槐瑞,內(nèi)核轉(zhuǎn)儲的文件格式,目前Mac OS X阁苞,iOS的可執(zhí)行文件都是采用的這種文件格式困檩。所以,無論基于何種目的那槽,我們的入口基本都是從這里入手
可視化查看工具:
MachOView悼沿,免費(fèi)開源的項(xiàng)目,能夠可視化查看Mach-O的文件信息
dmg:http://sourceforge.net/projects/machoview/
GitHub:https://github.com/gdbinit/MachOView

image

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

逆向解析出目標(biāo)程序所有的頭文件信息骚灸,把盤子鋪開
原理:
在Mach-O結(jié)構(gòu)中主要通過以下幾個Section段糟趾,“__objc_classname” Section段保存有Objective-C所有的類名信息,“__objc_methname”的Section段則保存了所有的方法列表甚牲,而"__objc_classlist"的Section段則具有所有類的信息义郑,包括類名,變量丈钙,函數(shù)等關(guān)聯(lián)信息非驮。所以通過以上幾點(diǎn),從而能夠針對App著恩,bundle院尔,framwork,static library等的可執(zhí)行程序?qū)С鏊蠴bjective-C的頭文件信息喉誊;
Class-dump
class dump是一個命令行工具邀摆,它可以dump出破解之后的iOS二進(jìn)制文件的頭文件信息
教程:http://wiki.sankuai.com/display/~zhangzifeng02/Class-dump
官網(wǎng):http://stevenygard.com/

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

對于逆向出的各個頭文件信息,可能有幾百上千個文件伍茄,就像一幅圖上眾多的點(diǎn)栋盹,你很難有效的組織起來,從而能夠看穿一切敷矫。這就需要更加深入的分析例获,利用反匯編反編譯的手段,將點(diǎn)連成線曹仗,深入了解目標(biāo)程序的整體邏輯關(guān)系
原理:
反匯編(Disassembly)榨汤,是把目標(biāo)代碼轉(zhuǎn)換為更加便于易讀的匯編代碼的過程,對于任何的計算機(jī)程序都可以實(shí)施反匯編怎茫,并且對于有些強(qiáng)大的反匯編工具收壕,甚至能夠轉(zhuǎn)換為高級語言的代碼妓灌;
反匯編反編譯工具:
IDA
逆向工程界的神器,功能強(qiáng)大蜜宪,支持Windows虫埂,Mac OS X和Linux等平臺。正式版需要收費(fèi)圃验,價格不菲掉伏,有免費(fèi)試用版本,但是功能受限澳窑,對于初學(xué)者來說其實(shí)功能也夠用斧散,但是不支持64位的CPU,對于目前iOS設(shè)備普遍都是64位的CPU來說有點(diǎn)尷尬摊聋;
官網(wǎng):https://www.hex-rays.com/products/ida/index.shtml

image

Hopper Disassembler
后起之秀颅湘,主要針對Mac OS X平臺,能夠逆向32位和64位可執(zhí)行程序栗精,功能也相當(dāng)強(qiáng)大。有免費(fèi)和收費(fèi)版本瞻鹏,對比于IDA收費(fèi)版本價格更加親民悲立,個人版本700左右人民幣即可收入囊中。
官網(wǎng):https://www.hopperapp.com/

image

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

對目標(biāo)程序進(jìn)行靜態(tài)分析之后新博,我們能夠窺探程序的整個邏輯結(jié)構(gòu)薪夕。正如我們了解了一個工具的基本構(gòu)造之后,它是如何使用的呢赫悄?所以我們還必須通過動態(tài)調(diào)試的手段探測程序的運(yùn)行時情況原献。
動態(tài)調(diào)試指的是利用調(diào)試器在軟件運(yùn)行時,動態(tài)的調(diào)試跟蹤軟件的運(yùn)行情況埂淮。作為iOS開發(fā)人員姑隅,我們應(yīng)該都會用Xcode的在Debug模式下調(diào)試我們的程序,那么對于已發(fā)布的Release程序倔撞,我們能否進(jìn)行動態(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",為了避免安全隱患给僵,記得及時修改root和mobile賬戶的默認(rèn)密碼毫捣。

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

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

image

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

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

ps –ax                    // 輸出所有進(jìn)程的信息牌柄,找到輸出信息中目標(biāo)進(jìn)程的pid
gdb –p pid                // 從上面的輸出信息得到進(jìn)程pid畸悬,啟動相應(yīng)進(jìn)程
info sh                   // 查看目標(biāo)的基地址,記為base
// GDB常用調(diào)試技巧
break *(0X00ABCD+base)    // 一般通過IDA來靜態(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的簡寫冷冗,退出GDB調(diào)試環(huán)境。

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

image

b. LLDB
從Xcode5開始LLDB取代了GDB成為了Xcode新的默認(rèn)調(diào)試器惑艇,它是具有REPL(read-eval-print-loop蒿辙,交互式解釋器)特征的開源調(diào)試器,其可以安裝C++或者Python插件滨巴。它與LLVM編譯器一起思灌,帶給我們更豐富的流程控制和數(shù)據(jù)檢測的調(diào)試功能。所以隨著官方GDB被取代的趨勢恭取,在iOS動態(tài)調(diào)試使用LLDB也就比用GDB來得更加靠譜泰偿。
LLDB的基本調(diào)試步驟:
(1). LLDB只能運(yùn)行在Mac上,在iOS上調(diào)試需要安裝debugserver蜈垮,從而能夠進(jìn)行遠(yuǎn)程調(diào)試耗跛,首先需要裝載Mac上的DeveloperDiskImage,注意要選擇對應(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). 對debugserver進(jìn)行瘦身攒发,只取對應(yīng)的設(shè)備的架構(gòu)包(這邊我的是iPhone5S對應(yīng)的是arm64)

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

(4). 創(chuàng)建一個名為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). 對debugserver進(jìn)行簽名

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

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

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

(6). SSH連接iOS端開啟監(jiān)聽端口烟阐,注意后面跟的是進(jìn)程名字,比如"Elephant"

debugserver *:8888 -a "Elephant"

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

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

注意:由于各種網(wǎng)絡(luò)原因蜒茄,有可能會導(dǎo)致連接會比較久,不知道還以為程序死了餐屎,其實(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. 開啟端口轉(zhuǎn)發(fā)屿聋,python tcprelay.py -t 8888:8888

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

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

// 注入進(jìn)程
cycript -p SpringBoard
// 正常進(jìn)入cycript后即可進(jìn)行相應(yīng)的操作,比如創(chuàng)建一個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]
或者直接訪問指針地址[#0x1379b40d0 show]
// 查找某個類對象的內(nèi)存地址
choose(SBIconModel)
[#"<SBIconModel: 0x1702ae5e0>"]

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

(3) UI動態(tài)調(diào)試工具
Reveal
Reveal是iOS上強(qiá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)目依賴
越獄集成方式:
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)肌厨,這時Mac打開Revea萧朝,并且在iOS設(shè)備上打開目標(biāo)程序,即可進(jìn)行UI動態(tài)調(diào)試夏哭;
官網(wǎng):https://revealapp.com/

5.4. 工程構(gòu)建

MacPorts和dpkg
MacPorts一個軟件包管理系統(tǒng),可用于簡化OS X和Darwin操作系統(tǒng)內(nèi)軟件的安裝献联。而dpkg則是Debian軟件包管理器的基礎(chǔ)竖配,是一個底層工具,主要用于安裝里逆,卸載和管理deb軟件包进胯,dpkg通過MacPorts來安裝
https://www.macports.org/
Theos
Theos最初是一個“iphone-framework”,以簡化在iOS設(shè)備(主要是越獄設(shè)備)上命令行的代碼構(gòu)建原押。后面演變?yōu)榛趍ake的構(gòu)建系統(tǒng)胁镐,可運(yùn)行在OSX,iOS诸衔,Linux和Windows上盯漂,主要用于iOS越獄軟件的開發(fā)。
(1). 安裝ldid笨农,在Theos開發(fā)中就缆,ldid替代Xcode自帶的Codesign對插件進(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). 工程代碼編寫竭宰,以tweak為例子

control    // 用于存儲deb包管理的基本信息空郊,包括包名,工程名切揭,版本狞甚,作者信息等
Makefile   // 工程配置文件,用來指定工程用到的文件廓旬、框架哼审、庫、使用的SDK等
projectName.plist // 配置需要hook的Bundle ID
Tweak.xm   // 程序的入口嗤谚,一般進(jìn)行進(jìn)程棺蛛,類,函數(shù)等的hook和其他操作
// 基礎(chǔ)語法
%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語法:http://iphonedevwiki.net/index.php/Logos

(5). 編譯巩步,打包和安裝插件

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

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

iOSOpenDev
可視化的iOS越獄開發(fā)工具椅野,與Xcode深度整合终畅,不需要通過命令行,在熟悉的Xcode上即可進(jìn)行iOS越獄開發(fā)竟闪,調(diào)試也方便离福。與開發(fā)普通App相比,熟悉的味道炼蛤,一樣的配方
官網(wǎng):http://iosopendev.com/
GitHub:https://github.com/kokoabim/iOSOpenDev

image

5.5. 可視化管理工具

iTools
國產(chǎn)iOS系統(tǒng)管理工具妖爷,界面簡潔,功能全面理朋,除了有豐富的用戶端功能之外絮识,還有針對開發(fā)者的高級功能
iFunBox
老外出品,主要功能是針對iOS系統(tǒng)的文件管理
91手機(jī)助手PC版
最早的iOS系統(tǒng)管理工具嗽上,V3版本之后功能比較臃腫次舌,缺少了開發(fā)者工具

5.6. 技術(shù)儲備

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

6. 擴(kuò)展閱讀

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

原文作者:Wind_Z
原文鏈接:http://www.reibang.com/p/9d046b953546

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末兽愤,一起剝皮案震驚了整個濱河市彼念,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌浅萧,老刑警劉巖逐沙,帶你破解...
    沈念sama閱讀 216,496評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異洼畅,居然都是意外死亡酱吝,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評論 3 392
  • 文/潘曉璐 我一進(jìn)店門土思,熙熙樓的掌柜王于貴愁眉苦臉地迎上來务热,“玉大人忆嗜,你說我怎么就攤上這事∑槠瘢” “怎么了捆毫?”我有些...
    開封第一講書人閱讀 162,632評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長冲甘。 經(jīng)常有香客問我绩卤,道長,這世上最難降的妖魔是什么江醇? 我笑而不...
    開封第一講書人閱讀 58,180評論 1 292
  • 正文 為了忘掉前任濒憋,我火速辦了婚禮,結(jié)果婚禮上陶夜,老公的妹妹穿的比我還像新娘凛驮。我一直安慰自己,他們只是感情好条辟,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,198評論 6 388
  • 文/花漫 我一把揭開白布黔夭。 她就那樣靜靜地躺著,像睡著了一般羽嫡。 火紅的嫁衣襯著肌膚如雪本姥。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,165評論 1 299
  • 那天杭棵,我揣著相機(jī)與錄音婚惫,去河邊找鬼。 笑死魂爪,一個胖子當(dāng)著我的面吹牛先舷,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播甫窟,決...
    沈念sama閱讀 40,052評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼蛙婴!你這毒婦竟也來了粗井?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,910評論 0 274
  • 序言:老撾萬榮一對情侶失蹤街图,失蹤者是張志新(化名)和其女友劉穎浇衬,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體餐济,經(jīng)...
    沈念sama閱讀 45,324評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡耘擂,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,542評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了絮姆。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片醉冤。...
    茶點(diǎn)故事閱讀 39,711評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡秩霍,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出蚁阳,到底是詐尸還是另有隱情铃绒,我是刑警寧澤,帶...
    沈念sama閱讀 35,424評論 5 343
  • 正文 年R本政府宣布螺捐,位于F島的核電站颠悬,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏定血。R本人自食惡果不足惜赔癌,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,017評論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望澜沟。 院中可真熱鬧灾票,春花似錦、人聲如沸倔喂。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,668評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽席噩。三九已至班缰,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間悼枢,已是汗流浹背埠忘。 一陣腳步聲響...
    開封第一講書人閱讀 32,823評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留馒索,地道東北人莹妒。 一個月前我還...
    沈念sama閱讀 47,722評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像绰上,于是被迫代替她去往敵國和親旨怠。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,611評論 2 353

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

  • 1. 前言 若干年前蜈块,大家看到iPhone互相問好的第一件事是“你越獄了嗎”鉴腻。據(jù)不完全統(tǒng)計,早期有80%左右的iP...
    Wind_Z閱讀 13,164評論 3 40
  • 如果你看完書中的所有例子百揭,你很可能已經(jīng)做完你的實(shí)驗(yàn)和在已經(jīng)越獄的iPhone上的研究爽哎。因?yàn)楹驮S多人一樣,幾乎所有的...
    fishmai0閱讀 15,982評論 2 42
  • “iOS應(yīng)用安全權(quán)威指南”讀書筆記 “第二部分”為安全性測試器一,共包括四课锌、五、六章 第四章:構(gòu)建測試平臺 本...
    武當(dāng)霍元甲閱讀 1,147評論 0 2
  • layout: wikititle: iOS逆向分析筆記categories: Reverse_Engineeri...
    超哥__閱讀 10,743評論 3 16
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫祈秕、插件渺贤、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,094評論 4 62