iOS逆向基础(四)-插件开发篇

1,588 阅读7分钟

一、摘要

Tweak技术是iOS逆向工程领域的一种重要技术,主要应用于对iOS系统和应用程序的定制和优化。它允许开发者在不修改原始代码的情况下,通过Hook方法实现对现有功能的拓展和改造,这种技术极大的拓宽了iOS开发者和用户的可能性,为他们提供了无限的创意空间。

二、Tweak开发原理

2.1 Tweak简介

Tweak指的是对电子系统进行轻微调整来增强其功能的工具,在iOS系统中,tweak特指那些能够增强其他可执行程序功能的动态链接库,是越狱iOS的重要组成部分。由于Tweak的便利性,越狱iOS用户才能依照自己的喜好打造独一无二的个性化系统,IOS开发者才有机会站在优秀软件的肩膀上为它们添砖加瓦,丰富它们的功能,而这些便利都是原版iOS和App Store无法提供的。 Cydia中最受欢迎的软件几乎全是创意各异的tweak,其中99%的tweak都是基于MobileSubstrate编写的。

Tweak增强功能效果例子如下: tweak增强例子.jpg 说明:该Tweak的作用是在原应用的显示内容中增加了苹果公司的市值显示功能,如上图红框所示。

2.2 MobileSubstrate简介

MobileSubstrate是一个能够让IOS开发者方便进行hook操作的framework,它由IOS界最有名望的顶级高手之一Jay Freeman(@saurik)开发,是越狱IOS的奠基石之一。 MobileSubstrate由3个部分组成,分别是:MobileHooker、MobileLoader和Safe mode。

(1)MobileHooker

MobileHooker的作用是替换系统函数,也就是所谓的hook技术,它主要包含两个函数:

IMP MSHookMessage(Class class, SEL selector, IMP replacement, const char* prefix);

void MSHookMessageEx(Class class,SEL selector, IMP replacement, IMP* result);

void MSHookFunction(void* function, void* replacement, void**p_original);

其中,因为MSHookMessage()不是线程安全的,所以被弃用了,改用

MSHookMessageEx()。MSHookMessageEx()用于Objective-C函数,通过调用IMP method_setImplementation(Method method, IMP imp)来将[class selector]的实现改为replacement。

(2)MobileLoader

MobileLoader的作用是加载第三方动态链接库,也就是tweak。在IOS启动时,由launchd将MobileLoader载入内存,然后MobileLoader会dlopen所有

/Library/MobileSubstrate/DynamicLibraries/目录下的动态链接库。

(3)Safe mode

IOS程序员的水平参差不齐,程序崩溃在所难免。但因tweak是动态链接库,寄生在别的可执行程序里,一旦出错,可能会导致整个程序崩溃,所以MobileSubstrate引入了Safe mode,它会捕获SIGTRAP、SIGABRT、SIGILL、SIGBUS、SIGSEGV、SIGSYS这6种信号,然后进入安全模式;在安全模式里,所有第三方插件均被禁用,便于用户查错并修复程序。

2.3 Theos简介

Theos是一个越狱开发工具包,由大神Dustin Howett(@DHowett)开发并分享到GitHub上。Theos与其它越狱开发工具相比,最大的特点就是简单:下载安装简单、Logos语法简单、编译发布简单,可以让使用者把精力都放在开发工作上去。Theos在技术上只是对MobileHooker作了一层封装,增强了它的易用性,其底层实现仍完全基于MobileHooker。

三、Tweak开发环境准备

利用Theos开发 Tweak程序需要在命令行下执行编译命令,编译完成的文件为一个deb格式的软件包,该包将在移动设备下运行。

3.1 系统环境

通过Theos环境编写Tweak需要用到Xcode的命令行工具,因此操作系统需要OSX,并安装Xcode代码编写环境。

OSX环境如图:

OSX环境.jpg

Xcode开发环境如图:

xcode开发环境.jpg

3.2 移动设备

通过Theos编译完成的程序包为deb格式,因此需要苹果移动设备,iOS系统最低5.0以上。且所有iOS系统必须越狱。

iOS系统如图: iOS系统参数.jpg

已经越狱的设备可以找到名为:Cydia的图标,打开图标后显示内容如下:

已经越狱的设备.jpg

四、Theos开发环境准备

4.1 iOS SDK安装

一般IOS程序员的OSX系统上都会安装iOS SDK。在利用Theos开发tweak过程中需要在下载安装Xcode后进一步安装CLT(Command Line Tools,命令行工具),其在Xcode中的路径为:

Xcode -> Preferences -> Downloads,如图:

命令行工具安装.png

注意:Xcode 5之后的版本,CLT被整合到Xcode中,无需额外下载安装。

4.2 Theos环境变量配置

该步骤的目的是配置theos工具的运行环境变量,具体方法是打开OS X系统中的命令行终端,输入以下命令:

export THEOS=/opt/theos

以上命令是设置theos工具的安装路径,/opt/theos为一个标准的推荐安装路径,使用者也可根据自身电脑配置情况设置其它自定义路径。如图:

theos环境变量配置.png

4.3 获取Theos

打开OS X系统的命令行终端,输入以下命令获取theos:

sudo git clone git://github.com/DHowett/theos.git $THEOS

如图: 获取theos.png

其中,$THEOS为上面设置的安装路径:/opt/theos,该命令执行后,theos安装包将默认安装到目录/opt/theos,如图:

theos目录.png

4.4 安装ldid

ldid是专门用来签名iOS文件的工具,用以取代Xcode自带的codesign。ldid可以从

