Unc0ver 越狱会导出必要的偏移量,以获得tfp0 (task_for_pid(0)) 或内核任务端口。使用这些,您可以在内核内存中修补您自己的凭据。举个例子吧。
Unc0ver Jailbreak 将包括kernel task port 在内的偏移量存储在此路径的文件中:/var/offsets.plist。确保在越狱前切换 Unc0ver 设置中的“导出 TFP0”。
一旦越狱,解析偏移文件,每个文件都有自己的变量。
对于tfp0 变量,您需要将其设为task_port_t 类型。 kernel_slide 和 kernel_base 是默认的 uint64_t。
从plist 解析它们后,您需要执行以下操作以从HSP4 (Host Special Port #4) 获取有效的tfp0,其中Unc0ver 为您设置,以便您可以获取tfp0 并提升您自己的权限.
这里有一些示例代码:
task_port_t tfp0 = null;
kern_return_t ret = host_get_special_port(mach_host_self(), HOST_LOCAL_NODE, 4, &tfp0);
printf("Task FOR PID: 0x%x\n", tfp0);
这基本上将为您提供真正的内核任务端口。
此时,您可以按照 GeoSn0w 的指南了解如何将自己的权限提升到root,以及如何转义sandbox。指南和补丁可以在他的Jailbreak Development forum 上找到,但我会在这里添加它们以防万一。
获取root权限,根据GeoSn0w:
uint64_t selfProc = findOurselves();
uint64_t creds = kernel_read64(selfProc + off_p_ucred);
// GID
kernel_write32(selfProc + off_p_gid, 0);
kernel_write32(selfProc + off_p_rgid, 0);
kernel_write32(creds + off_ucred_cr_rgid, 0);
kernel_write32(creds + off_ucred_cr_svgid, 0);
printf("[i] STILL HERE!!!!\n");
// UID
creds = kernel_read64(selfProc + off_p_ucred);
kernel_write32(selfProc + off_p_uid, 0);
kernel_write32(selfProc + off_p_ruid, 0);
kernel_write32(creds + off_ucred_cr_uid, 0);
kernel_write32(creds + off_ucred_cr_ruid, 0);
kernel_write32(creds + off_ucred_cr_svuid, 0);
printf("[i] Set UID = 0\n");
kernel_write32、kernel_write64、kernel_read32 和 kernel_read64 通常是在 Google Project Zero 漏洞利用中发现的原语。您需要将它们导入到您的程序中,以便您可以调用它们。 They can be found on GitHub,但它们只是对mach_vm_read_overwrite(...)和mach_vm_write(...)等系统函数的封装。
就是这样。那时,您应该已将您的权限升级为 root。当然,你需要重新实现很多越狱功能,比如前面提到的内核读写原语,你需要Unc0ver的偏移量,你还需要一个偏移量表,比如off_ucred_cr_ruid,off_p_gid等从 iOS 版本更改为 iOS 版本。
只需进行调整并由Cydia 安装它会更容易。 Cydia Substrate 会为您提供rootify。