iOS逆向工程之Theos

如果你對(duì)iOS逆向工程有所了解,那么你對(duì)Tweak并不陌生。那么由Tweak我們又會(huì)引出Theos, 那么什么是Theos呢,簡(jiǎn)單一句話,Theos是一個(gè)越獄開(kāi)發(fā)工具包,Theos是越獄開(kāi)發(fā)工具的首先,因?yàn)槠渥畲蟮奶攸c(diǎn)就是簡(jiǎn)單。大道至簡(jiǎn),Theos的下載安裝、編譯發(fā)布都比較簡(jiǎn)單,越獄開(kāi)發(fā)中另一個(gè)常用的工具是iOSOpenDev,因?yàn)楸酒闹黝}是Theos,所以對(duì)iOSOpenDev不做過(guò)多贅述。本篇博客的主題是Thoes的安裝及其使用。
一、Theos的配置與安裝
Theos的配置與安裝算是比較簡(jiǎn)單的,按照官方給的步驟來(lái)操作,問(wèn)題不大。Theos的官方文檔地址“官方Wiki”,其中給出了如何安裝和配置Theos, 本部分內(nèi)容也是按照官方的Wiki來(lái)提供的,當(dāng)然進(jìn)行該部分操作時(shí),要保證你本地已經(jīng)安裝了Homebrew, 可以使用brew命令來(lái)安裝一些依賴包。brew其實(shí)類似于Linux中的yum或者apt-get,就是一個(gè)包管理工具。如果你本地沒(méi)有安裝brew,那么請(qǐng)求自行Google,從而完成對(duì)brew的安裝。
1.安裝dpkg

sudo brew install dpkg

dpkg是Theos依賴的工具之一,dpkg是Debian Packager的縮寫(xiě)。我們可以使用dpkg來(lái)制作deb,Theos開(kāi)發(fā)的插件都將會(huì)以deb的格式進(jìn)行發(fā)布的。所以我在安裝Theos之前要安裝dpkg, 當(dāng)然此處我們使用強(qiáng)大的brew來(lái)完成dpkg的安裝。安裝的具體過(guò)程如下所示:

545446-20160730102206591-27788590.png

2.安裝ldid

sudo brew install ldid

在Theos開(kāi)發(fā)插件中,iOS文件的簽名是使用ldid工具來(lái)完成的,也就是說(shuō)ldid取代了Xcode自帶的Codesign。下方就是ldid的安裝過(guò)程。

Paste_Image.png

3.Theos安裝

git clone --recursive https://github.com/theos/theos.git

因?yàn)槲覀兊腡heos一般是安裝在/opt/目錄下的,所以先cd到/opt目錄下,然后從github上相關(guān)的地址clone下來(lái)即可,步驟如下(下方安裝過(guò)程挺長(zhǎng),請(qǐng)耐心等待):


Paste_Image.png

下載好Theos后,要修改一下文件的權(quán)限,如下命令

sudo chown (id?u):(id?u):(id -g) theos

至此,Theos安裝完畢,就可以開(kāi)啟你的Theos之旅了
二、使用Theos創(chuàng)建、編譯、安裝使用工具
上面我們搭建好Theos的環(huán)境后,接下來(lái)就開(kāi)始使用我們的Theos來(lái)做些事情了。接下來(lái)我們將要使用Theos來(lái)創(chuàng)建一個(gè)使用工具,并進(jìn)行編譯,編譯后安裝到我們的越獄手機(jī)上。接下來(lái)來(lái)看一下這一系列的步驟。
1.配置$THEOS

export THEOS=theos文件所在路徑

進(jìn)入到我們要?jiǎng)?chuàng)建實(shí)用工具的目錄中,使用export定義如下的環(huán)境變量,如下所示。下方命令比較簡(jiǎn)單,你可以這么理解,就是使用export定義了一個(gè)變量這個(gè)變量的名字是THEOS,該變量中存儲(chǔ)的值是/opt/theos。后邊這個(gè)路徑就是上述我們安裝theos的路徑了,如果你要使用該路徑的話,使用$THEOS代替即可。當(dāng)然該變量只在當(dāng)前終端中可用。如下所示。

Paste_Image.png

2.新建工程

$THEOS/bin/nic.pl

接下來(lái)我們就要使用theos來(lái)創(chuàng)建我們的工程了,創(chuàng)建工程也是比較簡(jiǎn)單的,就是調(diào)用我們theos目錄中bin下的nic.pl命令。具體執(zhí)行如下所示。在執(zhí)行nic.pl命令后,會(huì)讓你選擇新建工程的模板,目前theos中內(nèi)置的是12套模板,當(dāng)然你可以從網(wǎng)上下載其他的模板。當(dāng)然我們此處創(chuàng)建的是application_modern類型的工程,所以我們就選2即可,當(dāng)然,如果你想創(chuàng)建tweak,那么就選11即可,下方我們選擇的是第二個(gè)模板。

在選擇模板后,緊接著會(huì)讓你做一系列的操作,這一些列的操作和Xcode新建iOS工程的步驟類似。

