iOS逆向工程初探

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),如下:

啟動 NIC

然后我們進入工程目錄會發(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之前的按鈕點擊方法:

hook test

接下來我們利用終端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成功與否钥庇,盡請期待~

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市咖摹,隨后出現(xiàn)的幾起案子评姨,更是在濱河造成了極大的恐慌,老刑警劉巖萤晴,帶你破解...
    沈念sama閱讀 217,657評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異嗦枢,居然都是意外死亡,警方通過查閱死者的電腦和手機文虏,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評論 3 394
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來殖演,“玉大人氧秘,你說我怎么就攤上這事丸相。” “怎么了?”我有些...
    開封第一講書人閱讀 164,057評論 0 354
  • 文/不壞的土叔 我叫張陵瘦真,是天一觀的道長。 經常有香客問我穿肄,道長咸产,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,509評論 1 293
  • 正文 為了忘掉前任社牲,我火速辦了婚禮让禀,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己捌木,他們只是感情好,可當我...
    茶點故事閱讀 67,562評論 6 392
  • 文/花漫 我一把揭開白布努潘。 她就那樣靜靜地躺著卖子,像睡著了一般。 火紅的嫁衣襯著肌膚如雪玄柠。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,443評論 1 302
  • 那天羽利,我揣著相機與錄音刊懈,去河邊找鬼这弧。 笑死虚汛,一個胖子當著我的面吹牛,可吹牛的內容都是我干的卷哩。 我是一名探鬼主播,決...
    沈念sama閱讀 40,251評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼冷溶,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了逞频?” 一聲冷哼從身側響起栋齿,我...
    開封第一講書人閱讀 39,129評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎褒颈,沒想到半個月后柒巫,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體谷丸,經...
    沈念sama閱讀 45,561評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,779評論 3 335
  • 正文 我和宋清朗相戀三年泉唁,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片亭畜。...
    茶點故事閱讀 39,902評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖拴鸵,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情劲藐,我是刑警寧澤,帶...
    沈念sama閱讀 35,621評論 5 345
  • 正文 年R本政府宣布兄渺,位于F島的核電站,受9級特大地震影響挂谍,放射性物質發(fā)生泄漏。R本人自食惡果不足惜凳兵,卻給世界環(huán)境...
    茶點故事閱讀 41,220評論 3 328
  • 文/蒙蒙 一企软、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧仗哨,春花似錦、人聲如沸厌漂。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,838評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽囤踩。三九已至旨椒,卻和暖如春堵漱,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背勤庐。 一陣腳步聲響...
    開封第一講書人閱讀 32,971評論 1 269
  • 我被黑心中介騙來泰國打工好港, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留米罚,地道東北人钧汹。 一個月前我還...
    沈念sama閱讀 48,025評論 2 370
  • 正文 我出身青樓录择,卻偏偏與公主長得像,于是被迫代替她去往敵國和親糊肠。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,843評論 2 354

推薦閱讀更多精彩內容