github.com/downloads/r…下载,并将解压所得到的"ldid"文件拷贝到

/opt/theos/bin($THEOS/bin)目录下,如图:

ldid拷贝.png

4.5 配置MobileSubstrate环境

在OS X系统的命令行终端中使用以下命令来配置开发时需要的MobileSubstrate环境:

sudo $THEOS/bin/bootstrap.sh substrate,如图:

配置mobileSubstrate环境.png

注意:此处会遇到Theos的一个bug,它无法生成一个有效的libsubstrate.dylib文件,需要使用者手动将其替换成有效文件。解决方法为:用iFunBox或iTools等工具软件将iOS设备上的

/Library/Frameworks/CydiaSubstrate.framework/CydiaSubstrate复制到OS X系统中,然后运行以下命令,替换无效的libsubstrate.dylib:

(假设CydiaSubstrate复制过来的路径为:/Project/CydiaSubstrate)

sudo mv -f /Project/CydiaSubstrate $THEOS/lib/libsubstrate.dylib

如图:

命令替换libsubstrate.png

命令执行成功后生成的文件,如图:

libsubstrate生成成功.png

4.6 安装dpkg

dpkg是一个专门用来制作deb(Debian package)的工具,程序员使用Theos开发出来的插件都将会以deb格式发布, 推荐采用MacPorts这一简单方法安装dpkg,具体步骤如下:

(1)前往www.macports.org/install.php下载对应OS X版本的pkg安装包,下载成功后的程序包如图:

下载pkg安装包.png

(2)安装完成后,在OSX 命令行终端输入以下命令:

sudo port selfupdate,如图:

升级MacPorts.png

确保MacPorts升级到了最新版本。

(3)运行以下命令安装dpkg:

sudo port install dpkg,如图:

安装dpkg.png

验证dpkg安装是否成功,如图:

验证dpkg是否安装成功.png

4.7 安装Theos NIC templates

Theos NIC templates内置了5种Theos工程类型的模板,方便使用者创建多样的Theos工程,可以从github.com/DHowett/the…获取额外的5种模板,下载后将解压得到的5个.tar文件,如图:

获取TheosNIC.png

复制到$THEOS/templates/iphone目录下即可。如图:

复制到模版目录.png

4.8 Theos使用方法

4.8.1 创建Theos工程

在MAC系统中打开终端命令行窗口,输入命令:$THEOS/bin/nic.pl ,如图:

执行nic脚本命令.png

在以上选项中,选择:9号模板,接着根据提示,分别输入:工程名称、包名等信息,如图:

选择序号9模版.png

完成之后,将在当前目录下生成工程文件夹,如图:

成功生成工程文件夹.png

在工程文件中,包含了一些主要文件,每个文件的含义如下:

Makefile —— 编译deb包的Make文件。

control —— 模板自定义配置信息。

Tweak.xm —— 主要的代码编写和功能实现文件

4.8.2 Theos基本语法

Theos实现了对MobileSubstrate底层的一些封装,用起来更加方便和效率,这里主要掌握两个关键语法:

%hook —— 该语法后面直接跟类名,表示对该类名进行Hook

%orig —— 该语法表示调用原函数,能够获取原函数的返回值。

4.8.3 Theos代码编写

Theos代码编写主要在Tweak.xm文件中完成,如图:

tweak文件开发文件创建.png

代码编写示例如下:

theos代码编写示例.png

4.8.4 Theos代码编译和运行

编写代码首先要配置Makefile文件,打开Makefile文件,主要有以下内容:

theos编译Makefile创建.png

其中THEOS_Device_IP后面的值需要配置为当前iOS设备连接WiFi获取的IP地址,以便后续生成的deb包能够直接安装到手机上。

ARCHS后面值表示支持的平台,armv7表示iOS 5版本 、armv7s表示iOS 6版本、arm64表示iOS 7版本。

TARGET表示支持iOS最低和最高的版本。

include后面的内容不用改变。

TWEAK_NAME表示工程名。

after-install最后-9后面是进程名称。

如果代码编写没有语法错误,通过执行make package install将编译并将生成的deb包安装到iOS设备上,期间会两次提示SSH的登录密码,如图:

deb包安装.png

本地生成的deb包:

生成本地deb包.png

五、Theos插件开发示例

5.1 Tweak编写思路

该Tweak示例插件功能不复杂,目的是在iPhone 4/4S的锁屏界面上显示自定义字符串内容,要实现该功能,需要挂钩iOS 6系统的私有类SBAwayController下的activate函数,当用户开机或直接进入锁屏界面时,都能够显示自定义的字符串内容。

代码在Theos模版下编写完成,目标是%hook 类SBAwayController的成员函数:activate,最终完成代码如下:

tweak示例代码编写.png

5.2 Tweak代码编译

在编译代码前,首先要对Makefile文件内容做一番配置,有几项参数需要特别说明:

(1)Makefile文件中的THEOS_DEVICE_IP,该参数内容为目标手机的Wifi IP地址,需要确保iPhone 4/4s手机连接到WiFi,并通过SSH能够正常登录。

(2)ARCHS为目标手机支持的ARM指令集,iPhone 4为armv7,iPhone 4S为armv7s

(3)TARGET为iPhone的系统版本范围。

最终完成的Makefile文件内容如下:

tweak示例makefile文件.png

以上内容完成以后,在OS X系统下的终端命令:make package install完成本地编译和手机deb包安装:

安装tweak示例的deb包.png

如果以上内容均没有问题,最终在iPhone的锁屏界面下将出现以下内容:

tweak效果展示.jpg