main.m 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. #import <Foundation/Foundation.h>
  2. #include <stdio.h>
  3. #include <mach/mach.h>
  4. #include <mach/error.h>
  5. #include <string.h>
  6. #include <unistd.h>
  7. #include "helpers/patchfinder64.h"
  8. #include "kern_utils.h"
  9. #include "helpers/kmem.h"
  10. #include "helpers/kexecute.h"
  11. #include "mach/jailbreak_daemonServer.h"
  12. #define PROC_PIDPATHINFO_MAXSIZE (4 * MAXPATHLEN)
  13. int proc_pidpath(pid_t pid, void *buffer, uint32_t buffersize);
  14. typedef boolean_t (*dispatch_mig_callback_t)(mach_msg_header_t *message, mach_msg_header_t *reply);
  15. mach_msg_return_t dispatch_mig_server(dispatch_source_t ds, size_t maxmsgsz, dispatch_mig_callback_t callback);
  16. kern_return_t bootstrap_check_in(mach_port_t bootstrap_port, const char *service, mach_port_t *server_port);
  17. #define JAILBREAKD_COMMAND_ENTITLE 1
  18. #define JAILBREAKD_COMMAND_ENTITLE_AND_SIGCONT 2
  19. #define JAILBREAKD_COMMAND_ENTITLE_AND_SIGCONT_FROM_XPCPROXY 3
  20. #define JAILBREAKD_COMMAND_FIXUP_SETUID 4
  21. mach_port_t tfpzero;
  22. uint64_t kernel_base;
  23. uint64_t kernel_slide;
  24. #define MEMORYSTATUS_CMD_SET_JETSAM_TASK_LIMIT 6
  25. int memorystatus_control(uint32_t command, int32_t pid, uint32_t flags, void *buffer, size_t buffersize);
  26. int remove_memory_limit(void) {
  27. return memorystatus_control(MEMORYSTATUS_CMD_SET_JETSAM_TASK_LIMIT, getpid(), 0, NULL, 0);
  28. }
  29. int is_valid_command(uint8_t command) {
  30. return (command == JAILBREAKD_COMMAND_ENTITLE ||
  31. command == JAILBREAKD_COMMAND_ENTITLE_AND_SIGCONT ||
  32. command == JAILBREAKD_COMMAND_ENTITLE_AND_SIGCONT_FROM_XPCPROXY ||
  33. command == JAILBREAKD_COMMAND_FIXUP_SETUID);
  34. }
  35. int handle_command(uint8_t command, uint32_t pid) {
  36. if (!is_valid_command(command)) {
  37. NSLog(@"Invalid command recieved.");
  38. return 1;
  39. }
  40. char *name = proc_name(pid);
  41. if (command == JAILBREAKD_COMMAND_ENTITLE) {
  42. NSLog(@"JAILBREAKD_COMMAND_ENTITLE PID: %d NAME: %s", pid, name);
  43. setcsflagsandplatformize(pid);
  44. }
  45. if (command == JAILBREAKD_COMMAND_ENTITLE_AND_SIGCONT) {
  46. NSLog(@"JAILBREAKD_COMMAND_ENTITLE_AND_SIGCONT PID: %d NAME: %s", pid, name);
  47. setcsflagsandplatformize(pid);
  48. kill(pid, SIGCONT);
  49. }
  50. if (command == JAILBREAKD_COMMAND_ENTITLE_AND_SIGCONT_FROM_XPCPROXY) {
  51. NSLog(@"JAILBREAKD_COMMAND_ENTITLE_AND_SIGCONT_FROM_XPCPROXY PID: %d NAME: %s", pid, name);
  52. __block int blk_pid = pid;
  53. dispatch_queue_t queue = dispatch_queue_create("org.coolstar.jailbreakd.delayqueue", NULL);
  54. dispatch_async(queue, ^{
  55. char pathbuf[PROC_PIDPATHINFO_MAXSIZE];
  56. bzero(pathbuf, sizeof(pathbuf));
  57. int ret = proc_pidpath(blk_pid, pathbuf, sizeof(pathbuf));
  58. while (ret > 0 && strcmp(pathbuf, "/usr/libexec/xpcproxy") == 0) {
  59. proc_pidpath(blk_pid, pathbuf, sizeof(pathbuf));
  60. usleep(100);
  61. }
  62. setcsflagsandplatformize(blk_pid);
  63. kill(blk_pid, SIGCONT);
  64. });
  65. dispatch_release(queue);
  66. }
  67. if (command == JAILBREAKD_COMMAND_FIXUP_SETUID) {
  68. NSLog(@"JAILBREAKD_FIXUP_SETUID PID: %d NAME: %s (ignored)", pid, name);
  69. }
  70. free(name);
  71. return 0;
  72. }
  73. kern_return_t jbd_call(mach_port_t server_port, uint8_t command, uint32_t pid) {
  74. return (handle_command(command, pid) == 0) ? KERN_SUCCESS : KERN_FAILURE;
  75. }
  76. int main(int argc, char **argv, char **envp) {
  77. kern_return_t err;
  78. NSLog(@"start");
  79. unlink("/var/tmp/jailbreakd.pid");
  80. kernel_base = strtoull(getenv("KernelBase"), NULL, 16);
  81. kernprocaddr = strtoull(getenv("KernProcAddr"), NULL, 16);
  82. offset_zonemap = strtoull(getenv("ZoneMapOffset"), NULL, 16);
  83. kernel_slide = kernel_base - 0xFFFFFFF007004000;
  84. remove_memory_limit();
  85. err = host_get_special_port(mach_host_self(), HOST_LOCAL_NODE, 4, &tfpzero);
  86. if (err != KERN_SUCCESS) {
  87. NSLog(@"host_get_special_port 4: %s", mach_error_string(err));
  88. return -1;
  89. }
  90. init_kernel(kernel_base, NULL);
  91. init_kexecute();
  92. NSLog(@"[jailbreakd] tfp: 0x%016llx", (uint64_t)tfpzero);
  93. NSLog(@"[jailbreakd] slide: 0x%016llx", kernel_slide);
  94. NSLog(@"[jailbreakd] kernproc: 0x%016llx", kernprocaddr);
  95. NSLog(@"[jailbreakd] zonemap: 0x%016llx", offset_zonemap);
  96. // set up mach stuff
  97. mach_port_t server_port;
  98. if ((err = bootstrap_check_in(bootstrap_port, "zone.sparkes.jailbreakd", &server_port))) {
  99. NSLog(@"Failed to check in: %s", mach_error_string(err));
  100. return -1;
  101. }
  102. dispatch_source_t server = dispatch_source_create(DISPATCH_SOURCE_TYPE_MACH_RECV, server_port, 0, dispatch_get_main_queue());
  103. dispatch_source_set_event_handler(server, ^{
  104. dispatch_mig_server(server, jbd_jailbreak_daemon_subsystem.maxsize, jailbreak_daemon_server);
  105. });
  106. dispatch_resume(server);
  107. // Now ready for connections!
  108. NSLog(@"mach server now running!");
  109. FILE *f = fopen("/var/tmp/jailbreakd.pid", "w");
  110. fprintf(f, "%d\n", getpid());
  111. fclose(f);
  112. // Start accepting connections
  113. dispatch_main();
  114. term_kexecute();
  115. return 0;
  116. }