iOS逆向, 基础工具之Theos

Theos是一个越狱开发包, 也是逆向中比较重要也是最有意思的工具, 它可以让你的想法变成现实, 编写自己的tweak对有开发热情的人来说是一件非常有趣的事情!
网上大多数还都是上古版本的theos教程, 都已经过时了, 可能越狱开发或者iOS逆向已经大不如从前了, 也没找到适合现在的, 好在开发者还一直维护, 现在整理一份当前最新的安装和基本使用教程.

安装和部署

先决条件

macOS环境

  1. 安装xcode
  2. 安装Command Line Tools
xcode-select --install
  1. ldid
    你可以使用 Homebrew来安装它
$brew install ldid
  1. 安装Perl module
$brew install xz
$sudo cpan IO::Compress::Lzma

安装

  1. 设置环境变量, 你也可以把这句话加入到.base_profile, 详见在当前用户新建一个bash_profile.
export THEOS=~/theos
  1. GitHub克隆项目
$git clone --recursive https://github.com/theos/theos.git $THEOS

不要忘记--recursive, 因为里面还包含了一些别的git库
如果你已经clone下来了, 那么使用这个命令来更新就可以了

$ $THEOS/bin/update-theos

至此最基本的配置和安装就搞定了, 再也没有其它上古教程的复杂配置.

新建项目

$ $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.

很简单的过程, 一个tweak就新建完成了!
下面我们来逐行了解一下这些东西

模板

很简单的1-12是一对模板, 我们选择11 iphone/tweak

Project Name

项目名, 按你心意

Package Name

这个想必大家都熟悉, 是一个倒叙的唯一标示

Author/Maintainer Name

你的大名!

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

作用的APP包, 这个很重要, 这里默认是com.apple.springboard, 就是iOS的桌面程序, 那么就说明这个tweak对springboard起作用, 这是一个数组, 可以输入若干个.
至于这个包名从哪找, 在XXX.app中, 查看里面的plist文件就可以了.

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

字面意思很明显了, 程序安装完成后要kill的进程, 这里既然我们要改springboard, 自然安装后会杀掉springboard让其重启, 好检验我们的程序是否已经运行.

Done

关于Theos更详细的信息可以参考wiki

项目目录详解

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

默认的内容为:

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"

下面我们来逐行了解

include $(THEOS)/makefiles/common.mk

固定写法

TWEAK_NAME = testreproject

你刚刚输入的Project Name

testreproject_FILES = Tweak.xm

tweak包含的源文件, 不包括库头文件什么的, 多个文件以空格分割.

include $(THEOS_MAKE_PATH)/tweak.mk

不同的工程类型, 指定不同的mk文件, 一般会用到的有Application, Tweak, Tool三种类型的程序, 那么就是对应的application.mk, tweak.mk, tool.mk三个, 按需更改.

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

这个更简单了, 安装之后要干的事情, 这里是杀掉SpringBoard进程.
下面介绍一下其它的常用配置:

  • ARCHS = armv7 armv7s arm64 //指定对应的处理器架构
  • TARGET = iphone:latest:8.0 //指定版本
  • testreproject_FRAMEWORKS = UIKit CoreAudio //导入framework
  • testreproject_PRIVATE_FRAMEWORKS = AppSupport ChatKit //导入私有库
  • testreproject_LDFLAGS = -lz -lsqlite3.0 -dylib1.o // 链接libsqlite3.0.dylib, libz.dylib和dylib1.o.
    Theos采用GNU Linker来链接Mack-O对象, 包括.dylib, .a和.o.
    -lx代表链接libx.a或libx.dylib, 即给”x“加上”lib“的前缀, 以及".a"或".dylib"的后缀, 如果x是"y.o"的形式, 则直接链接y.o, 不加任何前缀或后缀.

更详细的Makefile介绍

Tweak.xm

默认文件如下:

/* 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
*/

文档里写的很明白了, 如何hook和调用函数之类的, 下面只简单介绍几个主要的语法, 更详细的关于LOGO的详见这里

%hook ClassName 和 %end

这个是作为一个结构存在的, 表示开始和结束

%orig

执行原始函数

%orig(nil, nil);

执行原始函数, 并自定义参数值, 如果用这种函数, 必须写明所有的参数.

control

control文件记录了deb包管理系统所需的基本信息, 会被打包进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

用于描述这个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包所属的程序类别, 不要更改.

Done

关于control文件的更多信息可以访问这里

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

该plist文件的作用和App中的Info.plist类似, 它记录了一些配置信息, 描述了tweak的作用范围.
通过Xcode打开该文件, 我们可以看到它的最外层是一个Dictionary, 只有一个名为"Filter"的键. Filter下是一系列Array, 可以分为三类:

Bundle

指定若干bundle为tweak的作用对象. 如:com.apple.springboard

Classes

指定若干class为tweak的作用对象. 如:NSString

Executables:

指定若干可执行文件为tweak的作用对象. 如:callservicesd

这三类Array可以混合使用, 但当Filter下有不同类的Array时, 需要添加一个"Mode: Any"键值对. 当Filter下的Array只有一类时, 不需要添加.

编译, 打包, 安装

编译

在根目录下使用make命令就编译了, 生成/obj/debug目录

打包

使用"make package"命令来打包.
执行完成后会在工程目录下生成/packages/xxx.deb文件.该文件就是可以直接安装在iOS上的安装包.

安装

  1. 可以利用其它工具导入手机目录, 进行安装, 这里不做赘述
  2. 使用SSH进行安装
    首先在手机里安装openSSH.
    在Makefile中加入以下
    export THEOS_DEVICE_IP = 192.168.6.55 (手机IP)
    然后make后执行
    make package install
    输入密码, 安装成功!
其它常见错误

==> 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

如果出现这个错误, 那么

export THEOS_DEVICE_IP=127.0.0.1

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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,014评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,796评论 3 386
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,484评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,830评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,946评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,114评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,182评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,927评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,369评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,678评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,832评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,533评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,166评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,885评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,128评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,659评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,738评论 2 351

推荐阅读更多精彩内容