IPhone一起玩越狱 -(十三)- Tweak的原理

IPhone一起玩越狱 -(十三)- Tweak的原理_第1张图片

引言

当我们在使用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项目,并makemake packagemake 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直接注入我的动态库。
而我要验证的就是makemake packagemake install安装到手机以后,我查看手机里面的MachO文件,查看是否注入了我的动态库文件。
过程

  1. 访问我的手机,打开我的目标App,Copy目录下的*.app文件,通过SSH发送给我的Mac桌面


    IPhone一起玩越狱 -(十三)- Tweak的原理_第2张图片

$ scp -P 3456 -r root@localhost:/var/containers/Bundle/Application/39C3D718-5FD5-41E1-86C2-72DB9B06C75D/xxx.app ~/Desktop
//拿到MachO文件

使用MachOView打开这个MachO文件
在Load Commands 中查看是否存在你刚注入的动态库名称

IPhone一起玩越狱 -(十三)- Tweak的原理_第3张图片

我从头到尾都没有看到有我创建的动态库
验证证明了,tweak创建的动态库并没有注入到MachO,没有修改App的二进制文件
tweak不是注入动态库的方式
需要注意的是注入的方式,就是修改二进制文件,注定要重新签名二进制文件
无越狱iphone安装多个同样应用的方法(一)
无越狱IPhone安装多个同样应用的方法(二)Xcode签名
无越狱IPhone安装多个同样应用的方法(三)自动化重签名

验证插入到某个进程

分析
插入到某个进程底下,我们需要的是一个dyld的环境变量,DYLD_INSERT_LIBRARIES这个环境变量告诉了某个App进程,我要加载某个动态库,当App运行的时候,临时挂载到上面而并没有修改App的MachO文件,当App从后台删除以后,这个临时加载的动态库也会跟着清除,当这个App重新打开后需要重新加载这个动态库
在我的IPhone一起玩越狱 -(十)- 使用dumpdecrypted砸壳,动态砸壳
这个篇文章中提到过这种方式也应用过这种方式,请移驾过去查看
验证

IPhone一起玩越狱 -(十三)- Tweak的原理_第4张图片

图中显示的就是当我启动***.app目标App的时候,cydia检测到了它启动了,cydia会调用 DYLD_INSERT_LIBRARIES这个变量让这个App去加载我的动态库, Loading: .../你的动态库的路径

总结

tweak的原理

  1. tweak生成的是一个动态库,并且打包成一个deb的包
    • dylib动态库
    • plist文件(目标app的bundle identifier)
  2. cydia安装这个.deb,实际上就是将.deb中的动态库、plist取出来
  3. 根据plist提供的bundle identifier查找目标App是否启动
  4. 如果启动加载dylib这个动态库

以上

你可能感兴趣的:(IPhone一起玩越狱 -(十三)- Tweak的原理)