(1)輸入你的工程的名字(Project Name,必選項(xiàng)),此處我們工程的名字是FirstTheosApplication。

(2)輸入包名(Package Name),包名的命名規(guī)則一般是你們公司域名的倒寫(xiě),然后后邊加上你的工程名字,此處我就隨便寫(xiě)了一個(gè),就是下方的com.ludashi.firsttheosapplication。

(3)輸入作者的名字(Author/Maintainer Name), 此處我們輸入的是Mr.LuDashi

(4)然后如數(shù)類名的前綴(Class name prefix), 此處我們輸入的是CE。

經(jīng)過(guò)上述配置后,我們的工程就創(chuàng)建好了。

Paste_Image.png

下方是我們創(chuàng)建后的工程文件目錄,當(dāng)然packages文件夾是我們編譯打包后才生成的文件,其中的deb就是我們的安裝文件。可以將該安裝包安裝到我們的越獄手機(jī)上。
Paste_Image.png

3.編譯打包前的準(zhǔn)備工作

export SDKVERSION=9.3
export THEOS_DEVICE_IP=ios_device_ip

接著我們要做一些編譯打包前的準(zhǔn)備工作,SDKVERSION是編譯工程時(shí)所使用的SDK,因?yàn)楸緳C(jī)Xcode中是9.3的SDK,所以我們知道的SDKVERSION是9.3。指定完編譯所需的SDK后,我們需要指定打包后的文件所安裝設(shè)備的IP地址,使用THEOS_DEVICE_IP來(lái)指定。下方的IP地址是一個(gè)越獄手機(jī)的IP地址。

在指定這個(gè)設(shè)備IP之前,你要保證你的越獄設(shè)備安裝了OpenSSH,并且可以在Mac的終端上進(jìn)行ssh登錄。

Paste_Image.png

4.進(jìn)行編譯

make

做好編譯前的準(zhǔn)備工作后,緊接著就是編譯我們剛才創(chuàng)建的工程了。首先進(jìn)入到我們的firsttheosapplication目錄中,執(zhí)行make命令進(jìn)行編譯。如下所示。

Paste_Image.png

5.進(jìn)行打包

make package

編譯完成后,我們要講項(xiàng)目進(jìn)行打包,這樣我們的越獄設(shè)備才能進(jìn)行安裝。下方是調(diào)用make package命令進(jìn)行項(xiàng)目的打包。打包后會(huì)生成后綴名為deb的安裝包。

Paste_Image.png

6.安裝
make install
將該安裝包,安裝到相應(yīng)的越獄設(shè)備。因?yàn)樯厦嫖覀円呀?jīng)配置了越獄設(shè)備的IP地址,并且保證該臺(tái)越獄設(shè)備可以通過(guò)ssh進(jìn)行連接,所以我們直接調(diào)用make install命令就可以進(jìn)行項(xiàng)目的安裝。在安裝過(guò)程中會(huì)讓你輸入ssh登錄設(shè)備的密碼,輸入后會(huì)顯示安裝成功的操作,如下所示。
Paste_Image.png

7.安裝后的效果
下方就是我們項(xiàng)目安裝后的效果。打開(kāi)Cydia,選擇已安裝Tab, 會(huì)看到我們剛才安裝的FirstTheosApplication(實(shí)用工具),我們可以點(diǎn)進(jìn)去進(jìn)行查看,其中的一些信息大部分是我們剛才配置的信息。到此我們一個(gè)完整的流程就走完了。
Paste_Image.png

三、Tweak創(chuàng)建、編譯、打包與安裝
接下來(lái)我們要?jiǎng)?chuàng)建Tweak類型的工程,步驟與上述過(guò)程大同小異。也是需要使用nic.pl來(lái)創(chuàng)建,使用make編譯,使用make package打包,使用make install安裝。接下來(lái)就來(lái)看一下這一過(guò)程。
1.最終效果
開(kāi)門(mén)見(jiàn)山,下方就是我們要實(shí)現(xiàn)的效果。接下來(lái)我們就要使用Theos來(lái)創(chuàng)建Tweak工程,下方就是我們Tweak工程要做的事情。就是當(dāng)你的iPhone鎖屏開(kāi)啟后,給你彈一個(gè)框,這個(gè)彈框就是我們Tweak工程Hook的代碼,下方就是我們最終實(shí)現(xiàn)的效果。
Paste_Image.png

2.Tweak工程創(chuàng)建
下方就是我們Tweak工程的創(chuàng)建,與上述工程的創(chuàng)建類似,不過(guò)我們?cè)诖诉x擇的是Tweak模板。如下所示,我們將該Tweak工程命名為L(zhǎng)ockScreenAlter,其他配置項(xiàng)使用默認(rèn)值即可。然后進(jìn)入到我們的LockScreenAlter工程目錄中,主要有下方四個(gè)文件。
Paste_Image.png

