[TOC]
==iOS逆向環(huán)境介紹==
*** 越獄環(huán)境:iphone5s iOS 8.3***
luz-iphone:~ root# uname -a
Darwin luz-iphone 14.0.0 Darwin Kernel Version 14.0.0: Sun Mar 29 19:47:37 PDT 2015; root:xnu-2784.20.34~2/RELEASE_ARM64_S5L8960X iPhone6,2 arm64 N53AP Darwin
1.Drawin體系
-
Darwin是一種類似unix的操作系統(tǒng),他的核心XNU,XNU是一種混合式內(nèi)核,結(jié)合了mach與BSD兩種內(nèi)核
- 主流的類unix:
Linux 由Linus Torvalds研發(fā)的,代表發(fā)行版本CenOS,Redhat,Ubuntu,Debian,openWRT等
Mac OS X的Intel部分
freeBSD 由加州大學(xué)伯克利分校基于UNIX研發(fā)的(UNIX變種,當(dāng)時(shí)如果不是與貝爾實(shí)驗(yàn)室打官司,可能就不會(huì)有現(xiàn)在的Linux什么事)
Solaris 由Sun(現(xiàn)為Oracel)開發(fā)的UNIX商業(yè)版本
- 主流的類unix:
BSD 實(shí)現(xiàn)在Mach的上層,這一層提供的API 支持了POSIX標(biāo)準(zhǔn)模型。在XNU中主要實(shí)現(xiàn)了一些高級(jí)的API與模塊
UNIX 進(jìn)程模型
== e.g fork,vfork,wait,waitpid,exec等 ==POSIX 線程模型即pthread,以及相關(guān)的同步功能
== e.g pthread_create,pthread_mutex(線程互斥鎖)==UNIX的用戶與組管理
==e.g root用戶,mobile用戶,chmod等==網(wǎng)絡(luò)協(xié)議棧(BSD Socket API),符合POSIX 模型
== e.g socket();bind(); listen();accept();connect(); gethostbyname(); gethostbyaddr()等伯克利套接字API==文件系統(tǒng)/設(shè)備系統(tǒng)
== e.g Filesystem Hierarchy Standard(文件系統(tǒng)層次化標(biāo)準(zhǔn))==
-
iOS,OSI,ISO的含義
iOS 蘋果公司開發(fā)的移動(dòng)操作系統(tǒng)
OSI 是Open System Interconnection的縮寫,意為開放式系統(tǒng)互聯(lián)。OSI模型把網(wǎng)絡(luò)通信的工作分為7層,分別是物理層、數(shù)據(jù)鏈路層、網(wǎng)絡(luò)層、傳輸層、會(huì)話層、表示層和應(yīng)用層。
-
IOS是國際標(biāo)準(zhǔn)化組織。上面的OSI模型由該組織制定。一般類UNIX系統(tǒng)都基本符合POSIX標(biāo)準(zhǔn)和IOS C標(biāo)準(zhǔn)
POSIX表示可移植操作系統(tǒng)接口(Portable Operating System Interface)
IOS C標(biāo)準(zhǔn),C語言標(biāo)準(zhǔn)庫接口
為什么越獄
-
突破iOS沙盒機(jī)制的限制(sandbox)
== 沙盒是一種安全機(jī)制,為運(yùn)行中的程序提供隔離環(huán)境。沙盒在啟動(dòng)的時(shí)候可以設(shè)置運(yùn)行的程序是否可以訪問網(wǎng)絡(luò)、文件、目錄等==
這里寫圖片描述
2.Cydia - 越獄iOS的軟件管理平臺(tái) (Cydia 之父 - Jay Freeman(杰 弗里曼))
越獄iOS是合法的
-
安裝OpenSSH
== 在Cydia中搜索OpenSSH并安裝,這樣iOS上面就可以開啟SSH服務(wù)。SSH服務(wù)默認(rèn)綁定端口號(hào)22 ==- 使用SSH命令連接iOS,默認(rèn)登錄密碼"alpine"
ssh root@xx.xx.xx.xx //iOS連接wifi,設(shè)置中可以看到ip地址,也可以改成靜態(tài)IP地址
- 使用scp命令可以傳輸文件
scp filename root@xx.xx.xx.xx:/tmp //拷貝本地文件到遠(yuǎn)端
scp root@xx.xx.xx.xx:/tmp/filename /tmp/ //從遠(yuǎn)端拷貝文件到本地
- 修改默認(rèn)密碼
passwd root
passwd mobile
-
安裝軟件包管理工具apt-get
== 在Cydia中搜索 APT 0.6 Transitional并安裝 ==- 命令介紹
apt-get update 【更新所有的源】 apt-get upgrade 【更新所有通過apt-get安裝的程序】 apt-get install packagename 【安裝軟件包】 apt-get remove packagename 【刪除軟件包,不刪除依賴包,不刪除配置文件】 apt-get remove --purge packagename 【刪除該軟件包,不刪除依賴包,刪除配置文件】 apt-get autoremove packagename [刪除該軟件包,刪除依賴包,不刪除配置文件] apt-get autoremove --purge packagname 【可以刪除所有依賴包+配置文件】 apt-cache search string 【搜索含有該string字段的軟件包】 apt-cache show packagename 【詳細(xì)顯示該軟件包的信息】 apt-get clean 【清除apt-get安裝的軟件包備份,可以釋放儲(chǔ)存空間,不影響軟件正常使用】
- 命令介紹
-
使用apt-get 安裝軟件包
== e.g 安裝traceroute ==apt-get install traceroute //發(fā)現(xiàn)找不到軟件包 //如果不知道軟件包名稱,也可以用關(guān)鍵字搜索 apt-cache search traceroute apt-get install network-cmds
-
安裝必要工具
apt-get install ping apt-get install ps apt-get install find apt-get install tcpdump apt-get install top apt-get install vim apt-get install network-cmds //-arp, ifconfig, netstat, route, traceroute
工具的使用
ping www.baidu.com -c 4 -s 600 //發(fā)送icmp報(bào)文,檢查網(wǎng)絡(luò)狀況
ps aux //查看進(jìn)程信息
ps -e
find / -name ping //在根目錄開始查找文件名為ping的文件
grep -r 'hello*' /tmp //在/tmp目錄中查找包含'hello'字符的文件,-r表示包含子目錄
top
top -l 1 | head -n 10 | grep PhysMem //顯示系統(tǒng)內(nèi)存使用情況
tcpdump -i en0 src host 192.168.1.137
tcpdump -i en0 dst host 192.168.1.137
tcpdump -w /tmp/ssh.cap -i en0 tcp port 22 and dst host 192.168.1.137
tcpdump -w /tmp/ssh.cap -i en0 -t -s 0 -c 100 tcp port ! 22 and dst host 192.168.1.137
解釋:
(1)-w /tmp/ssh.cap : 保存成cap文件,方便用ethereal(即wireshark)分析
(2)-i en0 : 只抓經(jīng)過接口en0的包
(3)-t : 不顯示時(shí)間戳
(4)-s 0 : 抓取數(shù)據(jù)包時(shí)默認(rèn)抓取長度為68字節(jié)。加上-S 0 后可以抓到完整的數(shù)據(jù)包
(5)-c 100 : 只抓取100個(gè)數(shù)據(jù)包
(6) tcp port ! 22 : 不抓tcp端口22的數(shù)據(jù)包
(7) dst port ! 22 : 不抓取目標(biāo)端口是22的數(shù)據(jù)包
(8)dst host 192.168.1.137 : 抓取目標(biāo)地址為192.168.1.137的包
(9)src net 192.168.1.0/24 : 數(shù)據(jù)包的源網(wǎng)絡(luò)地址為192.168.1.0/24
3.iOS文件系統(tǒng)結(jié)構(gòu)
可視化方式常看iOS系統(tǒng)文件
==在iOS通過Cydia安裝Apple File Conduit 2,在OS X使用iFunBox可以查看iOS系統(tǒng)文件(iOS和OS X需要在通一個(gè)局域網(wǎng)內(nèi))==通過SSH遠(yuǎn)程登錄iOS來查看
-
Filesystem Hierarchy Standard 文件系統(tǒng)層次化標(biāo)準(zhǔn)(以下簡(jiǎn)稱FHS)
==FHS為類UNIX操作系統(tǒng)的文件目錄結(jié)構(gòu)制定了一套標(biāo)準(zhǔn),目的是讓用戶預(yù)知文件或目錄的存放位置。UNIX操作系統(tǒng)的常見目錄結(jié)構(gòu)如下所示。==/:根目錄,以斜杠表示,其他所有文件和目錄在根目錄下展開。 /bin:"binary"的簡(jiǎn)寫,存放提供用戶級(jí)基礎(chǔ)功能的二進(jìn)制文件,如ls、ps等。 /boot:存放能使系統(tǒng)成功啟動(dòng)的所有文件。iOS中此目錄為空。 /dev:"device"的簡(jiǎn)寫,存放BSD設(shè)備文件。每個(gè)文件代表系統(tǒng)的一個(gè)塊設(shè)備或字符設(shè)備,一般來說,“塊設(shè)備”以塊為單位傳輸數(shù)據(jù),如硬盤;而“字符設(shè)備”以字符為單位傳輸數(shù)據(jù),如調(diào)制解調(diào)器。 /sbin:"system binaries"的簡(jiǎn)寫,存放提供系統(tǒng)級(jí)基礎(chǔ)功能的二進(jìn)制文件,如netstat、reboot等。 /etc:"Et Cetera"的簡(jiǎn)寫,存放系統(tǒng)腳本及配置文件,如passwd、hosts等。在iOS中,/etc是一個(gè)符號(hào)鏈接,實(shí)際指向/private/etc。 /lib:存放系統(tǒng)庫文件、內(nèi)核模塊及設(shè)備驅(qū)動(dòng)等。iOS中此目錄為空。 /mnt:"mount"的簡(jiǎn)寫,存放臨時(shí)的文件系統(tǒng)掛載點(diǎn)。iOS中此目錄為空。 /private:存放兩個(gè)目錄,分別是/private/etc和/private/var。 /tmp:臨時(shí)目錄。在iOS中,/tmp是一個(gè)符號(hào)鏈接,實(shí)際指向/private/var/tmp。 /usr:包含了大多數(shù)用戶工具和程序。/usr/bin包含那些/bin和/sbin中未出現(xiàn)的基礎(chǔ)功能,如nm、killall等;/usr/include包含所有的標(biāo)準(zhǔn)C頭文件;/usr/lib存放庫文件。 /var:"variable"的簡(jiǎn)寫,存放一些經(jīng)常更改的文件,比如日志、用戶數(shù)據(jù)、臨時(shí)文件等。其中/var/mobile和/var/root分別存放了mobile用戶和root用戶的文件,是重點(diǎn)關(guān)注的目錄。
- UNIX系統(tǒng)文件權(quán)限簡(jiǎn)介(UNIX一切皆文件:讀寫普通文件、目錄、設(shè)備、socket、管道、CPU信息、進(jìn)程信息等)
- 系統(tǒng)用3位(bit)來表示文件的權(quán)限,從高位到低位分別是r(read)權(quán)限、w(write)權(quán)限,以及x(execute)權(quán)限。文件與用戶的關(guān)系存在以下三種可能性:
- 此用戶是屬主用戶(文件所有者的權(quán)限)
- 此用戶不是屬主用戶,但在屬主組里(組用戶權(quán)限)
- 此用戶既不是屬主用戶,又不在屬主組里(Other用戶權(quán)限)
```
1111 1111 = 2^0*1 + 2^1*1 + 2^2*1 + 2^3*1 + ...+2^7*1 = 2^8 - 1
8421
1111 = 8+4+2+1 = 15
1011 = 8+2+1 = 11
rwx r-x r--
111 101 100
所有者 屬組 其他
用3*3位來表示一個(gè)文件的權(quán)限,如果某一位為1,則這一位代表的權(quán)限生效,否則無效。例如,111101101代表rwxr-xr-x,即該文件的屬主用戶擁有r、w、x權(quán)限,而屬主組和其他所有人只具有r和x權(quán)限;同時(shí),二進(jìn)制的111101101轉(zhuǎn)換成十六進(jìn)制是755,也是一種常見的權(quán)限表示法。
可以使用chmod 命令修改文件權(quán)限,如 chmod 755 filename
* iOS的獨(dú)有目錄
```
/Applications:存放所有的系統(tǒng)App和來自于Cydia的App,但不包括StoreApp。
/Developer:如果一臺(tái)設(shè)備連接Xcode后被指定為調(diào)試用機(jī),Xcode就會(huì)在iOS中生成這個(gè)目錄,其中會(huì)含有一些調(diào)試需要的工具和數(shù)據(jù)。
/Library:存放一些提供系統(tǒng)支持的數(shù)據(jù)。其中/Library/MobileSubstrate下存放了所有基于CydiaSubstrate(原名MobileSubstrate)的插件(如:tweak編寫的插件)。
/System/Library:iOS文件系統(tǒng)中最重要的目錄之一,存放大量系統(tǒng)組件。
/System/Library/Frameworks和/System/Library/PrivateFrameworks:存放iOS中的各種framework
/System/Library/CoreServices里的SpringBoard.app:iOS桌面管理器(類似于Windows里的explorer),是用戶與系統(tǒng)交流的最重要中介。
/User:用戶目錄(其實(shí)就是mobile用戶的home目錄),實(shí)際指向/var/mobile,這個(gè)目錄里存放大量用戶數(shù)據(jù),比如:
/var/mobile/Media/DCIM下存放照片;
/var/mobile/Media/Recordings下存放錄音文件;
/var/mobile/Library/SMS下存放短信數(shù)據(jù)庫;
/var/mobile/Library/Mail下存放郵件數(shù)據(jù)。
/var/mobile/Containers,存放StoreApp。值得注意的是,App的可執(zhí)行文件在bundle與App中的數(shù)據(jù)目錄被分別存放在/var/mobile/Containers/Bundle和/var/mobile/Containers/Data這兩個(gè)不同目錄下。其中/var/mobile/Containers/Data是我們常用的應(yīng)用沙盒目錄的起始目錄:NSString *directory = NSHomeDirectory(); //獲取沙盒根目錄
```
* iOS應(yīng)用(Store App)沙盒目錄:
- Application Bundle 包含應(yīng)用可執(zhí)行文件和資源文件
如獲取iOS上微信程序的Bundle路徑,可以通過ps -e | grep appname
luz-iphone:/ root# ps -e | grep WeChat
1368 ?? 5:41.43 /var/mobile/Containers/Bundle/Application/749DC69A-3A8D-4B5C-9926-1220E69FC85F/WeChat.app/WeChat
- Application Data 包含App運(yùn)行生產(chǎn)的數(shù)據(jù)和配置信息等
```
如獲取iOS上微信程序的Date路徑,可以通過cycript工具
luz-iphone:~ root# cycript -p WeChat
cy# directory = NSHomeDirectory()
@"/var/mobile/Containers/Data/Application/986376B5-EF08-4CAF-81FB-CAE48D1FE4AE"
cy#
Date目錄結(jié)構(gòu)如下:
```
luz-iphone:/var/mobile/Containers/Data/Application/986376B5-EF08-4CAF-81FB-CAE48D1FE4AE root# ls
Documents/ Library/ tmp/
```
Document 存放應(yīng)用運(yùn)行時(shí)生成的并且需要保存的數(shù)據(jù)。注:iTunes或iCloud同步設(shè)備時(shí)會(huì)備份該目錄
Library/Caches 存放應(yīng)用運(yùn)行時(shí)生成的并且需要保存的數(shù)據(jù)。iTunes或iCloud不同步。
Library/Preferences 存放偏好設(shè)置。iOS的偏好設(shè)置(settings)應(yīng)用也會(huì)在該目錄查找應(yīng)用的設(shè)置信息。NSUserDefaults保存在該目錄下。iTunes或iCloud同步設(shè)備時(shí)備份該目錄。
tmp 存放應(yīng)用運(yùn)行時(shí)所需的臨時(shí)數(shù)據(jù)。當(dāng)某個(gè)應(yīng)用沒運(yùn)行時(shí),iOS系統(tǒng)可能會(huì)清除該目錄下的文件。但不可依賴這種自動(dòng)清除機(jī)制,應(yīng)該及時(shí)手動(dòng)清除。
4.Cycript工具介紹(作者:saurik,官網(wǎng):http://www.cycript.org/)
-
Cycript是一款腳本語言,可以看作是Objective-JavaScript,它可以幫助我們輕松測(cè)試和驗(yàn)證函數(shù)效果。
在越獄手機(jī)中可以通過注入方式在第三方應(yīng)用中運(yùn)行
也可以用靜態(tài)庫的方式把cycript集成到自己的應(yīng)用(MonkeyDev,可以給非越獄iOS第三方App寫插件,但是權(quán)限受沙盒限制)
-
在越獄手機(jī)中安裝Cycript
在Cydia上搜索Cycript進(jìn)行安裝
apt-get install cycript
-
Cycript使用(注入到第三方進(jìn)程空間)
- 注入Cycript模塊到第三方進(jìn)程
//確認(rèn)進(jìn)程名或者進(jìn)程PID luz-iphone:/ root# ps -e | grep WeChat
1368 ?? 6:17.44 /var/mobile/Containers/Bundle/Application/749DC69A-3A8D-4B5C-9926-1220E69FC85F/WeChat.app/WeChat
//打開方式1
luz-iphone:/ root# cycript -p WeChat
cy#
//打開方式2
luz-iphone:/ root# cycript -p 1368
cy#
- 退出cycript
**Control+D**
- 實(shí)戰(zhàn)演練
//WeChat cycript -p WeChat
[[UIApplication sharedApplication] setStatusBarHidden:YES] //隱藏狀態(tài)欄
[[UIApplication sharedApplication] setStatusBarHidden:NO] //顯示狀態(tài)欄
[[[UIAlertView alloc]initWithTitle:@"Tanzhou" message:@"Hello luz" delegate:ni cancelButtonTitle:@"ok" otherButtonTitles:nil, nil] show] //彈框
[[UIApplication sharedApplication] setApplicationIconBadgeNumber:1000] //設(shè)置badge數(shù)字
[[UIApplication sharedApplication] setApplicationIconBadgeNumber:1]
[[UIApplication sharedApplication] setApplicationIconBadgeNumber:0]
[[UIApplication sharedApplication] setApplicationIconBadgeNumber:0]
//SpringBroad cycript -p SpringBroad
[[SBScreenShotter sharedInstance] saveScreenshot:YES] 截屏,閃光
[[SBScreenShotter sharedInstance] saveScreenshot:NO] 截屏,不閃光
[[SBScreenFlash mainScreenFlasher] flashColor:[UIColor magentaColor] withCompletion:nil] 屏幕閃紫色光
##### 5.逆向的你基本思路
- 正向工程(Forward Engineering)
抽象的邏輯設(shè)計(jì) => 具體的物理實(shí)現(xiàn)
設(shè)計(jì)概念和算法 => 編寫源代碼 => 編譯成二進(jìn)制機(jī)器碼
**將想法和設(shè)計(jì)理念變成具體實(shí)現(xiàn)的過程**
- 逆向工程(Reverse Engineering)
具體的物理實(shí)現(xiàn) => 抽象的邏輯設(shè)計(jì)
反編譯機(jī)器碼 => 匯編代碼(類似的高級(jí)語言代碼) => 理解其算法和設(shè)計(jì)概念
**從二進(jìn)制碼中提取設(shè)計(jì)概念和算法**
- 程序的編譯和反編譯
高級(jí)語言(C/C++/Oc/Java/Python/C#) -> 中間語言(如:匯編等) -> 目標(biāo)代碼(exe/lib/dll/sys/dylib等二進(jìn)制文件)
```
編譯鏈接
高級(jí)語言 -------> 機(jī)器碼
<------ 機(jī)器碼
反匯編/反編譯
編譯鏈接
高級(jí)語言 ===> 機(jī)器碼
<===
反匯編/反編譯
逆向的思路
逆向必須是有目的的、有針對(duì)性的(明確你要做的事情)
先熟悉你要逆向的目標(biāo)程序,從正向的思路去猜測(cè)他可能的實(shí)現(xiàn)方法(使用的框架、調(diào)用的系統(tǒng)API等)
-
定位關(guān)鍵代碼
通過監(jiān)控UI事件的響應(yīng)定位關(guān)鍵代碼
通過監(jiān)控底層API的調(diào)用定位關(guān)鍵代碼(如網(wǎng)絡(luò)訪問接口、文件讀寫接口等)
通過觀察數(shù)據(jù)的變化來定位關(guān)鍵代碼和地址
逆向是一個(gè)試錯(cuò)的過程,需要不停的猜測(cè)、查找和進(jìn)行驗(yàn)證,既考驗(yàn)?zāi)托囊部简?yàn)動(dòng)手能力
6.程序、進(jìn)程、線程、內(nèi)存結(jié)構(gòu)的概念
程序(靜態(tài)的,磁盤上)
程序是完成某個(gè)功能的指令集。程序一般是指可執(zhí)行的二進(jìn)制文件。-
進(jìn)程(動(dòng)態(tài)的,內(nèi)存中)
- 進(jìn)程的概念
進(jìn)程是程序的運(yùn)行實(shí)例,是系統(tǒng)進(jìn)行資源分配和調(diào)度運(yùn)行的基本單位。
換句話說進(jìn)程是一個(gè)容器,包含程序執(zhí)行需要的代碼、數(shù)據(jù)還有資源等信息。多任務(wù)的操作系統(tǒng),可以同時(shí)執(zhí)行多個(gè)進(jìn)程。
- 進(jìn)程虛擬地址空間
多任務(wù)操作系統(tǒng)中的每一個(gè)進(jìn)程都運(yùn)行在一個(gè)屬于它自己的內(nèi)存沙盤中,這個(gè)沙盤就是虛擬地址空間
(virtual addressspace), 在32位經(jīng)典模式下,它總是一個(gè)4GB的內(nèi)存地址塊。這些虛擬地址通過頁表(pagetable)
映射到物理內(nèi)存,頁表由操作系統(tǒng)維護(hù)并被處理器引用。每個(gè)進(jìn)程都擁有一套屬于它自己的頁表,但是還有一個(gè)隱情,
只要虛擬地址被使能,那么它將會(huì)作用于這臺(tái)機(jī)器上運(yùn)行的所有軟件,包括內(nèi)核本身,因此,有一部分虛擬地址必須保
留給內(nèi)核使用。
- 進(jìn)程的概念
線程
輕量級(jí)進(jìn)程,是進(jìn)程內(nèi)一個(gè)相對(duì)獨(dú)立的、可調(diào)度的執(zhí)行單元,是CPU調(diào)度的基本單元。函數(shù)
包含某個(gè)特定功能的代碼塊,可以叫做子程序。典型的內(nèi)存空間布局
-
從低地址到高地址依次為:代碼區(qū)、只讀常量區(qū)、全局區(qū)/數(shù)據(jù)區(qū)、BSS段、堆區(qū)、棧區(qū)。
代碼區(qū):存放可執(zhí)行指令。 只讀常量區(qū):存放字面值常量、具有常屬性且被初始化的全局和靜態(tài)局部變量(如:字符串字面值、被const關(guān)鍵字修飾的全局變量和被const關(guān)鍵字修飾的靜態(tài)局部變量)。 全局區(qū)/數(shù)據(jù)區(qū):存放已初始化的全局變量和靜態(tài)局部變量。 BBS段:存放未初始化的全局變量和靜態(tài)局部變量,并把它們的值初始化為0。 堆區(qū):存放動(dòng)態(tài)分配的內(nèi)存。 棧區(qū):自動(dòng)變量和函數(shù)調(diào)用時(shí)需要保存的信息(逆向分析的重點(diǎn)) 補(bǔ)充: 代碼區(qū)和只讀常量區(qū)一般統(tǒng)稱為代碼段 棧區(qū)和堆區(qū)之間相對(duì)生長的,堆區(qū)的分配一般按照地址從小到大進(jìn)行,而棧區(qū)的分配一般按照地址從大到小進(jìn)行分配。
這里寫圖片描述
7.逆向工具集和安裝和使用
- iOS逆向工程的工具大致可分為四類:
檢測(cè)工具
如:Reveal、tcpdump等反編譯工具(反匯編工具 - 分析二進(jìn)制文件并得到一些信息)
如:IDA、Hopper Disassembler、classdump等調(diào)試工具
如:lldb、Cycript等開發(fā)工具
如:Xcode、theos等
- classdump
可以將Mach-O文件中的Objective-C運(yùn)行時(shí)的聲明的信息導(dǎo)出,即編寫OC代碼時(shí)的 .h文件。class-dump只能導(dǎo)出未經(jīng)加密的App的頭文件。classdump是對(duì)"otool -ov" 信息的翻譯,以一種我們熟悉的易讀的方式呈現(xiàn)。官網(wǎng)http://stevenygard.com/projects/class-dump/where options are: -a show instance variable offsets -A show implementation addresses --arch <arch> choose a specific architecture from a universal binary (ppc, ppc64, i386, x86_64) -C <regex> only display classes matching regular expression -f <str> find string in method name -H generate header files in current directory, or directory specified with -o -I sort classes, categories, and protocols by inheritance (overrides -s) -o <dir> output directory used for -H -r recursively expand frameworks and fixed VM shared libraries -s sort classes and categories by name -S sort methods by name -t suppress header in output, for testing --list-arches list the arches in the file, then exit --sdk-ios specify iOS SDK version (will look in /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS<version>.sdk --sdk-mac specify Mac OS X version (will look in /Developer/SDKs/MacOSX<version>.sdk --sdk-root specify the full SDK root path (or use --sdk-ios/--sdk-mac for a shortcut)
-
otool工具簡(jiǎn)介
otool(object file displaying tool) :目標(biāo)文件的展示工具。可以用來發(fā)現(xiàn)應(yīng)用中使用到了哪些系統(tǒng)庫,調(diào)用了其中哪些方法,使用了庫中哪些對(duì)象及屬性,它是Xcode自帶的常用工具。-f print the fat headers -a print the archive header -h print the mach header -l print the load commands -L print shared libraries used -D print shared library id name -t print the text section (disassemble with -v) -p <routine name> start dissassemble from routine name -s <segname> <sectname> print contents of section -d print the data section -o print the Objective-C segment -r print the relocation entries -S print the table of contents of a library -T print the table of contents of a dynamic shared library -M print the module table of a dynamic shared library -R print the reference table of a dynamic shared library -I print the indirect symbol table -H print the two-level hints table -G print the data in code table -v print verbosely (symbolically) when possible -V print disassembled operands symbolically -c print argument strings of a core file -X print no leading addresses or headers -m don't use archive(member) syntax -B force Thumb disassembly (ARM objects only) -q use llvm's disassembler (the default) -Q use otool(1)'s disassembler -mcpu=arg use `arg' as the cpu for disassembly -j print opcode bytes -P print the info plist section as strings -C print linker optimization hints --version print the version of /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/otool
依賴庫的查詢
如: otool -L WeChart是否加殼
如:otool -l WeChart | grep -B 2 crypt
-
classdump的使用
class-dump -s -S -H /Applications/Memenet/Memenet.app/Contents/MacOS/memenet -o ./MyHeaders``` 查看某文件夾下文件的個(gè)數(shù),包括子文件夾里的。 ls -lR|grep "^-"|wc -l 查看某文件夾下文件夾的個(gè)數(shù),包括子文件夾里的。 ls -lR|grep "^d"|wc -l
- dumpdecrypted 砸殼工具
下載最新源碼: git clone https://github.com/stefanesser/dumpdecrypted.git
編譯動(dòng)態(tài)庫文件(dumpdecrypted.dylib): make
定位要砸殼的StoreApp的執(zhí)行文件名字TargetApp (ps -e 可以得到全路徑)
定位要砸殼的StoreApp的Document目錄:
cycript -p TargetApp
[[NSFileManager defaultManager]URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask][0]
得到路徑:#"file:///var/mobile/Containers/Data/Application/986376B5-EF08-4CAF-81FB-CAE48D1FE4AE/Documents/"
進(jìn)入Document目錄: cd /var/mobile/Containers/Data/Application/986376B5-EF08-4CAF-81FB-CAE48D1FE4AE/Documents/
拷貝dumpdecrypted.dylib: cp dumpdecrypted.dylib .
DYLD_INSERT_LIBRARIES=dumpdecrypted.dylib /var/mobile/Containers/Bundle/Application/749DC69A-3A8D-4B5C-9926-1220E69FC85F/WeChat.app/WeChat
- theos(作者:@DHowett)
越獄開發(fā)工具包
-
xcode工具集的路徑需要設(shè)置正確
查看命令: xcode-select --print-path設(shè)置命令: xcode-select --switch /Applications/Xcode-beta.app/Contents/Developer
通過github安裝theos
https://github.com/theos/theos/wiki/Installation-
修改所有者
sudo chown -R $(id -u):$(id -g) theostheos維基百科:
http://iphonedevwiki.net/index.php/Theos/Setup#For_Mac_OS_X
http://iphonedevwiki.net/index.php/Theos -
環(huán)境變量
export THEOS=/opt/theos可以寫入~/.bash_profile
source ~/.bash_profileecho $THEOS
-
ldid(作者:saurik )
維基百科:http://iphonedevwiki.net/index.php/Ldid越獄iPhone下的簽名工具(更改授權(quán)entitlements),可以為thos開發(fā)的程序進(jìn)程簽名(支持在OS X和iOS上運(yùn)行)。
安裝ldid
$ brew install ldid fakeroot加密算法
對(duì)稱加密算法:RC4、DES、3DES、AES128、AES256等。加解密雙方密鑰相同。
非對(duì)稱加密算法:RSA、Elgamal等。加解密雙方使用密鑰對(duì)。
哈希算法:MD5(16Byte)、SHA1(20Byte)等。任意長度的信息轉(zhuǎn)換成到某一固定長度的信息摘要(具有唯一性,不可逆性),主要作用是對(duì)數(shù)據(jù)數(shù)據(jù)完整性校驗(yàn)。
-
數(shù)字簽名 (蘋果官方的私鑰簽名,公鑰驗(yàn)證)
- 數(shù)字簽名是非對(duì)稱密鑰加密技術(shù)與數(shù)字摘要技術(shù)的應(yīng)用。對(duì)指定信息使用哈希算法,得到一個(gè)固定長度的信息摘要,然后再使用 私鑰 (注意必須是私鑰)對(duì)該摘要加密,就得到了數(shù)字簽名。
-
數(shù)字證書
數(shù)字證書是一個(gè)文件,由蘋果的 Apple Worldwide Developer Relations Certification Authority(WWDR)證書認(rèn)證中心進(jìn)行簽名,其的主要作用是用來標(biāo)示身份。證書文件主要包含兩部分內(nèi)容:證書信息和證書簽名證書信息
包含用戶的公鑰、用戶個(gè)人信息、證書頒發(fā)機(jī)構(gòu)信息、證書有效期等信息。(這里的用戶主要指開發(fā)者)證書簽名
WWDR將上述證書本身內(nèi)容的使用哈希算法得到一個(gè)固定長度的信息摘要,然后使用自己的私鑰對(duì)該信息摘要加密生成數(shù)字簽名。證書的驗(yàn)證
iOS系統(tǒng)原本就持有WWDR的公鑰,系統(tǒng)首先會(huì)對(duì)證書內(nèi)容通過指定的哈希算法計(jì)算得到一個(gè)信息摘要;然后使用WWDR的公鑰對(duì)證書中包含的數(shù)字簽名解密,從而得到經(jīng)過WWDR的私鑰加密過的信息摘要;最后對(duì)比兩個(gè)信息摘要,如果內(nèi)容相同就說明該證書可信。在驗(yàn)證了證書是可信的以后,iOS系統(tǒng)就可以獲取到證書中包含的開發(fā)者的公鑰,并使用該公鑰來判斷代碼簽名的可用性了。證書存在的意義
通過證書使用過程可以看出,證書本身只是一個(gè)容器,用來承載開發(fā)者的公鑰。iOS通過驗(yàn)證證書的合法性來確保開發(fā)者公鑰的合法性。
-
代碼簽名與驗(yàn)證(開發(fā)者的私鑰簽名,公鑰驗(yàn)證)
打包過程中使用開發(fā)者私鑰對(duì)應(yīng)用進(jìn)行簽名。開發(fā)者的公鑰被包含在數(shù)字證書里,數(shù)字證書又被包含在描述文件(Provisioning File)中,描述文件在應(yīng)用被安裝的時(shí)候會(huì)被拷貝到iOS設(shè)備中。iOS安全系統(tǒng)通過證書就能夠確定開發(fā)者身份,就能夠通過從證書中獲取到的公鑰來驗(yàn)證開發(fā)者用該公鑰對(duì)應(yīng)的私鑰簽名后的代碼、資源文件等有沒有被更改破壞,最終確定應(yīng)用能否合法的在iOS設(shè)備上合法運(yùn)行。
-
工具的使用
查看codesign load command otool -l WeChat | grep -A 5 SIGNATURE 查看簽名信息 ? tmp codesign -dvvv WeChat Executable=/private/tmp/WeChat Identifier=com.tencent.xin Format=Mach-O universal (armv7 arm64) CodeDirectory v=20200 size=448783 flags=0x0(none) hashes=14017+5 location=embedded Hash type=sha256 size=32 CandidateCDHash sha1=6e2f8a93dbe63c17ea3b3a3dc032826b9eddf2b7 CandidateCDHash sha256=d6f1afe23b598a76301711a4a62a5505a749a12a Hash choices=sha1,sha256 CDHash=d6f1afe23b598a76301711a4a62a5505a749a12a Signature size=3925 Authority=Apple iPhone OS Application Signing Authority=Apple iPhone Certification Authority Authority=Apple Root CA Info.plist=not bound TeamIdentifier=88L2Q4487U Sealed Resources=none Internal requirements count=1 size=96 查看entitlement內(nèi)容 codesign -d --entitlements - WeChat ldid -e WeChat 修改entitlement內(nèi)容 ldid -Sentitlement.xml WeChat
dpkg工具
安裝
$ brew install --from-bottle https://raw.githubusercontent.com/Homebrew/homebrew-core/7a4dabfc1a2acd9f01a1670fde4f0094c4fb6ffa/Formula/dpkg.rb
$ brew pin dpkg
- 使用
dpkg -i/-r deb包安裝/卸載
dpkg -s com.iosre.myiosreproject 查看安裝包信息