bootstrap.m 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  1. //
  2. // bootstrap.m
  3. // g0blin
  4. //
  5. // Created by Sticktron on 2017-12-27.
  6. // Copyright © 2017 xerub. All rights reserved.
  7. // Copyright © 2017 qwertyoruiop. All rights reserved.
  8. //
  9. #include "common.h"
  10. #include <sys/spawn.h>
  11. #include <sys/stat.h>
  12. #include <copyfile.h>
  13. #include <mach-o/dyld.h>
  14. kern_return_t do_bootstrap(bool force) {
  15. char path[256];
  16. uint32_t size = sizeof(path);
  17. _NSGetExecutablePath(path, &size);
  18. char *pt = realpath(path, 0);
  19. pid_t pd = 0;
  20. NSString* execpath = [[NSString stringWithUTF8String:pt] stringByDeletingLastPathComponent];
  21. int f = open("/.installed_g0blin_rc0", O_RDONLY);
  22. if (f == -1 || force) {
  23. LOG("installing bootstrap...");
  24. NSString* bootstrap = [execpath stringByAppendingPathComponent:@"bootstrap.tar"];
  25. NSString* tar = [execpath stringByAppendingPathComponent:@"tar"];
  26. NSString* launchctl = [execpath stringByAppendingPathComponent:@"launchctl"];
  27. unlink("/bin/tar");
  28. unlink("/bin/launchctl");
  29. copyfile([tar UTF8String], "/bin/tar", 0, COPYFILE_ALL);
  30. chmod("/bin/tar", 0755);
  31. chdir("/");
  32. posix_spawn(&pd, "/bin/tar", 0, 0, (char**)&(const char*[]){"/bin/tar", "--preserve-permissions", "--no-overwrite-dir", "-xvf", [bootstrap UTF8String], NULL}, NULL);
  33. waitpid(pd, 0, 0);
  34. LOG("bootstrap unpacked");
  35. copyfile([launchctl UTF8String], "/bin/launchctl", 0, COPYFILE_ALL);
  36. chmod("/bin/launchctl", 0755);
  37. unlink(".installed_g0blin");
  38. open("/.installed_g0blin_rc0", O_RDWR|O_CREAT);
  39. open("/.cydia_no_stash", O_RDWR|O_CREAT);
  40. // run Cydia install scripts
  41. {
  42. char *name = "/var/lib/dpkg/info/base.extrainst_";
  43. posix_spawn(&pd, name, 0, 0, (char**)&(const char*[]){name, NULL}, NULL);
  44. waitpid(pd, 0, 0);
  45. name = "/var/lib/dpkg/info/com.saurik.patcyh.extrainst_";
  46. posix_spawn(&pd, name, 0, 0, (char**)&(const char*[]){name, NULL}, NULL);
  47. waitpid(pd, 0, 0);
  48. name = "/var/lib/dpkg/info/firmware-sbin.extrainst_";
  49. posix_spawn(&pd, name, 0, 0, (char**)&(const char*[]){name, NULL}, NULL);
  50. waitpid(pd, 0, 0);
  51. name = "/var/lib/dpkg/info/uikittools.extrainst_";
  52. posix_spawn(&pd, name, 0, 0, (char**)&(const char*[]){name, NULL}, NULL);
  53. waitpid(pd, 0, 0);
  54. }
  55. LOG("ran Cydia extrainst scripts");
  56. // block some Apple IPs
  57. posix_spawn(&pd, "/bin/bash", 0, 0, (char**)&(const char*[]){"/bin/bash", "-c", """echo '127.0.0.1 iphonesubmissions.apple.com' >> /etc/hosts""", NULL}, NULL);
  58. posix_spawn(&pd, "/bin/bash", 0, 0, (char**)&(const char*[]){"/bin/bash", "-c", """echo '127.0.0.1 radarsubmissions.apple.com' >> /etc/hosts""", NULL}, NULL);
  59. posix_spawn(&pd, "/bin/bash", 0, 0, (char**)&(const char*[]){"/bin/bash", "-c", """echo '127.0.0.1 mesu.apple.com' >> /etc/hosts""", NULL}, NULL);
  60. posix_spawn(&pd, "/bin/bash", 0, 0, (char**)&(const char*[]){"/bin/bash", "-c", """echo '127.0.0.1 appldnld.apple.com' >> /etc/hosts""", NULL}, NULL);
  61. LOG("modified hosts file");
  62. // set SBShowNonDefaultSystemApps = YES so we can see Cydia (TODO: set via cfprefsd instead?)
  63. posix_spawn(&pd, "killall", 0, 0, (char**)&(const char*[]){"killall", "-SIGSTOP", "cfprefsd", NULL}, NULL);
  64. NSMutableDictionary *plist = [[NSMutableDictionary alloc] initWithContentsOfFile:@"/var/mobile/Library/Preferences/com.apple.springboard.plist"];
  65. [plist setObject:[NSNumber numberWithBool:YES] forKey:@"SBShowNonDefaultSystemApps"];
  66. [plist writeToFile:@"/var/mobile/Library/Preferences/com.apple.springboard.plist" atomically:YES];
  67. posix_spawn(&pd, "killall", 0, 0, (char**)&(const char*[]){"killall", "-9", "cfprefsd", NULL}, NULL);
  68. LOG("modified com.apple.springboard.plist");
  69. // rebuild icon cache
  70. LOG("uicache...");
  71. posix_spawn(&pd, "/usr/bin/uicache", 0, 0, (char**)&(const char*[]){"/usr/bin/uicache", NULL}, NULL);
  72. waitpid(pd, 0, 0);
  73. LOG("finished installing bootstrap");
  74. }
  75. LOG("bootstrap ready");
  76. // copy reload
  77. NSString *reload = [execpath stringByAppendingPathComponent:@"reload"];
  78. unlink("/usr/libexec/reload");
  79. copyfile([reload UTF8String], "/usr/libexec/reload", 0, COPYFILE_ALL);
  80. chmod("/usr/libexec/reload", 0755);
  81. chown("/usr/libexec/reload", 0, 0);
  82. // copy 0.reload.plist
  83. NSString *reloadPlist = [execpath stringByAppendingPathComponent:@"0.reload.plist"];
  84. unlink("/Library/LaunchDaemons/0.reload.plist");
  85. copyfile([reloadPlist UTF8String], "/Library/LaunchDaemons/0.reload.plist", 0, COPYFILE_ALL);
  86. chmod("/Library/LaunchDaemons/0.reload.plist", 0644);
  87. chown("/Library/LaunchDaemons/0.reload.plist", 0, 0);
  88. // copy dropbear.plist
  89. NSString *dropbearPlist = [execpath stringByAppendingPathComponent:@"dropbear.plist"];
  90. unlink("/Library/LaunchDaemons/dropbear.plist");
  91. copyfile([dropbearPlist UTF8String], "/Library/LaunchDaemons/dropbear.plist", 0, COPYFILE_ALL);
  92. chmod("/Library/LaunchDaemons/dropbear.plist", 0644);
  93. chown("/Library/LaunchDaemons/dropbear.plist", 0, 0);
  94. // stop SU daemon
  95. unlink("/System/Library/LaunchDaemons/com.apple.mobile.softwareupdated.plist");
  96. // update permissions
  97. chmod("/private", 0777);
  98. chmod("/private/var", 0777);
  99. chmod("/private/var/mobile", 0777);
  100. chmod("/private/var/mobile/Library", 0777);
  101. chmod("/private/var/mobile/Library/Preferences", 0777);
  102. // kill OTA updater
  103. pid_t pid;
  104. unlink("/var/MobileAsset/Assets/com_apple_MobileAsset_SoftwareUpdate");
  105. posix_spawn(&pid, "touch", 0, 0, (char**)&(const char*[]){"touch", "/var/MobileAsset/Assets/com_apple_MobileAsset_SoftwareUpdate", NULL}, NULL);
  106. chmod("/var/MobileAsset/Assets/com_apple_MobileAsset_SoftwareUpdate", 000);
  107. chown("/var/MobileAsset/Assets/com_apple_MobileAsset_SoftwareUpdate", 0, 0);
  108. LOG("killed OTA updater");
  109. LOG("bootstrapped");
  110. return KERN_SUCCESS; // TODO: handle errors?
  111. }