introspy的官網地址以及deb包地址:https://isecpartners.github.io/Introspy-iOS/
在官網https://github.com/iSECPartners/Introspy-iOS/releases中 該工具僅僅放出支持IOS7的版本,IOS8,IOS9均未放出deb安裝包。
所以,我下載了源碼,試圖在IOS9上編譯一份,結果如下
查閱原因發現 是我安裝的theos安裝版本太高了 把theos安裝低版本 可安裝
結果又發現如下
這就沒有辦法了,這個工具的源碼不支持IOS9。
這里會感覺到很奇怪,這個工具關theos什么事。
關聯如下
1:這個工具本身的作用 就是針對一些私有API進行監控,并將日志輸出到xcode自己的log中。
2:這個工具采取的監控的原理 就是使用theos編寫tweak API,從外部進行插入dylib的原理,只不過它已經將一個已有的tweak拆分成很多不同種類監控的文件。如下圖
比如其中的NSData的tweak是這樣的
完全就是theos中 tweak hook的語言組織 而且hook的即是IOS私有類NSData中的關鍵函數 與之前對theos中的調研一致
而之外的一些類文件 則是為不同類型的hook提供工具類,如上圖的CallTracer類
此處的Tweak起著一個總的調度的作用,makefile打包安裝成最終的deb形式。
如下圖tweak調用各種不同類型的hook
在IOS7中,追蹤的信息會被保存成一個數據庫introspy-com.XX.XX.db 這個數據庫存放在 ./private/var/mobile/Applications/E5DF194C-0B29-4211-B243-68DBA847DCDE/Library/introspy-com.XX.XX.db里面
Introspy-Analyzer直接將這個數據庫直觀的解析出來,當然在xcode的log上也會有顯示
在總的調度tweak中 有這個路徑的數據庫的初始化和寫入
此為我們記錄分析提供了很好的工具和思路
雖然現在未能使用這個工具 但是這個工具給我們研發工作一個很好的范例,它本身已經解決了如下問題
1:很多私有API的檢測問題,證實了通過外部插入dylib是目前最好的hook方式
2:它已經解決了通過一個插件就能自動開關所有應用的hook的問題 這是在IOS6上的使用狀況(官網的圖)
因為現在無法使用,所以僅僅看這個圖的話,這個工具已然滿足多樣本實時監控
這種即是IOS上 setting bundle的一種機制 為插件單獨添加preferences 還有一種解決方案:FLEX嵌入:https://yohunl.com/ios-yue-yu-de-tweakkai-fa/
在源碼中找到了 Preferences中plist文件 這個在theos創建工程的時候選擇創建application就能生成settings。
tweak中調度的代碼中,對開啟了監控的app的bundle ID進行了過濾:即開啟了的,為其創建DB,沒有開啟的便不為其創建DB。
但為何能實現在不用重新加載tweak的前提下就能實現多APP的監控??
這里我找到一種解決多樣本控制的辦法 在原創建的工程文件里 有一個plist存放的是有效bundle ID。
發現其中的bundle ID是可以添加很多的,只要這個app滿足 則對這個app生效
測試結果發現只要原始的tweak插件生成過程中,有這個bundle ID的,則hook一律有效,不必重新生成插件。
所以,我猜想,introspy是將這個bundle ID的選擇權利通過setting bundle的添加交給了用戶,讓用戶手動輸入是否支持監控,從而在手機插件的內部操作了這個plist文件,來實現多樣本監控。
在introspy的源碼處 tweak總調度插件處找到了證明我猜想的代碼
theos tweak實現多樣本自動支持的問題得到解決
這個圖說明了tweak的bundle ID的生效過程,也是introspy能動態監控的原理。
但是基于本項目動態養殖涉及到的問題,需要找到tweak存放bundle ID的plist文件的位置,由于越獄系統僅僅開放部分文件權限,所以目前并不知道這個plist文件存放的位置,如能找到這個
則有如下的流程
樣本靜態分析得出app的bundle?ID—>找到tweak在iphone中存放plist的文件,并將bundle ID添加到其中--->tweak對這個app生效—>app安裝,監控目的達到
發現可以找到這個文件
這個文件的路徑是: //Library/MobileSubstrate/DynamicLibraries
由此 只需編寫shell命令來寫入這個文件即可
3:這個工具 為輸出監控日志提供了很好的思路 可以使用syslogd這個插件 也可以使用xcode自動log工具 如下圖
還可以使用IOS的DB數據庫操作,每一個app單獨為其創建一個DB。introspy則是使用的這樣方式的輸出。
4:同時這個工具 為我們寫自動化工具監測 提供了良好的模板框架的借鑒。
綜上所述 IOS下的hook有兩種方式:
1:采用外部加載插入dylib的方式,這種以theos tweak工具為代表,并進一步演化出了introspy的監控輸出日志的工具。
2:采用內部method swizzling來hook,代表工具即是cycript。這種工具需要采用句柄來一步步獲取目標函數所在對象的指針,達到hook的目的。
第一種方式與我們預期的相匹配。