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

一、介紹及安裝

1.簡介

Theos是一個越獄開發(fā)包。與其它工具相比,它的特點就是簡單:下載安裝簡單、Logos語法簡單、編譯發(fā)布簡單。

2.安裝

2.1 安裝Xcode與Command Line Tools

需要注意的是,如果Mac上有安裝多個版本的Xcode,則需要使用xcode-select命令指定一個活動Xcode,即Theos默認使用的Xcode。假設安裝了2個Xcode,并將它們分別命名為Xcode1.app、Xcode2.app,若要指定Xcode2.app為活動Xcode,則運行如下命令即可:

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

2.2 安裝dpkg和ldid

ldid是一款二進制授權管理軟件,可以對越獄應用進行SHA1運算生成授權,讓軟件包可以在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的權限改成你自己:

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項目:

/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,正面將一一對其進行說明。

1.Makefile

Makefile文件指定工程用到的文件、框架、庫等信息,將整個過程自動化。其內容說明如下(NIC表示項目名稱)

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

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

NIC_FILES = Tweak.xm?

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

export ARCHS = armv7 arm64?

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

TARGET = iphone:Base SDK:Deployment Target?

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

export NIC_FRAMEWORKS = framework name?

#默認文件未提供。導入framework。如:NIC_FRAMEWORKS = UIKit CoreAudio

export NIC_PRIVATE_FRAMEWORKS = private framework name

#默認文件未提供。導入private framework。如:NIC_FRAMEWORKS = AppSupport ChatKit。需要注意的是:在導入之前一定要確定導入的private framework確實存在,因為private framework是AppStore開發(fā)所不允許使用的,它的內容在每個iOS版本之間可能發(fā)生變化。如:BaseBoard框架在iOS8以上存在,在iOS7就沒有。這種情況通過弱鏈接或dlopen()、dlsym()和dlclose()系列函數(shù)動態(tài)調用private framework來解決。

export NIC_LDFLAGS = -lx?

#默認文件未提供。鏈接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進程,好讓CydiaSubstrate在進程啟動時加載對應的dylib。

2.Tweak.xm

用Theos創(chuàng)建tweak工程,默認生成的源文件是Tweak.xm?!皒m”中的“x”代表這個文件支持Logos語法,如果后綴名是單獨一個“x”,說明源文件支持Logos和C語法;如果后綴名是“xm”,說明源文件支持Logos和C/C++語法。(Logos語法在這里不贅述)

3.control

control文件記錄了deb包管理系統(tǒng)所需的基本信息,會被打包進deb包里?;咀侄握f明:

Package:用于描述這個deb包的名字,采用的命名方式同bundle identifier類似,均為反向DNS格式??梢园葱韪?。Name:用于描述這個工程的名字,可以按需更改。

Depends:用于描述這個deb包的“依賴”?!耙蕾嚒敝傅氖沁@個程序運行的基本條件,可以填寫固件版本或其它程序,如果當前iOS不滿足“依賴”中定義的條件,則此tweak無法正常運行。如:Depends:mobilesubstrate,firmware(>=8.0)表示當前iOS版本必須在8.0以上,且必須安裝CydiaSubstrate才能正常運行這個tweak,可以按需更改。

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

Architecture:用于描述deb包安裝的目標設備架構,不要更改。

Description:是deb包的簡介,可以更改。

Maintainter:用于描述deb包的維護人,可以按需更改。

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可以混合使用,但當Filter下有不同類的Array時,需要添加一個“Mode: Any”鍵值對。當Filter下的Array只有一類時,不需要添加。

三、編譯、打包、安裝

1.編譯

Theos采用“make”命令來編譯Theos工程。在Theos目錄下運行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導入手機目錄,然后在iPhone手機上通過iFile工具安裝。(安裝成功后可能需要重啟手機,視tweak功能而定,未親測)。

3.2 命令行安裝

3.2.1 安裝OpenSSH

在越獄手機上OpenSSH工具,通過命令行安裝deb需要用到其中的scp功能。

3.2.2 添加配置行

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

export THEOS_DEVICE_IP = 10.200.201.22 (手機本地IP)

3.2.3 執(zhí)行安裝命令

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

make package install

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

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

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

3.2.3.2 生成authorized_keys

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

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

...

cp /Users/hjs<本機用戶名>/.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<手機IP>:/var/root/.ssh

3.2.3.4 清理

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

make clean

rm -rf ./obj ./packages

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

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

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

檢查.xm文件中是否有語法錯誤,注釋位置是否正確,也有可能是某個框架未導入。

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

修改opt/theos/makefiles/package/deb.mk中第六行:THEOSPLATFORM_DPKG_DEB_COMPRESSION ?= lzma 將最后的lzma 改成 xz,這樣改固然暫時不會報錯了,但后面可能還是會出錯,所以這里建議直接將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 (手機本地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應用逆向工程》一書所進行的總結,所有步驟也是經(jīng)過親自驗證,可能與書中有微小的出入 */

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

相關閱讀更多精彩內容

友情鏈接更多精彩內容