3.Makefile文件
該文件類似于配置文件,用來(lái)指定工程用到的文件、框架、庫(kù)、使用的SDK等等,將整個(gè)編譯、打包、安裝的過(guò)程進(jìn)行自動(dòng)化。下方就是我們Makefile中的內(nèi)容,下方紅框中是創(chuàng)建完工程后默認(rèn)的配置,上面紅框中是后來(lái)我們添加的配置。這些項(xiàng)指定了編譯、安裝時(shí)所需的參數(shù),使其自動(dòng)化。因?yàn)槲冶镜氐腦code中是iOS9.3的SDK,所以下方指定的SDKVESION是9.3。
Paste_Image.png

4.Tweak.xm文件的編寫(xiě)
(1)寫(xiě)hook代碼前的分析
分析這一步是至關(guān)重要的,因?yàn)檫@一步可以讓你明白你的代碼作用于何處。因?yàn)槲覀円阪i屏的頁(yè)面進(jìn)行彈框,所以我們要在相應(yīng)的鎖屏頁(yè)面添加hook。下方就是我們的分析過(guò)程。經(jīng)過(guò)瀏覽系統(tǒng)的頭文件,我們從下方路徑中找到了SBLockScreenManager.h這個(gè)文件,從文件名不難推測(cè)出該文件就是負(fù)責(zé)iPhone系統(tǒng)鎖屏的文件,于是乎我們對(duì)其進(jìn)行hook實(shí)現(xiàn)。
Paste_Image.png

下方是上述頭文件的內(nèi)容,從內(nèi)容我們更加堅(jiān)信SBLockScreenManager類就是用來(lái)管理系統(tǒng)鎖屏的,因?yàn)槠渲杏袀€(gè)字段是用來(lái)表示是否已經(jīng)鎖屏的isUILocked。該頭文件中還有一個(gè)類方法和一個(gè)對(duì)象方法。當(dāng)然這個(gè)類方法明眼一看就是用來(lái)獲取該類的單例的。而對(duì)象方法lockUIFromSource……應(yīng)該是用來(lái)鎖屏和解鎖的。于是乎想要在鎖屏中彈框就要在SBLockScreenManager類中的唯一的對(duì)象方法中進(jìn)行操作了。
Paste_Image.png

(2)hook代碼的實(shí)現(xiàn)
下方就是在Tweak.xm中的所有代碼。是Logos語(yǔ)法,使用起來(lái)是比較簡(jiǎn)單的。%hook與%end成對(duì)出現(xiàn),%hook后方跟的是我們要修改的類名,此處我們要對(duì)SBLockScreenManager進(jìn)行修改,類似于OC中的繼承操作。%orig,用來(lái)執(zhí)行修改函數(shù)的原始函數(shù),此處可以看做是OC語(yǔ)法中的super,類似于調(diào)用父類的方法。下方代碼就用到這些Logos語(yǔ)法就足以在鎖屏出進(jìn)行彈框了。
Paste_Image.png

常用Logos語(yǔ)法簡(jiǎn)介:

%hook 指定需要hook的類名,以%end結(jié)尾
%log 用來(lái)打印log的,將信息輸入到syslog中,如%log((NSString *)@"ZeluLi")
%orig 執(zhí)行被hook函數(shù)的原始代碼,類似于super.method功能
%group 該指令用于%hook的分組,%group后邊跟的是組名,%group也是必須以%end結(jié)尾,其中可以包含多個(gè)%hook
%init 該指令用來(lái)初始化某個(gè)%group,一個(gè)group只有被初始化后才可生效,init必須在hook中進(jìn)行執(zhí)行。
%ctor tweak的構(gòu)造器,用來(lái)初始化,如果不顯式定義,Theos就會(huì)自動(dòng)生成一個(gè)%ctor,并在其中調(diào)用%init(_ungrouped). 如:%ctor { %init(_ungrouped)}
%new 該指令用來(lái)給現(xiàn)有的class添加一個(gè)新的函數(shù)。與Runtime中的class_addMethod相同。
%c 該指令用來(lái)獲取一個(gè)類的名稱,類似于objc_getClass。

上述就先涉及這么多,更詳細(xì)的請(qǐng)參加:[http://iphonedevwiki.net/index.php/Logos](http://iphonedevwiki.net/index.php/Logos)

5. control文件
control文件中存儲(chǔ)的內(nèi)容記錄了deb包管理系統(tǒng)所需的基本信息,會(huì)被打包進(jìn)deb包里。下方就是control中內(nèi)容,其中存儲(chǔ)的就是一些包名、工程名、版本、作者等等,與打包安裝后在Cydia中看到的信息相同。

Paste_Image.png

6、進(jìn)行編譯、打包、安裝
編譯打包安裝的過(guò)程與上一部分類型,在此就只展示一下過(guò)程,不做過(guò)多贅述了。
(1)使用make命令進(jìn)行編譯
Paste_Image.png

(2)打包:make package
Paste_Image.png

(3)安裝到手機(jī): make install
Paste_Image.png

7.從Cydia中進(jìn)行查看
下方就是我們成功安裝后在Cydia中查看的截圖,安裝成功后,當(dāng)你鎖屏?xí)r就會(huì)彈出一個(gè)Alter。
Paste_Image.png

作者:青玉伏案 出處:http://www.cnblogs.com/ludashi/

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容