remount.m 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. //
  2. // remount.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 "offsets.h"
  10. #include "common.h"
  11. #include "kernel.h"
  12. #include <sys/mount.h>
  13. #define KSTRUCT_OFFSET_MOUNT_MNT_FLAG 0x70
  14. #define KSTRUCT_OFFSET_VNODE_V_UN 0xd8
  15. kern_return_t do_remount(uint64_t slide) {
  16. //uint64_t _rootnode = OFFSET_ROOT_MOUNT_V_NODE + slide;
  17. uint64_t _rootnode = 0xfffffff0075b40b0 + slide;
  18. uint64_t rootfs_vnode = rk64(_rootnode);
  19. // read flags
  20. uint64_t v_mount = rk64(rootfs_vnode + KSTRUCT_OFFSET_VNODE_V_UN);
  21. uint32_t v_flag = rk32(v_mount + KSTRUCT_OFFSET_MOUNT_MNT_FLAG);
  22. // unset readonly, nosuid
  23. v_flag = v_flag & ~MNT_NOSUID;
  24. v_flag = v_flag & ~MNT_RDONLY;
  25. // write new flags, temporarily unsetting rootfs flag
  26. wk32(v_mount + KSTRUCT_OFFSET_MOUNT_MNT_FLAG, v_flag & ~MNT_ROOTFS);
  27. // remount
  28. char *nmz = strdup("/dev/disk0s1s1");
  29. int lolr = mount("apfs", "/", MNT_UPDATE, (void *)&nmz);
  30. if (lolr == -1) {
  31. LOG("ERROR: could not remount '/'");
  32. return KERN_FAILURE;
  33. }
  34. LOG("successfully remounted '/'");
  35. // set rootfs flag again
  36. v_mount = rk64(rootfs_vnode + KSTRUCT_OFFSET_VNODE_V_UN);
  37. wk32(v_mount + KSTRUCT_OFFSET_MOUNT_MNT_FLAG, v_flag);
  38. return KERN_SUCCESS;
  39. }