|
@@ -10,6 +10,23 @@
|
|
|
#include "helpers/kexecute.h"
|
|
#include "helpers/kexecute.h"
|
|
|
#include "mach/jailbreak_daemonServer.h"
|
|
#include "mach/jailbreak_daemonServer.h"
|
|
|
|
|
|
|
|
|
|
+//more stuff from electra jailbreakd
|
|
|
|
|
+
|
|
|
|
|
+#define CS_OPS_STATUS 0 /* return status */
|
|
|
|
|
+
|
|
|
|
|
+#define CS_GET_TASK_ALLOW 0x0000004 /* has get-task-allow entitlement */
|
|
|
|
|
+#define CS_INSTALLER 0x0000008 /* has installer entitlement */
|
|
|
|
|
+
|
|
|
|
|
+#define CS_HARD 0x0000100 /* don't load invalid pages */
|
|
|
|
|
+#define CS_KILL 0x0000200 /* kill process if it becomes invalid */
|
|
|
|
|
+#define CS_RESTRICT 0x0000800 /* tell dyld to treat restricted */
|
|
|
|
|
+
|
|
|
|
|
+#define CS_PLATFORM_BINARY 0x4000000 /* this is a platform binary */
|
|
|
|
|
+
|
|
|
|
|
+#define CS_DEBUGGED 0x10000000 /* process is currently or has previously been debugged and allowed to run with invalid pages */
|
|
|
|
|
+
|
|
|
|
|
+int csops(pid_t pid, unsigned int ops, void * useraddr, size_t usersize);
|
|
|
|
|
+
|
|
|
#define PROC_PIDPATHINFO_MAXSIZE (4 * MAXPATHLEN)
|
|
#define PROC_PIDPATHINFO_MAXSIZE (4 * MAXPATHLEN)
|
|
|
int proc_pidpath(pid_t pid, void *buffer, uint32_t buffersize);
|
|
int proc_pidpath(pid_t pid, void *buffer, uint32_t buffersize);
|
|
|
|
|
|
|
@@ -22,6 +39,8 @@ kern_return_t bootstrap_check_in(mach_port_t bootstrap_port, const char *service
|
|
|
#define JAILBREAKD_COMMAND_ENTITLE_AND_SIGCONT_FROM_XPCPROXY 3
|
|
#define JAILBREAKD_COMMAND_ENTITLE_AND_SIGCONT_FROM_XPCPROXY 3
|
|
|
#define JAILBREAKD_COMMAND_FIXUP_SETUID 4
|
|
#define JAILBREAKD_COMMAND_FIXUP_SETUID 4
|
|
|
|
|
|
|
|
|
|
+#define JAILBREAKDDEBUG 1
|
|
|
|
|
+
|
|
|
mach_port_t tfpzero;
|
|
mach_port_t tfpzero;
|
|
|
uint64_t kernel_base;
|
|
uint64_t kernel_base;
|
|
|
uint64_t kernel_slide;
|
|
uint64_t kernel_slide;
|
|
@@ -58,7 +77,56 @@ int handle_command(uint8_t command, uint32_t pid) {
|
|
|
setcsflagsandplatformize(pid);
|
|
setcsflagsandplatformize(pid);
|
|
|
kill(pid, SIGCONT);
|
|
kill(pid, SIGCONT);
|
|
|
}
|
|
}
|
|
|
-
|
|
|
|
|
|
|
+ if (command == JAILBREAKD_COMMAND_ENTITLE_AND_SIGCONT_FROM_XPCPROXY) {
|
|
|
|
|
+#ifdef JAILBREAKDDEBUG
|
|
|
|
|
+ fprintf(stderr,"JAILBREAKD_COMMAND_ENTITLE_AND_SIGCONT_FROM_XPCPROXY PID: %d\n", pid);
|
|
|
|
|
+#endif
|
|
|
|
|
+ __block int PID = pid;
|
|
|
|
|
+
|
|
|
|
|
+ dispatch_queue_t queue = dispatch_queue_create("org.coolstar.jailbreakd.delayqueue", NULL);
|
|
|
|
|
+ dispatch_async(queue, ^{
|
|
|
|
|
+ char pathbuf[PROC_PIDPATHINFO_MAXSIZE];
|
|
|
|
|
+ bzero(pathbuf, sizeof(pathbuf));
|
|
|
|
|
+
|
|
|
|
|
+ int tries = 0;
|
|
|
|
|
+ int ret = proc_pidpath(PID, pathbuf, sizeof(pathbuf));
|
|
|
|
|
+ while (ret > 0 && strcmp(pathbuf, "/usr/libexec/xpcproxy") == 0 && tries < 5000){
|
|
|
|
|
+ proc_pidpath(PID, pathbuf, sizeof(pathbuf));
|
|
|
|
|
+ usleep(100);
|
|
|
|
|
+ tries++;
|
|
|
|
|
+ }
|
|
|
|
|
+ if (tries >= 5000){
|
|
|
|
|
+ fprintf(stderr, "Warning: xpcproxy timer timed out for PID %d\n", pid);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ uint32_t flags;
|
|
|
|
|
+ csops(pid, CS_OPS_STATUS, &flags, 0);
|
|
|
|
|
+#ifdef JAILBREAKDDEBUG
|
|
|
|
|
+ fprintf(stderr, "Waiting for CSFlags to reset for PID %d...\n", pid);
|
|
|
|
|
+#endif
|
|
|
|
|
+
|
|
|
|
|
+ tries = 0;
|
|
|
|
|
+ while ((flags & (CS_PLATFORM_BINARY | CS_INSTALLER | CS_GET_TASK_ALLOW | CS_DEBUGGED)) != 0 &&
|
|
|
|
|
+ (flags & (CS_RESTRICT | CS_HARD | CS_KILL)) == 0 &&
|
|
|
|
|
+ tries < 5000){
|
|
|
|
|
+ csops(pid, CS_OPS_STATUS, &flags, 0);
|
|
|
|
|
+ usleep(100);
|
|
|
|
|
+ tries++;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ if (tries >= 5000){
|
|
|
|
|
+ fprintf(stderr, "Warning: CSFlag timer timed out for PID %d\n", pid);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ setcsflagsandplatformize(PID);
|
|
|
|
|
+ kill(PID, SIGCONT);
|
|
|
|
|
+#ifdef JAILBREAKDDEBUG
|
|
|
|
|
+ fprintf(stderr,"Called SIGCONT on pid %d from ENTITLE_AND_SIGCONT_FROM_XPCPROXY\n", PID);
|
|
|
|
|
+#endif
|
|
|
|
|
+ });
|
|
|
|
|
+ dispatch_release(queue);
|
|
|
|
|
+ }
|
|
|
|
|
+ /*
|
|
|
if (command == JAILBREAKD_COMMAND_ENTITLE_AND_SIGCONT_FROM_XPCPROXY) {
|
|
if (command == JAILBREAKD_COMMAND_ENTITLE_AND_SIGCONT_FROM_XPCPROXY) {
|
|
|
NSLog(@"JAILBREAKD_COMMAND_ENTITLE_AND_SIGCONT_FROM_XPCPROXY PID: %d NAME: %s", pid, name);
|
|
NSLog(@"JAILBREAKD_COMMAND_ENTITLE_AND_SIGCONT_FROM_XPCPROXY PID: %d NAME: %s", pid, name);
|
|
|
__block int blk_pid = pid;
|
|
__block int blk_pid = pid;
|
|
@@ -79,9 +147,10 @@ int handle_command(uint8_t command, uint32_t pid) {
|
|
|
});
|
|
});
|
|
|
dispatch_release(queue);
|
|
dispatch_release(queue);
|
|
|
}
|
|
}
|
|
|
-
|
|
|
|
|
|
|
+ */
|
|
|
if (command == JAILBREAKD_COMMAND_FIXUP_SETUID) {
|
|
if (command == JAILBREAKD_COMMAND_FIXUP_SETUID) {
|
|
|
- NSLog(@"JAILBREAKD_FIXUP_SETUID PID: %d NAME: %s (ignored)", pid, name);
|
|
|
|
|
|
|
+ NSLog(@"JAILBREAKD_FIXUP_SETUID PID: %d NAME: %s", pid, name);
|
|
|
|
|
+ fixupsetuid(pid);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
free(name);
|
|
free(name);
|