iOS逆向工程-OSX工具集之Theos

一、介紹及安裝

1.簡介

Theos是一個越獄開發(fā)包脓豪。與其它工具相比巷帝,它的特點(diǎn)就是簡單:下載安裝簡單、Logos語法簡單扫夜、編譯發(fā)布簡單楞泼。

2.安裝

2.1 安裝Xcode與Command Line Tools

需要注意的是,如果Mac上有安裝多個版本的Xcode笤闯,則需要使用xcode-select命令指定一個活動Xcode堕阔,即Theos默認(rèn)使用的Xcode。假設(shè)安裝了2個Xcode颗味,并將它們分別命名為Xcode1.app印蔬、Xcode2.app,若要指定Xcode2.app為活動Xcode脱衙,則運(yùn)行如下命令即可:

sudo xcode-select - s /Applications/Xcode2.app/Contents/Developer

2.2 安裝dpkg和ldid

ldid是一款二進(jìn)制授權(quán)管理軟件侥猬,可以對越獄應(yīng)用進(jìn)行SHA1運(yùn)算生成授權(quán),讓軟件包可以在iPhone上執(zhí)行捐韩。我們使用Homebrew來安裝它們退唠。Homebrew是一款Mac上基于Ruby的包管理器。使用如下命令:

brew install dpkg ldid

如果沒有安裝Homebrew荤胁,那么需要先安裝Homebrew瞧预,使用如下命令即可(可能需要VPN環(huán)境):

/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

2.3 安裝Theos

將Theos安裝在/opt/theos,使用如下命令:

sudo Git clone --recursive https://github.com/theos/theos.git /opt/theos

然后把/opt/theos的權(quán)限改成你自己:

sudo chown $(id -u):$(id -g) /opt/theos

最后把theos的執(zhí)行路徑加入到環(huán)境變量中仅政,在~/.bash_profile中加上:

export THEOS="/opt/theos"

2.4 測試

在任意目錄下(不能是/opt/theos下垢油,否則將創(chuàng)建不成功),輸入如下命令創(chuàng)建Theos項(xiàng)目:

/opt/theos/bin/nic.pl NIC 2.0 - New Instance Creator

可以看到這里共有12種模板可供選擇圆丹,這里我們選擇tweak -> 輸入Package Name(deb包的名字滩愁,類似于bundle identifier)-> tweak的名字 -> 輸入”MobileSubstrate Bundel filter“,也就是tweak作用對象的bundle identifier辫封,如:com.apple.springboard -> Done完成硝枉。

二廉丽、工程文件說明

在上一步安裝完成Theos并測試通過后,在指定目錄會看到一個創(chuàng)建好的新目錄妻味,里面會有四個文件正压。分別是:Makefile、control责球、NIC.plist焦履、Tweak.xm,正面將一一對其進(jìn)行說明雏逾。

1.Makefile

Makefile文件指定工程用到的文件裁良、框架、庫等信息校套,將整個過程自動化价脾。其內(nèi)容說明如下(NIC表示項(xiàng)目名稱)

include $(THEOS)/makefiles/common.mk?

#固定寫法,不要更改笛匙。TWEAK_NAME = NIC #Tweak名稱跟control文件中的”Name“字段對應(yīng)侨把,一般不要更改(但我注意到,在創(chuàng)建Tweak的時候并沒有提示要輸入Project Name就默認(rèn)生成了NIC)妹孙。

NIC_FILES = Tweak.xm?

#Tweak包含的源文件(不包括頭文件)秋柄,多個文件間以空格分隔,可以按需要更改蠢正。

export ARCHS = armv7 arm64?

#默認(rèn)文件未提供骇笔。支持的處理器架構(gòu),多個以空格分隔嚣崭。需要注意的是笨触,采用arm64架構(gòu)的App不兼容armv7/armv7s架構(gòu),必須適配arm64架構(gòu)的dylib雹舀。在絕大多數(shù)情況下芦劣,這里固定填寫”arm7 arm64“就可以了。

TARGET = iphone:Base SDK:Deployment Target?

#指定SDK版本说榆。如:iphone:8.1:8.0表示指定彩8.1版本的SDK虚吟,且發(fā)布對象為iOS8.0及以上版本。也可以把”Base SDK“設(shè)置為”latest“签财,指定以Xcode附帶的最新版本SDK編譯串慰。

