今天使用theos 进行了一个简单的hook。下面介绍具体过程,和踩过的一些坑。
一:物理环境
mac os x: 10.11.5
xcode:xcode7.3.1
xcode sdk:ios9.3
越狱手机:iphone4,ios7
有几点需要注意的地方:
1;mac系统的升级和xcode的安装颇费周折 具体解决的过程见Xcode编译器安装过程说明
2;mac os x系统和越狱手机一定要保证在同一局域网内
3;ios手机上要已经越狱并安装过openssh。
如上截图 则安装了本次试验的两个重要的源:Cydia Substrate和openssh。
其中Cydia Substrate则是包含了theos工具,而openssh则使得计算机可以远程操控ios设备。
openssh默认登录密码是:alpine。通常为了设备安全都建议更改密码。
ssh-keygen -R 伺服器端的IP或網址 清除旧的ssh登录证书
二:theos 安装使用流程
手动下载配置theos十分麻烦,这里有大神做好了准备:去https://github.com/DaSens/Theos-Script下载脚本。
1:将脚本放置在桌面 文件夹内容是
进入文件夹 运行TheosScript.sh脚本文件 一路跑下去 theos安装配置完成
发现多了个文件opt
在opt里则是我们需要的工具 theos。同时这也是我们工具的路径,后文中会讲到。
2:在创建theos工程之前,我们先来创建目标hook app。
介绍下这个app
a;这个app即是在viewController界面上创建一个红色button,点击这个button,这个button上即会出现you are ok的字样。
b;这个app的bundle ID是com.antiy.chendan
c;这个app的名字叫做test1
之所以没有hook app的私有函数发短信这个接口,是因为测试机iphone sim卡失效
下面是运行这个app的结果
目标app已有,现在要做的事情就是hook 它的- (void)buttonClick:(id)sender函数,使得按钮按下去显示you are under control。
3:创建theos工程
a:在桌面上创建test_hook的文件夹,这个文件夹作为工程文件夹
b:cd 进入这个文件夹 终端执行/opt/theos/bin/nic.pl
将会启动theos工程的创建过程,这过程中会一一配置工程参数
首先会出现
选择11
然后会要求输入Project Name:(输入创建的theos工程的名字,本例 test1)
再要求输入Package Name:(输入hook app的bundle ID,本例com.antiy.chendan)
再要求输入Author/Maintainer Name:(输入作者的名字,这个跟工程关系不大,但最后在Cydia源中会显示这些信息,本例chendan)
再要求输入hook app的bundle ID:(本例com.antiy.chendan)
最后输入SpringBoard启动项:为空(不填,直接回车)
经过这个过程theos的工程就创建完毕 如下图
下面分别来介绍一下这个四个文件的意义
control:控制文件,本demo不会用到。
test1.plist:目标hook app的bundle ID存储在这里,可随时更改
Makefile:重新打包配置文件
Tweak.xm:hook的具体细节在这里编码,主要采用logos标识符来hook操作
下面给出Makefile的最终文件形式
Makefile文件最开始的时候 这里大部分项都没有 都是需要配置的
export THEOS=/opt/theos:配置文件执行路径(如果没有这个,是找不到tweak.mk文件的,终端会报错)
THEOS_DEVICE_IP = 192.168.202.232:hook的越狱设备的IP地址,上文提过,必须mac电脑和越狱设备在同一局域网内,不然无法用openssh登录进行操作
ARCHS = armv7 arm64:不同的iphone机型配置不同的,本例iphone4,使用的是armv7,如不放心,可把armv7,armv7s,arm64全带上
TARGET = iphone:latest:9.3:xcode使用的sdk
TWEAK_NAME = test1:teak工程的名字,这个在工程创建的时候就已经有配置过,不能更改
test1_FILES = Tweak.xm:目标hook文件,就在那四个文件之一
test1_FRAMEWORKS = UIKit:hook操作中使用到的ios框架,如使用了私有函数则还需要添加test1_PRIVATE_FRAMEWORKS =
剩下的就不用介绍了,安装完成,终止进程,重新启动SpringBoard。
接下来给出Tweak.xm的hook细节
接下来诸事准备完毕,可以开始hook。
利用终端cd进入你创建的tweak项目目录,然后执行make package install,然后输入两次ssh的连接密码(ssh 默认密码alpine),
然后设备就会重启SpringBoard,然后我们再次打开HOOK的APP发现按钮的点击方法已经被替换了。
三:Cydia源
在Cydia源里查看如下
可知这个app被顺利的hook住了。此后无论xcode运行多少次,这个函数仍然是被hook住的,原来的此处代码无效。
要想恢复之前的app,可进入这个test1
然后卸载即可。
而且我发现 通过theos创建application然后给iphone安装的应用是具有最高权限的,删不掉。不得不说越狱开发真的有点变态。
这也就是那些基于系统的定制化开发,安卓上比比皆是,苹果上只有越狱了应用才能取得这种权限,一旦系统更新,不再越狱,则IOS对这个应用收回这个权限。
四:原理浅探
1,Cydia Substrate 和 Mobile Substrate
Cydia Substrate 原名为 Mobile Substrate 已经正式更名为 Cydia Substrate。
它是越狱后cydia插件/软件运行的一个基础依赖包。提供软件运行的公共库,可以用来动态替换
内存中的代码、数据等所以iOS系统越狱环境下安装绝大部分插件,必须首先安装Cydia Substrate。
Cydia Substrate主要由3部分组成:MobileHooker,MobileLoader 和 safe mode。
2,MobileHooker、Logos
MobileHooker用于替换覆盖系统的方法,这个过程被称为Hooking(挂钩)它主要包含两个函数:voidMSHookMessageEx(Classclass, SEL selector, IMP replacement, IMP *result);voidMSHookFunction(void*function,void* replacement,void** p_original);MSHookMessageEx 主要作用于Objective-C函数MSHookFunction 主要作用于C和C++函数Logos语法就是对此函数做了一层封装,让编写hook代码变的更直观,上面的例子用的就是logos语法。MSHookMessageEx 和MSHookFunction 使用方法这里就不介绍了,大家可去看书籍或者查询相关资料。
3,MobileLoader
MobileLoader用于加载第三方dylib在运行的应用程序中。
启动时MobileLoader会根据dylib的同名plist文件指定的作用范围,有选择的在不同进程里通过dlopen函数打开目录/Library/MobileSubstrate/DynamicLibraries/ 下的所有dylib。
4,safe mode
因为APP程序质量参差不齐崩溃再所难免,tweak本质是dylib,寄生在别人进程里,如果注入Springboard等。系统进程一旦出错,可能导致整个进程崩溃,崩溃后就会造成iOS瘫痪。
所以CydiaSubstrate引入了安全模式,在安全模式下所有基于CydiaSubstratede 的三方dylib都会被禁用,便于查错与修复。
建议自己测试的时候如果HOOK Springboard的时候一定要注意!如果出错,进入安全模式删除插件即可。
参考资料:http://www.jianshu.com/p/8982e9670fc6,http://www.jianshu.com/p/2d2c492a283c