iOS逆向, 基礎(chǔ)工具之Theos

Theos是一個(gè)越獄開(kāi)發(fā)包, 也是逆向中比較重要也是最有意思的工具, 它可以讓你的想法變成現(xiàn)實(shí), 編寫(xiě)自己的tweak對(duì)有開(kāi)發(fā)熱情的人來(lái)說(shuō)是一件非常有趣的事情!
網(wǎng)上大多數(shù)還都是上古版本的theos教程, 都已經(jīng)過(guò)時(shí)了, 可能越獄開(kāi)發(fā)或者iOS逆向已經(jīng)大不如從前了, 也沒(méi)找到適合現(xiàn)在的, 好在開(kāi)發(fā)者還一直維護(hù), 現(xiàn)在整理一份當(dāng)前最新的安裝和基本使用教程.

安裝和部署

先決條件

macOS環(huán)境

  1. 安裝xcode
  2. 安裝Command Line Tools
xcode-select --install
  1. ldid
    你可以使用 Homebrew來(lái)安裝它
$brew install ldid
  1. 安裝Perl module
$brew install xz
$sudo cpan IO::Compress::Lzma

安裝

  1. 設(shè)置環(huán)境變量, 你也可以把這句話加入到.base_profile, 詳見(jiàn)在當(dāng)前用戶新建一個(gè)bash_profile.
export THEOS=~/theos
  1. GitHub克隆項(xiàng)目
$git clone --recursive https://github.com/theos/theos.git $THEOS

不要忘記--recursive, 因?yàn)槔锩孢€包含了一些別的git庫(kù)
如果你已經(jīng)clone下來(lái)了, 那么使用這個(gè)命令來(lái)更新就可以了

$ $THEOS/bin/update-theos

至此最基本的配置和安裝就搞定了, 再也沒(méi)有其它上古教程的復(fù)雜配置.

新建項(xiàng)目

$ $THEOS/bin/nic.pl 
NIC 2.0 - New Instance Creator
------------------------------
  [1.] iphone/activator_event
  [2.] iphone/application_modern
  [3.] iphone/cydget
  [4.] iphone/flipswitch_switch
  [5.] iphone/framework
  [6.] iphone/ios7_notification_center_widget
  [7.] iphone/library
  [8.] iphone/notification_center_widget
  [9.] iphone/preference_bundle_modern
  [10.] iphone/tool
  [11.] iphone/tweak
  [12.] iphone/xpc_service
Choose a Template (required): 11
Project Name (required): testreproject
Package Name [com.yourcompany.testreproject]: 
Author/Maintainer Name [wangyu]: wangyu
[iphone/tweak] MobileSubstrate Bundle filter [com.apple.springboard]: 
[iphone/tweak] List of applications to terminate upon installation (space-separated, '-' for none) [SpringBoard]: 
Instantiating iphone/tweak in testreproject/...
Done.

很簡(jiǎn)單的過(guò)程, 一個(gè)tweak就新建完成了!
下面我們來(lái)逐行了解一下這些東西

模板

很簡(jiǎn)單的1-12是一對(duì)模板, 我們選擇11 iphone/tweak

Project Name

項(xiàng)目名, 按你心意

Package Name

這個(gè)想必大家都熟悉, 是一個(gè)倒敘的唯一標(biāo)示

Author/Maintainer Name

你的大名!

[iphone/tweak] MobileSubstrate Bundle filter [com.apple.springboard]

作用的APP包, 這個(gè)很重要, 這里默認(rèn)是com.apple.springboard, 就是iOS的桌面程序, 那么就說(shuō)明這個(gè)tweak對(duì)springboard起作用, 這是一個(gè)數(shù)組, 可以輸入若干個(gè).
至于這個(gè)包名從哪找, 在XXX.app中, 查看里面的plist文件就可以了.

[iphone/tweak] List of applications to terminate upon installation

字面意思很明顯了, 程序安裝完成后要kill的進(jìn)程, 這里既然我們要改springboard, 自然安裝后會(huì)殺掉springboard讓其重啟, 好檢驗(yàn)我們的程序是否已經(jīng)運(yùn)行.

Done

關(guān)于Theos更詳細(xì)的信息可以參考wiki

項(xiàng)目目錄詳解

$ cd testreproject
$ ls
Makefile            Tweak.xm            control             testreproject.plist
Makefile

默認(rèn)的內(nèi)容為:

include $(THEOS)/makefiles/common.mk
  
TWEAK_NAME = testreproject
testreproject_FILES = Tweak.xm

include $(THEOS_MAKE_PATH)/tweak.mk

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

下面我們來(lái)逐行了解

include $(THEOS)/makefiles/common.mk