export NIC_FRAMEWORKS = framework name?

#默認(rèn)文件未提供。導(dǎo)入framework唱蒸。如:NIC_FRAMEWORKS = UIKit CoreAudio

export NIC_PRIVATE_FRAMEWORKS = private framework name

#默認(rèn)文件未提供邦鲫。導(dǎo)入private framework。如:NIC_FRAMEWORKS = AppSupport ChatKit油宜。需要注意的是:在導(dǎo)入之前一定要確定導(dǎo)入的private framework確實(shí)存在掂碱,因?yàn)閜rivate framework是AppStore開發(fā)所不允許使用的怜姿,它的內(nèi)容在每個iOS版本之間可能發(fā)生變化慎冤。如:BaseBoard框架在iOS8以上存在疼燥,在iOS7就沒有。這種情況通過弱鏈接或dlopen()蚁堤、dlsym()和dlclose()系列函數(shù)動態(tài)調(diào)用private framework來解決醉者。

export NIC_LDFLAGS = -lx?

#默認(rèn)文件未提供。鏈接Mach-O對象披诗。Theos采用GNU Linker來鏈接Mack-O對象撬即,包括.dylib、.a和.o呈队。-lx代表鏈接libx.a或libx.dylib剥槐,即給”x“加上”lib“的前綴,以及“.a”或“.dylib”的后綴宪摧;如果x是“y.o”的形式粒竖,則直接鏈接y.o,不加任何前綴或后綴几于。如要鏈接libsqlite3.0.dylib蕊苗、libz.dylib和dylib1.o,這樣寫就行:NIC_LDFLAGS = -lz -lsqlite3.0 -dylib1.o

include $(THEOS_MAKE_PATH)/tweak.mk?

#根據(jù)不同的Theos工程類型沿彭,指定不同的.mk文件朽砰。可以按需更改喉刘。

after-install::install.exec "killall -9 SpringBoard"?

#表示在Tweak安裝之后殺掉SpringBoard進(jìn)程瞧柔,好讓CydiaSubstrate在進(jìn)程啟動時加載對應(yīng)的dylib。

2.Tweak.xm

用Theos創(chuàng)建tweak工程睦裳,默認(rèn)生成的源文件是Tweak.xm非剃。“xm”中的“x”代表這個文件支持Logos語法推沸,如果后綴名是單獨(dú)一個“x”备绽,說明源文件支持Logos和C語法;如果后綴名是“xm”鬓催,說明源文件支持Logos和C/C++語法肺素。(Logos語法在這里不贅述)

3.control

control文件記錄了deb包管理系統(tǒng)所需的基本信息,會被打包進(jìn)deb包里宇驾”睹遥基本字段說明:

Package:用于描述這個deb包的名字,采用的命名方式同bundle identifier類似课舍,均為反向DNS格式塌西∷妫可以按需更改。Name:用于描述這個工程的名字捡需,可以按需更改办桨。

Depends:用于描述這個deb包的“依賴”≌净裕“依賴”指的是這個程序運(yùn)行的基本條件呢撞,可以填寫固件版本或其它程序,如果當(dāng)前iOS不滿足“依賴”中定義的條件饰剥,則此tweak無法正常運(yùn)行殊霞。如:Depends:mobilesubstrate,firmware(>=8.0)表示當(dāng)前iOS版本必須在8.0以上,且必須安裝CydiaSubstrate才能正常運(yùn)行這個tweak汰蓉,可以按需更改绷蹲。

Version:用于描述這個deb包的版本號,可以按需更改顾孽。

Architecture:用于描述deb包安裝的目標(biāo)設(shè)備架構(gòu)祝钢,不要更改。

Description:是deb包的簡介岩齿,可以更改太颤。

Maintainter:用于描述deb包的維護(hù)人,可以按需更改盹沈。

Author:用于描述tweak的作者龄章,可以按需更改。

Section:用于描述deb包所屬的程序類別乞封,不要更改做裙。

4.NIC.plist

該plist文件的作用和App中的Info.plist類似,它記錄了一些配置信息肃晚,描述了tweak的作用范圍锚贱。通過Xcode打開該文件,我們可以看到它的最外層是一個Dictionary关串,只有一個名為“Filter”的鍵拧廊。Filter下是一系列Array,可以分為三類:

