Run an App as root on iOS11 and iOS12 with Xcode
注意事项
- 测试环境
- macOS: 10.14.6
- iPhoneOS: iOS11.0、iOS12.0、
- iPhone机型:两个iPhone6
- 越狱工具:unc0ver3.6.2
- 没有测试:iOS13和iOS10,也许可以。
- 关于链接
- 阅读本文前,请首先阅读 RunAppAsRootForTheos理论部分
- 此文使用Xcode新建的App,如果使用Theos新建的App,请转入RunAppAsRootForTheos
- 实现目标:点击按钮执行
killall -9 SpringBoard
,注销SpringBoard
App代码
- 本案例中使用Xcode新建的项目名称叫RootApp
- 在Xcode中找到main.m,添加
setuid(0)
,设置uid1
2
3
4
5
6
7
8
int main(int argc, char * argv[]) {
@autoreleasepool {
setuid(0);
return UIApplicationMain(argc, argv, nil, NSStringFromClass([ AppDelegate class]));
}
} - 点击动作相关的代码如下
1
2
3
4
5
6
7
8
9
10
11
12
13
14
int spawn(const char* executable, ...) {
int ret;
pid_t pid;
va_list args;
va_start(args, executable);
ret = posix_spawn(&pid, executable, NULL, NULL, (char* const *)args, NULL);
if (ret == 0) waitpid(pid, NULL, 0);
return ret;
}
- (IBAction)stop:(id)sender {
NSLog(@"RootAppTest: %d, %d, %d", getuid(), geteuid(), spawn("/usr/bin/killall", "/usr/bin/killall", "-9", "SpringBoard", NULL));
} - 代码写完后,进行编译,编译完成后把RootApp.app放入iPhone上的/Applications里面
运行App
- SSH登录iPhone,执行以下命令,要不然看不到App图标
1
~ root# uicache
- 更改二进制文件权限,要不然App不能启动
1
~ root# chmod 755 /Applications/RootApp.app/RootApp
- 至此App可以成功打开
设置euid
- 点击按钮并不会注销SpringBoard,打印uid和euid都为501而不是0
1
RootAppTest: 501, 501, 1
- 为RootApp文件设置euid
1
~ root# chmod u+s /Applications/RootApp.app/RootApp
- 执行
killall -9 SpringBoard
,然后重新打开App,点击按钮,这个时候打印出来uid和euid为0 - 虽然uid和euid为0但是不能注销SpringBoard,因为需要
可执行文件签权
可执行文件签权
- 新建RootApp.entitlements文件,内容为
1
2
3
4
5
6
7
8
9
10
11
12<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs /PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>com.apple.private.security.no-container</key>
<true/>
<key>com.apple.private.skip-library-validation</key>
<true/>
<key>platform-application</key>
<true/>
</dict>
</plist> - 通过iFunBox上传到iPhone,然后签权
1
ldid -S/RootApp.entitlements /Applications/RootApp.app/RootApp
- 执行
killall -9 SpringBoard
,重新打开App,点击按钮会注销SpringBoard - 至此大功告成