固定寫(xiě)法

TWEAK_NAME = testreproject

你剛剛輸入的Project Name

testreproject_FILES = Tweak.xm

tweak包含的源文件, 不包括庫(kù)頭文件什么的, 多個(gè)文件以空格分割.

include $(THEOS_MAKE_PATH)/tweak.mk

不同的工程類型, 指定不同的mk文件, 一般會(huì)用到的有Application, Tweak, Tool三種類型的程序, 那么就是對(duì)應(yīng)的application.mk, tweak.mk, tool.mk三個(gè), 按需更改.

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

這個(gè)更簡(jiǎn)單了, 安裝之后要干的事情, 這里是殺掉SpringBoard進(jìn)程.
下面介紹一下其它的常用配置:

  • ARCHS = armv7 armv7s arm64 //指定對(duì)應(yīng)的處理器架構(gòu)
  • TARGET = iphone:latest:8.0 //指定版本
  • testreproject_FRAMEWORKS = UIKit CoreAudio //導(dǎo)入framework
  • testreproject_PRIVATE_FRAMEWORKS = AppSupport ChatKit //導(dǎo)入私有庫(kù)
  • testreproject_LDFLAGS = -lz -lsqlite3.0 -dylib1.o // 鏈接libsqlite3.0.dylib, libz.dylib和dylib1.o.
    Theos采用GNU Linker來(lái)鏈接Mack-O對(duì)象, 包括.dylib, .a和.o.
    -lx代表鏈接libx.a或libx.dylib, 即給”x“加上”lib“的前綴, 以及".a"或".dylib"的后綴, 如果x是"y.o"的形式, 則直接鏈接y.o, 不加任何前綴或后綴.

更詳細(xì)的Makefile介紹

Tweak.xm

默認(rèn)文件如下:

/* How to Hook with Logos
Hooks are written with syntax similar to that of an Objective-C @implementation.
You don't need to #include <substrate.h>, it will be done automatically, as will
the generation of a class list and an automatic constructor.

%hook ClassName

// Hooking a class method
+ (id)sharedInstance {
        return %orig;
}

// Hooking an instance method with an argument.
- (void)messageName:(int)argument {
        %log; // Write a message about this call, including its class, name and arguments, to the system log.

        %orig; // Call through to the original function with its original arguments.
        %orig(nil); // Call through to the original function with a custom argument.

        // If you use %orig(), you MUST supply all arguments (except for self and _cmd, the automatically generated ones.)
}

// Hooking an instance method with no arguments.
- (id)noArguments {
        %log;
        id awesome = %orig;
        [awesome doSomethingElse];

        return awesome;
}

// Always make sure you clean up after yourself; Not doing so could have grave consequences!
%end
*/

文檔里寫(xiě)的很明白了, 如何hook和調(diào)用函數(shù)之類的, 下面只簡(jiǎn)單介紹幾個(gè)主要的語(yǔ)法, 更詳細(xì)的關(guān)于LOGO的詳見(jiàn)這里

%hook ClassName 和 %end

這個(gè)是作為一個(gè)結(jié)構(gòu)存在的, 表示開(kāi)始和結(jié)束

%orig

執(zhí)行原始函數(shù)

%orig(nil, nil);

執(zhí)行原始函數(shù), 并自定義參數(shù)值, 如果用這種函數(shù), 必須寫(xiě)明所有的參數(shù).

control

control文件記錄了deb包管理系統(tǒng)所需的基本信息, 會(huì)被打包進(jìn)deb包里.

Package: com.yourcompany.testreproject
Name: testreproject
Depends: mobilesubstrate
Version: 0.0.1
Architecture: iphoneos-arm
Description: An awesome MobileSubstrate tweak!
Maintainer: wangyu
Author: wangyu
Section: Tweaks
Package

用于描述這個(gè)deb包的名字, 采用的命名方式同bundle identifier類似, 均為反向DNS格式. 可以按需更改.

Name

用于描述這個(gè)工程的名字, 可以按需更改.

Depends

用于描述這個(gè)deb包的依賴.
依賴指的是這個(gè)程序運(yùn)行的基本條件, 可以填寫(xiě)固件版本或其它程序, 如果當(dāng)前iOS不滿足依賴中定義的條件, 則此tweak無(wú)法正常運(yùn)行.
如: Depends:mobilesubstrate,firmware(>=8.0)表示當(dāng)前iOS版本必須在8.0以上, 且必須安裝CydiaSubstrate才能正常運(yùn)行這個(gè)tweak, 可以按需更改.

Version

用于描述這個(gè)deb包的版本號(hào), 可以按需更改.

Architecture

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

Description