Bundle:指定若干bundle為tweak的作用對象晋修。如:com.apple.springboard

Classes:指定若干class為tweak的作用對象吧碾。如:NSString

Executables:指定若干可執(zhí)行文件為tweak的作用對象。如:callservicesd

這三類Array可以混合使用墓卦,但當(dāng)Filter下有不同類的Array時倦春,需要添加一個“Mode: Any”鍵值對。當(dāng)Filter下的Array只有一類時,不需要添加睁本。

三尿庐、編譯、打包呢堰、安裝

1.編譯

Theos采用“make”命令來編譯Theos工程抄瑟。在Theos目錄下運(yùn)行make命令。(需要注意:xm文件語法不要有錯誤暮胧,支持c,oc語法)執(zhí)行“make”命令后會在工程目錄下生成/obj/debug文件(沒錯誤的話)锐借,但里面都是空的问麸。(這里與其它資料上不一樣)這里先不用管這些往衷,繼續(xù)執(zhí)行后面的命令。

2.打包

使用“make package”命令來打包严卖,這里其它是先執(zhí)行make命令再執(zhí)行dpkg-deb命令席舍。執(zhí)行完成后會在工程目錄下生成/packages/xxx.deb文件。該文件就是可以直接安裝在iOS上的安裝包哮笆。

3.安裝

3.1 圖形界面安裝

即先將打包好的deb文件通過iFunBox導(dǎo)入手機(jī)目錄来颤,然后在iPhone手機(jī)上通過iFile工具安裝。(安裝成功后可能需要重啟手機(jī)稠肘,視tweak功能而定福铅,未親測)。

3.2 命令行安裝

3.2.1 安裝OpenSSH

在越獄手機(jī)上OpenSSH工具项阴,通過命令行安裝deb需要用到其中的scp功能滑黔。

3.2.2 添加配置行

在Makefile的最上一行(也就是第一行,也必須是第一行环揽,不然會出錯)加上手機(jī)的IP地址略荡,如:

export THEOS_DEVICE_IP = 10.200.201.22 (手機(jī)本地IP)

3.2.3 執(zhí)行安裝命令

在確保Mac與iPhone在同一局域網(wǎng)的前提下,執(zhí)行以下命令:

make package install

在整個安裝過程中會輸入兩次手機(jī)的root密碼歉胶,如果想在安裝過程中實(shí)現(xiàn)一次性安裝汛兜,即不需要輸入密碼的話,需要設(shè)置iOS的authorized_keys通今。步驟如下:

3.2.3.1 刪除Host數(shù)據(jù)?

刪除Mac上”/Users/hjs<本機(jī)用戶名>/.ssh/known_hosts“文件中iOSIP對應(yīng)的條目粥谬。如果你的iPhone's IP是10.112.12.30,那么在該文件對應(yīng)的數(shù)據(jù)則是:10.112.12.30=xxxxx<很長一串密鑰>辫塌,將這一段數(shù)據(jù)刪掉漏策。

3.2.3.2 生成authorized_keys

在Mac終端執(zhí)行如下命令:

ssh-keygen -t rsa <遇到提示直接回車>

...

cp /Users/hjs<本機(jī)用戶名>/.ssh/id_rsa.pub ~/authorized_keys

3.2.3.3 配置iOS

在Mac終端通過ssh命令以root用戶連接上iPhone(如:ssh root@10.112.12.30),連接上之后執(zhí)行如下命令:

ssh-keygen <遇到提示直接回車>

...

logout <退出ssh>

scp ~/authorized_keys root@10.112.12.30<手機(jī)IP>:/var/root/.ssh

3.2.3.4 清理

在上一步驟中配置好后璃氢,再次執(zhí)行make package install之前需要清理之前生成的文件哟玷,否則將安裝不成功。執(zhí)行以下命令達(dá)到清理的目的:

make clean

rm -rf ./obj ./packages

再次執(zhí)行安裝命令將不會再要求輸入密碼,達(dá)到一鍵安裝的目的巢寡。

4.可能出現(xiàn)的錯誤

clang: warning: libstdc++ is deprecated; move to libc++ with a minimum deployment target of iOS 7

檢查.xm文件中是否有語法錯誤喉脖,注釋位置是否正確,也有可能是某個框架未導(dǎo)入抑月。

dpkg-deb: error: obsolete compression type 'lzma'; use xz instead

