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,也许可以。
  • 关于链接
  • 实现目标:点击按钮执行killall -9 SpringBoard,注销SpringBoard

App代码

  • 本案例中使用Xcode新建的项目名称叫RootApp
  • 在Xcode中找到main.m,添加setuid(0),设置uid
    1
    2
    3
    4
    5
    6
    7
    8
    #import <UIKit/UIKit.h>
    #import "AppDelegate.h"
    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
    #import <spawn.h>

    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
  • 至此大功告成