1. 為什么要逆向工程
iOS 逆向工程主要有兩個作用:
1毒姨,分析目標程序,拿到關鍵信息,可以歸類于安全相關的逆向工程;
2陋桂,借鑒他人的程序功能來開發(fā)自己的軟件廉油,即開發(fā)相關的逆向工程碰声。
其中跟啤,安全相關的iOS逆向工程主要有如下幾個場景:
- 評定安全等級
- 逆向惡意軟件
- 檢查軟件后門
- 去除軟件使用限制
而開發(fā)相關的iOS逆向工程有如下兩個場景:
1乃沙、逆向系統(tǒng)API
可逆向系統(tǒng)API后起趾,擴展iOS系統(tǒng)的功能,眾所周知,能在 AppStore 上架的 App 的功能十分有限,在蘋果公司嚴格的審核制度下,絕大多數(shù) App 的實現(xiàn)都源于公開的開發(fā)文 ,而不能使用例如發(fā)短信警儒、打電話等文檔中不涉及的功能训裆。
2、借鑒別人的軟件
比如通過逆向那些軟件,可以從 App 中把它們的設計思路抽象出來為我所用,從而提高自己 App 的精致程度蜀铲。
2. iOS應用逆向工具
1边琉,監(jiān)測工具Reveal:能夠輔助定位 App 中我們感興趣的部分,讓我們能夠迅速從 UI 層面切入代碼層面。
2蝙茶,反匯編工具:IDA和Hopper
3艺骂,調試工具:LLDB調試器
4,Theos 和iOSOpenDev
3. iOS系統(tǒng)相關知識
3.1 iOS 系統(tǒng)結構
1隆夯,對于未越獄的 iOS設備,蘋果官方開放給第三方直接訪問 iOS文件系統(tǒng)的接口非常有限钳恕。
2,越獄后能夠訪問 iOS 全系統(tǒng)文件蹄衷,這是開展 iOS 逆向工程的首要前提忧额。
3.2 iOS 目錄結構簡介
/:根目錄,以斜杠表示,其他所有文件和目錄在根目錄下展開。
/bin:“binary”的簡寫,存放提供用戶級基礎功能的二進制文件,如 ls愧口、ps 等睦番。
/boot:存放能使系統(tǒng)成功啟動的所有文件。iOS 中此目錄為空。
/dev:“device”的簡寫,存放BSD設備文件托嚣。每個文件代表系統(tǒng)的一個塊設備或字符設備,一般來說,“ 設備”以塊為單位傳 數(shù)據,如硬盤;而“字符設備”以字符為單位傳輸數(shù)據,如調制解調器巩检。
/sbin :“ system binaries”的簡寫,存放提供系統(tǒng)級基礎功能的二進制文件,如 netstat、reboot 等示启。
/etc :“Et Cetera”的簡寫,存放系統(tǒng)腳本及配置文件,如 passwd兢哭、hosts 等。在 iOS中,/etc 是一個符號鏈接,實際指向 /private/etc夫嗓。
/lib:存放系統(tǒng)庫文件迟螺、內核模塊及設備驅動等。iOS 中此目錄為空舍咖。
/mnt:“mount”的簡寫,存放臨時的文件系統(tǒng)掛載點矩父。iOS 中此目錄為空。
/tmp:臨時目錄排霉。在 iOS 中,/tmp 是一個符號鏈接,實際指向 /private/var/tmp窍株。
/usr:包含了大多數(shù)用戶工具和程序。/usr/bin包含那些/bin和/sbin中未出現(xiàn)的基礎功能,如 nm郑诺、killall 等;/usr/include 包含所有的標準C 頭文件;
/usr/lib 存放系統(tǒng)庫文件夹姥。
/var :“ variable”的簡寫,存放一些經常更改的文件,比如日志、用戶數(shù)據辙诞、臨時文件等辙售。
/var/mobile和 /var/root 分別存放了 mobile 用戶和 root 用戶的文件,是重點關注的目錄。
3.3 iOS 的獨有目錄
/Applications:存放所有的系統(tǒng)App和來自于Cydia的App,不包括 StoreApp飞涂。
/Developer:如果一臺設備連接Xcode后被指定為調試要的工具和數(shù)據,
/Library:存放一些提供系統(tǒng)支持的數(shù)據,其中/Library/MobileSubstrate 下存放了所有基于 CydiaSubstrate(原名 MobileSubstrate)的插件旦部。
/System/Library :iOS 文件系統(tǒng)中最重要的目錄之一,存放大量系統(tǒng)組件,其目錄結構
/System/Library/Frameworks和/System/Library/PrivateFrameworks:存放iOS中的各種 framework,其中出現(xiàn)在 SDK 文檔里的只是冰山一角,還有數(shù)不清的未公開功能等待我們去挖 。
/System/Library/CoreServices里的SpringBoard.app:iOS 面管理器(類似于Windows里的explorer),是用戶與系統(tǒng)交流的最重要中介较店。
/User:用戶目錄,實際指向/var/mobile,這個目錄里存放大量用戶數(shù)據,比如:
~/var/mobile/Media/DCIM下存放照片;
~/var/mobile/Media/Recordings下存放錄音文件;
~/var/mobile/Library/SMS下存放短信數(shù)據 ;
~/var/mobile/Library/Mail下存放郵件數(shù)據士八。
4. iOS 二進制文件類型
在iOS逆向工程初學階段,我們的目標主要是Application、Dynamic Library(以下 dylib)和 Daemon 這三類二進制文件梁呈。
4.1 Application相關概念
bundle:是一個按某種標準結構來組織的目錄,其中包含了二進制文件及運行所需的資源婚度。正向開發(fā)中常見的 App 和 framework都是以bundle的形式存在的;在越獄iOS中常見的PreferenceBundle,可以看成是一種依附于Settings 的 App官卡。Settings 的 App,結構與 App 類似,本質也是 bundle蝗茁。
Framework 也是 bundle,但 framework 的 bundle 中存放的是一個 dylib,而不是可執(zhí)行文件。相對來說,framework的地位比 App 更高,因為一個 App 的絕大多數(shù)功能都是通過調用 framework 提供的接口來實現(xiàn)的寻咒。將某個 bundle 確立為逆向目標后,絕大多數(shù)逆向線索都可以在 bundle 內找到,這大大 低了逆向工程的復雜度哮翘。
App 目錄 :
Info.plist 文件記錄了App的基本信息,如bundle identifier、可執(zhí)行文件名毛秘、圖標文件名等饭寺。
可以通過 Xcode 自帶的命 行工具 plutil 查看bundle identifier的值,如下:
plutil -p /Users/snakeninny/Code/iOSSystemBinaries/8.1_iPhone5/SiriViewService.app/Info.plist | grep CFBundleIdentifier
安裝包格式與權限:
Cydia App 的安裝包格式一般是 deb,StoreApp 的安裝包格式一般是 ipa阻课。其中 deb 是來自 Debian 的安裝包格式,由 Cydia 作者 saurik 移 到 iOS 中,它的 主用戶和 主組一般是 root 和 admin,能夠以 root權限運行;而 ipa 是蘋果為 iOS 推出的專用App安裝包格式, 主用戶和 主組都是 mobile,只能以 mobile權限運行。
Dynamic Library:
1艰匙,在 Xcode 工程里導入的各種 framework,鏈接的各種 lib,其實本質都是 dylib限煞。
2,Cydia 里的各種 tweak 無一不是以 dylib 的形式工作的,正是這些 tweak 的存在讓我們能夠隨意定制自己的 iOS员凝。
3晰骑,在iOS中,lib分為static和dynamic兩種,其中static lib在編譯階段成為App可執(zhí)行文件的一部分,會增加可執(zhí)行文件的大小。
4绊序,dylib 則相對“智能”一些,它不會改變可執(zhí)行文件的大小,只有當 App 需要用到這個 dylib 時,iOS 才會把它加載進內存,成為 App 進程的一部分。
5秽荞,dylib 的權限是由它寄生的那個 App 決定的,同一個 dylib 寄生在系統(tǒng) App 和 StoreApp 里時的權限是不同的骤公。
5. 手動hook一個自己編寫的APP
5.1 使用Xcode創(chuàng)建自己的一個用于測試的App。
目的:攔截一個自己寫的方法扬跋,然后進行重寫阶捆。APP大家可以自己創(chuàng)建,我這邊已經創(chuàng)建好了钦听。
Bundle identifier:ZZ.ForDemo
APP Name : ForDemo
攔截一個按鈕的點擊方法:
- (void)buttonClick {
UIAlertController *alerView = [UIAlertController alertControllerWithTitle:@"提示"
message:@"未被HOOK"
preferredStyle:UIAlertControllerStyleAlert];
UIAlertAction *cancelAction =[UIAlertAction actionWithTitle:@"取消"
style:UIAlertActionStyleCancel
handler:nil];
[alerView addAction:cancelAction];
[self presentViewController:alerView animated:YES completion:nil];
}
5.2 下載和配置theos
大家可自己手動下載官方theos然后放入ldid洒试、CydiaSubstrate、dpkg-deb等等到目錄中朴上,或者使用腳本下載網上一位大神已經封裝好的theos垒棋。腳本下載地址:https://github.com/DaSens/Theos-Script
5.3 創(chuàng)建theos項目
1,首先我們配置和準備好theos后痪宰,我們進入終端叼架,然后cd進入你要放工程的文件夾目錄比如桌面上我新建好的一個文件夾iosDev,然后執(zhí)行啟動 NIC(New Instance Creator),如下:
然后我們進入工程目錄會發(fā)現(xiàn)生成四個文件:
這四個文件的配置如下:
Makefile
THEOS_DEVICE_IP = 10.10.243.124
ARCHS = armv7 arm64
TARGET = iphone:latest:8.0
include $(THEOS)/makefiles/common.mk
TWEAK_NAME = ForDemo
ForDemo_FILES = Tweak.xm
ForDemo_FRAMEWORKS = UIKit
include $(THEOS_MAKE_PATH)/tweak.mk
after-install::
install.exec "killall -9 SpringBoard"
Tweak.xm
%hook ViewController
- (void)buttonClick
{
UIAlertController *alerView = [UIAlertController alertControllerWithTitle:@"提示"
message:@"已經被HOOK了"
preferredStyle:UIAlertControllerStyleAlert];
UIAlertAction *cancelAction =[UIAlertAction actionWithTitle:@"取消"
style:UIAlertActionStyleCancel
handler:nil];
[alerView addAction:cancelAction];
[self presentViewController:alerView animated:YES completion:nil];
}
%end
其它兩個文件 control 和 ForDemo.plist 可以保持原樣
5.3 打包并安裝dylib到設備中
OK衣撬,走到這一步乖订,必須保證iOS設備一定要已經安裝了Open ssh。
按照所查到資料具练,除了Open ssh的安裝外乍构,還需滿足一下兩個條件:
- 設備和電腦保持在同一局域網下。
- 保證你的theos配置文件沒有問題扛点。
然后可以把自己寫的APP運行到設備上哥遮,運行之后點擊測試下未HOOK之前的按鈕點擊方法:
接下來我們利用終端cd進入你創(chuàng)建的tweak項目目錄,然后執(zhí)行make package install占键,然后輸入兩次ssh的連接密碼(ssh 默認密碼alpine)昔善,然后設備就會重啟SpringBoard,然后我們再次打開HOOK的APP發(fā)現(xiàn)按鈕的點擊方法已經被替換了。
如果提示_Prefix/NullabilityCompat.h 說明你是自己clone 的官方的theos畔乙,里面沒放入這些頭文件君仆,可手動clone header頭文件到目錄中:
sudo git clone https://github.com/theos/headers /opt/theos/include
這個時候輸入成功后這個時候SpringBoard已經開始重啟了,這時候再點擊hook按鈕應該就能hook成功了。
奈何,手中的5s是10.2.1的系統(tǒng)暫時無法越獄返咱,后續(xù)親測hook成功與否钥庇,盡請期待~