引言
当我们在使用theos创建一个tweak项目的时候,tweak做了什么?它的工作原理是什么?
分析tweak项目
- 分析tweak创建以后的几个文件,创建操作请查看十一
根目录
.
├── .theos
| ├── _
| | └── ... *
| ├── obj
| | └── ... *
| ├── packages
| | └── ... 记录版本号
| ├── build_session
| ├── fakeroot
| └── last_package 当前打包成功以后放的路径
├── obj 实际上跟上面.theos/obj的目录是一样的
| └── debug/... 空的
├── packages
| └── ... 你的包程序,也就是你的插件的包,在很多威锋源里面的*.deb文件,每次打包都会生成一个包文件,每次包文件的版本号都会++
├── control 配置信息
├── Makefile 环境变量信息
├── Tweak.xm 编写logos hook代码
├── ***.plist 目标进程,就是你需要修改、hook的App的Bundle identifier
_ 目录
├── DEBIAN
| └── control 配置信息
├── Library
| | └── MobileSubstrate/Dynamiclibrarte/**.plist 目标进程,就是你需要修改、hook的App的Bundle identifier
obj 目录 上面两个obj目录实际上都是一样的,只不过在根目录中的obj在打包安装的整个过程中都是空的,我也不知道作者当时是怎么想的,所以就绕过去,可能还有别的作用的,现在是没找到相关的内容。
├── debug
| ├── arm64 arm64的*.dylib 动态库
| └── armv7 armv7的*.dylib 动态库
| | └── *.dylib 合并arm64、armv7的动态库
当我使用theos创建一个tweak项目,并make
、make package
、make install
三个步骤会直接安装到你的手机里面,在cydia安装的插件中就可以看到你自己的插件
当然tweak是以什么形式安装到手机中的呐?
首先我们来介绍下动态库能够被加载,而且还会被调用,基本上我所知道的只有2种:
1. 注入到某个App
2. 插入到某个进程
验证
为了证明我已经将动态库注入App或是插进我的目标进程,我在**.xm
中添加了如下代码进行验证
%hook WCAccountLoginFirstViewController
- (void)viewDidAppear:(BOOL)animated{
UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"提示" message:@"注入成功了,呜~喵!" preferredStyle:UIAlertControllerStyleAlert];
UIAlertAction *alertaction = [UIAlertAction actionWithTitle:@"好的" style:UIAlertActionStyleCancel handler:^(UIAlertAction * _Nonnull action) {
}];
[alert addAction:alertaction];
[[UIApplication sharedApplication].keyWindow.rootViewController presentViewController:alert animated:YES completion:nil];
%orig;
}
%end
验证注入到某个App
猜想:
当我创建一个tweak项目的时候,会在最后输入,目标App的Bundle identifier,这个App的唯一标示,cydia根据这个Bundle identifier直接注入我的动态库。
而我要验证的就是make
、make package
、make install
安装到手机以后,我查看手机里面的MachO文件,查看是否注入了我的动态库文件。
过程
-
访问我的手机,打开我的目标App,Copy目录下的*.app文件,通过SSH发送给我的Mac桌面
$ scp -P 3456 -r root@localhost:/var/containers/Bundle/Application/39C3D718-5FD5-41E1-86C2-72DB9B06C75D/xxx.app ~/Desktop
//拿到MachO文件
使用MachOView打开这个MachO文件
在Load Commands 中查看是否存在你刚注入的动态库名称
我从头到尾都没有看到有我创建的动态库
验证证明了,tweak创建的动态库并没有注入到MachO,没有修改App的二进制文件
tweak不是注入动态库的方式
需要注意的是注入的方式,就是修改二进制文件,注定要重新签名二进制文件
无越狱iphone安装多个同样应用的方法(一)
无越狱IPhone安装多个同样应用的方法(二)Xcode签名
无越狱IPhone安装多个同样应用的方法(三)自动化重签名
验证插入到某个进程
分析
插入到某个进程底下,我们需要的是一个dyld的环境变量,DYLD_INSERT_LIBRARIES
这个环境变量告诉了某个App进程,我要加载某个动态库,当App运行的时候,临时挂载到上面而并没有修改App的MachO文件,当App从后台删除以后,这个临时加载的动态库也会跟着清除,当这个App重新打开后需要重新加载这个动态库
在我的IPhone一起玩越狱 -(十)- 使用dumpdecrypted砸壳,动态砸壳
这个篇文章中提到过这种方式也应用过这种方式,请移驾过去查看
验证
图中显示的就是当我启动***.app目标App的时候,cydia检测到了它启动了,cydia会调用
DYLD_INSERT_LIBRARIES
这个变量让这个App去加载我的动态库,Loading: .../你的动态库的路径
。
总结
tweak的原理
- tweak生成的是一个动态库,并且打包成一个deb的包
- dylib动态库
- plist文件(目标app的bundle identifier)
- cydia安装这个.deb,实际上就是将.deb中的动态库、plist取出来
- 根据plist提供的bundle identifier查找目标App是否启动
- 如果启动加载dylib这个动态库
以上