roothide Bootstrap
一个功能全面的iOS引导程序,支持iOS 15.0-17.0系统,兼容A8到A17Pro以及M1/M2芯片设备,基于roothide技术构建。
警告: 使用本软件意味着您将对自己使用该软件所产生的一切后果负全责。对设备进行的任何非官方修改都可能导致无法修复的损坏。
功能特性
- 广泛的设备兼容性:全面支持iOS 15.0-17.0系统,覆盖从A8到A17Pro以及M1/M2芯片的设备
- roothide技术集成:基于roothide技术构建,提供稳定的越狱环境
- TrollStore安装:必须通过TrollStore安装,确保系统安全性
- 完整的引导程序功能:包含基带文件、签名工具等核心组件
- 开发者模式支持:支持在设备上启用开发者模式
- 应用列表管理:可通过应用列表界面管理需要注入插件的应用程序
- 动态签名重建:支持对二进制文件进行签名重建
- 多语言本地化:支持界面文本的本地化显示
安装指南
系统要求
- iOS 15.0-17.0系统
- A8-A17Pro或M1/M2芯片设备
- MacOS系统(用于编译构建)
- Xcode(App Store版本,仅命令行工具不可用)
- TrollStore 2.0.9或更高版本
构建步骤
-
安装Theos(带roothide支持)
bash -c "$(curl -fsSL https://raw.githubusercontent.com/roothide/theos/master/bin/install-theos)"如果之前有Theos安装导致错误,请先完全移除旧版本。
-
克隆仓库并进入目录
git clone https://github.com/roothide/Bootstrap/ && cd Bootstrap -
构建Bootstrap.tipa
make package -
安装到设备
- 从
./packages/目录获取Bootstrap.tipa文件 - 通过TrollStore安装到iOS设备
- 从
GitHub Actions构建
如果没有MacOS系统,可以通过GitHub Actions进行构建(详细步骤参考项目FAQ)。
使用说明
基础使用
-
安装后首次运行:应用将通过TrollStore安装,确保使用版本2.0.9或更高以支持设备上的开发者模式启用。
-
插件兼容性:未编译或未转换为roothide格式的插件默认无法与roothide Bootstrap配合使用。请参考FAQ了解如何使用roothide Patcher工具。
-
应用注入管理:默认情况下,roothide不会向任何应用注入插件。如需为特定应用启用插件注入,请在Bootstrap应用中的"应用列表"界面进行设置。
命令行功能
Bootstrap应用支持多种命令行操作:
// 引导操作
int bootstrap();
// 取消引导操作
int unbootstrap();
// 启用应用插件
int enableForApp(NSString* bundlePath);
// 禁用应用插件
int disableForApp(NSString* bundlePath);
// 重建图标缓存
int rebuildIconCache();
// 隐藏引导应用
int hideBootstrapApp(BOOL usreboot);
// 重启设备
void reboot(0);
应用列表管理
通过AppViewController类管理应用列表,支持搜索和过滤功能:
// 获取共享实例
AppViewController *appVC = [AppViewController sharedInstance];
// 重新加载搜索
[appVC reloadSearch];
// 搜索栏文本变化处理
- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText {
[self reloadSearch];
[self.tableView reloadData];
}
核心代码
应用代理管理 (AppDelegate.m)
#import "AppDelegate.h"
#include "common.h"
#include <MBProgressHUD/MBProgressHUD.h>
@implementation AppDelegate
// 显示提示消息
+(void)showHudMsg:(NSString*)msg
{
dispatch_async(dispatch_get_main_queue(), ^{
switchHud = [MBProgressHUD showHUDAddedTo:UIApplication.sharedApplication.keyWindow animated:YES];
[switchHud showAnimated:YES];
switchHud.label.text = msg;
});
}
// 显示带详细信息的提示
+(void)showHudMsg:(NSString*)msg detail:(NSString*)info
{
dispatch_async(dispatch_get_main_queue(), ^{
switchHud = [MBProgressHUD showHUDAddedTo:UIApplication.sharedApplication.keyWindow animated:YES];
[switchHud showAnimated:YES];
switchHud.label.text = msg;
switchHud.detailsLabel.text = info;
});
}
// 显示警告对话框
+ (void)showAlert:(UIAlertController*)alert {
static dispatch_queue_t alertQueue = nil;
static dispatch_once_t oncetoken;
dispatch_once(&oncetoken, ^{
alertQueue = dispatch_queue_create("alertQueue", DISPATCH_QUEUE_SERIAL);
});
dispatch_async(alertQueue, ^{
// 等待当前对话框关闭后再显示新对话框
__block BOOL presenting = NO;
__block BOOL presented = NO;
while(!presenting) {
dispatch_sync(dispatch_get_main_queue(), ^{
UIViewController* vc = UIApplication.sharedApplication.keyWindow.rootViewController;
while(vc.presentedViewController){
vc = vc.presentedViewController;
if(vc.isBeingDismissed) {
return;
}
}
presenting = YES;
[vc presentViewController:alert animated:YES completion:^{ presented=YES; }];
});
if(!presenting) usleep(1000*100);
}
while(!presented) usleep(100*1000);
});
}
@end
引导程序核心 (bootstrap.h)
#ifndef bootstrap_h
#define bootstrap_h
#define BOOTSTRAP_VERSION (5)
#import <Foundation/Foundation.h>
// 重建签名
void rebuildSignature(NSString *directoryPath);
// 执行引导
int bootstrap();
// 取消引导
int unbootstrap();
// 检查引导是否已安装
bool isBootstrapInstalled();
// 检查系统是否已引导
bool isSystemBootstrapped();
// 检查引导版本
bool checkBootstrapVersion();
#endif /* bootstrap_h */
工具函数 (utils.h)
#ifndef utils_h
#define utils_h
#import <Foundation/Foundation.h>
#include "commlib.h"
// 生成随机品牌标识
uint64_t jbrand();
uint64_t jbrand_new();
// 查找jbroot目录
NSString* find_jbroot(BOOL force);
// 检查是否为jbroot名称
int is_jbroot_name(const char* name);
// 获取jbroot路径
const char* jbroot(const char* path);
NSString* __attribute__((overloadable)) jbroot(NSString *path);
// 获取根文件系统前缀
NSString* rootfsPrefix(NSString* path);
// 获取启动会话
NSString* getBootSession();
// 从二进制文件获取团队ID
NSString* getTeamIDFromBinaryAtPath(NSString *binaryPath);
// 应用代理相关接口
@interface LSApplicationProxy : LSBundleProxy
+ (id)applicationProxyForIdentifier:(id)arg1;
- (id)localizedNameForContext:(id)arg1;
- (_LSApplicationState *)appState;
- (NSString *)vendorName;
- (NSString *)teamID;
- (NSString *)applicationType;
- (NSSet *)claimedURLSchemes;
- (BOOL)isDeletable;
- (NSDictionary*)environmentVariables;
@property (nonatomic,readonly) NSDictionary *groupContainerURLs;
@property (nonatomic,readonly) NSArray<LSPlugInKitProxy *> *plugInKitPlugins;
@end
#endif /* utils_h */
构建脚本 (build.sh)
#!/bin/sh
set -e
PREV_DIR=$(pwd)
WORK_DIR=$(dirname -- "$0")
cd "$WORK_DIR"
cd basebin
./build.sh
cd -
rm -rf Bootstrap/basebin
cp -a basebin/.build Bootstrap/basebin
make clean
make package
cd "$PREV_DIR"
Yyu6EekmuPFgFxbc20JRuNGiLT9cAoIcHMFySQXhwtk=