修改opt/theos/makefiles/package/deb.mk中第六行:THEOSPLATFORM_DPKG_DEB_COMPRESSION ?= lzma 將最后的lzma 改成 xz树叽,這樣改固然暫時不會報(bào)錯了,但后面可能還是會出錯谦絮,所以這里建議直接將lzma 改成 gzip题诵。

Error: /Applications/Xcode.app/Contents/Developer/usr/bin/make install requires that you set THEOS_DEVICE_IP in your environment.

出現(xiàn)這個錯誤說明沒有把3.2中的 export THEOS_DEVICE_IP = 10.200.201.22 (手機(jī)本地IP)寫在第一行所致。

dpkg-deb (subprocess): unable to execute decompressing archive member (xz): No such file or directorydpkg-deb (subprocess): subprocess decompressing archive member returned error exit status 2dpkg-deb: error: subprocessreturned error exit status 2

dpkg: error processing archive /tmp/_theos_install.deb (--install):

subprocess dpkg-deb --fsys-tarfile returned error exit status 2

Errors were encountered while processing:

/tmp/_theos_install.deb

make: *** [internal-install] Error 1

如果在出現(xiàn)上面第2個錯誤時是將lzma->xz的話层皱,后面可能會出現(xiàn)此錯誤性锭,解決方法是將lzma->gzip即可。

/* 本文參考《iOS應(yīng)用逆向工程》一書所進(jìn)行的總結(jié)叫胖,所有步驟也是經(jīng)過親自驗(yàn)證草冈,可能與書中有微小的出入 */

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市瓮增,隨后出現(xiàn)的幾起案子怎棱,更是在濱河造成了極大的恐慌,老刑警劉巖绷跑,帶你破解...
    沈念sama閱讀 219,366評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件拳恋,死亡現(xiàn)場離奇詭異,居然都是意外死亡砸捏,警方通過查閱死者的電腦和手機(jī)谬运,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,521評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來带膜,“玉大人吩谦,你說我怎么就攤上這事∠ヅ海” “怎么了式廷?”我有些...
    開封第一講書人閱讀 165,689評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長芭挽。 經(jīng)常有香客問我滑废,道長,這世上最難降的妖魔是什么袜爪? 我笑而不...
    開封第一講書人閱讀 58,925評論 1 295
  • 正文 為了忘掉前任蠕趁,我火速辦了婚禮,結(jié)果婚禮上辛馆,老公的妹妹穿的比我還像新娘俺陋。我一直安慰自己豁延,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,942評論 6 392
  • 文/花漫 我一把揭開白布腊状。 她就那樣靜靜地躺著诱咏,像睡著了一般。 火紅的嫁衣襯著肌膚如雪缴挖。 梳的紋絲不亂的頭發(fā)上袋狞,一...
    開封第一講書人閱讀 51,727評論 1 305
  • 那天,我揣著相機(jī)與錄音映屋,去河邊找鬼苟鸯。 笑死,一個胖子當(dāng)著我的面吹牛棚点,可吹牛的內(nèi)容都是我干的早处。 我是一名探鬼主播,決...
    沈念sama閱讀 40,447評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼乙濒,長吁一口氣:“原來是場噩夢啊……” “哼陕赃!你這毒婦竟也來了卵蛉?” 一聲冷哼從身側(cè)響起颁股,我...
    開封第一講書人閱讀 39,349評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎傻丝,沒想到半個月后甘有,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,820評論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡葡缰,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,990評論 3 337
  • 正文 我和宋清朗相戀三年亏掀,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片泛释。...
    茶點(diǎn)故事閱讀 40,127評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡滤愕,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出怜校,到底是詐尸還是另有隱情间影,我是刑警寧澤,帶...
    沈念sama閱讀 35,812評論 5 346
  • 正文 年R本政府宣布茄茁,位于F島的核電站魂贬,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏裙顽。R本人自食惡果不足惜付燥,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,471評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望愈犹。 院中可真熱鬧键科,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,017評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至牙言,卻和暖如春酸钦,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背咱枉。 一陣腳步聲響...
    開封第一講書人閱讀 33,142評論 1 272
  • 我被黑心中介騙來泰國打工卑硫, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 48,388評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像猖吴,于是被迫代替她去往敵國和親诉探。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,066評論 2 355

推薦閱讀更多精彩內(nèi)容