是deb包的簡(jiǎn)介, 可以更改.
#######Maintainter
用于描述deb包的維護(hù)人, 可以按需更改.

Author

用于描述tweak的作者, 可以按需更改.

Section

用于描述deb包所屬的程序類別, 不要更改.

Done

關(guān)于control文件的更多信息可以訪問(wèn)這里

testreproject.plist
{ Filter = { Bundles = ( "com.apple.springboard" ); }; }

該plist文件的作用和App中的Info.plist類似, 它記錄了一些配置信息, 描述了tweak的作用范圍.
通過(guò)Xcode打開(kāi)該文件, 我們可以看到它的最外層是一個(gè)Dictionary, 只有一個(gè)名為"Filter"的鍵. Filter下是一系列Array, 可以分為三類:

Bundle

指定若干bundle為tweak的作用對(duì)象. 如:com.apple.springboard

Classes

指定若干class為tweak的作用對(duì)象. 如:NSString

Executables:

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

這三類Array可以混合使用, 但當(dāng)Filter下有不同類的Array時(shí), 需要添加一個(gè)"Mode: Any"鍵值對(duì). 當(dāng)Filter下的Array只有一類時(shí), 不需要添加.

編譯, 打包, 安裝

編譯

在根目錄下使用make命令就編譯了, 生成/obj/debug目錄

打包

使用"make package"命令來(lái)打包.
執(zhí)行完成后會(huì)在工程目錄下生成/packages/xxx.deb文件.該文件就是可以直接安裝在iOS上的安裝包.

安裝

  1. 可以利用其它工具導(dǎo)入手機(jī)目錄, 進(jìn)行安裝, 這里不做贅述
  2. 使用SSH進(jìn)行安裝
    首先在手機(jī)里安裝openSSH.
    在Makefile中加入以下
    export THEOS_DEVICE_IP = 192.168.6.55 (手機(jī)IP)
    然后make后執(zhí)行
    make package install
    輸入密碼, 安裝成功!
其它常見(jiàn)錯(cuò)誤

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

==> Notice:It is also recommended that you have public-key authentication set up for root over SSH, or you will be entering your password a lot.

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

如果出現(xiàn)這個(gè)錯(cuò)誤, 那么

export THEOS_DEVICE_IP=127.0.0.1

也可以將其加入到之前提到的base_profile里, 一勞永逸!.

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末墙歪,一起剝皮案震驚了整個(gè)濱河市觉至,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌绞旅,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,544評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件额湘,死亡現(xiàn)場(chǎng)離奇詭異艾恼,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)木人,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,430評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén)信柿,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人醒第,你說(shuō)我怎么就攤上這事渔嚷。” “怎么了稠曼?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,764評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵形病,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我霞幅,道長(zhǎng)漠吻,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,193評(píng)論 1 292
  • 正文 為了忘掉前任司恳,我火速辦了婚禮途乃,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘扔傅。我一直安慰自己耍共,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,216評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布猎塞。 她就那樣靜靜地躺著试读,像睡著了一般。 火紅的嫁衣襯著肌膚如雪荠耽。 梳的紋絲不亂的頭發(fā)上钩骇,一...
    開(kāi)封第一講書(shū)人閱讀 51,182評(píng)論 1 299
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼倘屹。 笑死银亲,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的唐瀑。 我是一名探鬼主播群凶,決...
    沈念sama閱讀 40,063評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼哄辣!你這毒婦竟也來(lái)了请梢?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 38,917評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤力穗,失蹤者是張志新(化名)和其女友劉穎毅弧,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體当窗,經(jīng)...
    沈念sama閱讀 45,329評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡够坐,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,543評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了崖面。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片元咙。...
    茶點(diǎn)故事閱讀 39,722評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖巫员,靈堂內(nèi)的尸體忽然破棺而出庶香,到底是詐尸還是另有隱情,我是刑警寧澤简识,帶...
    沈念sama閱讀 35,425評(píng)論 5 343
  • 正文 年R本政府宣布赶掖,位于F島的核電站,受9級(jí)特大地震影響七扰,放射性物質(zhì)發(fā)生泄漏奢赂。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,019評(píng)論 3 326
  • 文/蒙蒙 一颈走、第九天 我趴在偏房一處隱蔽的房頂上張望膳灶。 院中可真熱鬧,春花似錦疫鹊、人聲如沸袖瞻。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,671評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至脂矫,卻和暖如春枣耀,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,825評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工捞奕, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留牺堰,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,729評(píng)論 2 368
  • 正文 我出身青樓颅围,卻偏偏與公主長(zhǎng)得像伟葫,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子院促,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,614評(píng)論 2 353

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