|
@@ -12,33 +12,26 @@
|
|
|
#include "kernel.h"
|
|
#include "kernel.h"
|
|
|
#include <sys/mount.h>
|
|
#include <sys/mount.h>
|
|
|
|
|
|
|
|
-
|
|
|
|
|
#define KSTRUCT_OFFSET_MOUNT_MNT_FLAG 0x70
|
|
#define KSTRUCT_OFFSET_MOUNT_MNT_FLAG 0x70
|
|
|
#define KSTRUCT_OFFSET_VNODE_V_UN 0xd8
|
|
#define KSTRUCT_OFFSET_VNODE_V_UN 0xd8
|
|
|
|
|
|
|
|
-
|
|
|
|
|
kern_return_t do_remount(uint64_t slide) {
|
|
kern_return_t do_remount(uint64_t slide) {
|
|
|
-
|
|
|
|
|
- // feat. nosuid patch by coolstar
|
|
|
|
|
-
|
|
|
|
|
uint64_t _rootnode = OFFSET_ROOT_MOUNT_V_NODE + slide;
|
|
uint64_t _rootnode = OFFSET_ROOT_MOUNT_V_NODE + slide;
|
|
|
uint64_t rootfs_vnode = rk64(_rootnode);
|
|
uint64_t rootfs_vnode = rk64(_rootnode);
|
|
|
|
|
|
|
|
// read flags
|
|
// read flags
|
|
|
uint64_t v_mount = rk64(rootfs_vnode + KSTRUCT_OFFSET_VNODE_V_UN);
|
|
uint64_t v_mount = rk64(rootfs_vnode + KSTRUCT_OFFSET_VNODE_V_UN);
|
|
|
-// uint32_t v_flag = rk32(v_mount + KSTRUCT_OFFSET_MOUNT_MNT_FLAG + 1);
|
|
|
|
|
uint32_t v_flag = rk32(v_mount + KSTRUCT_OFFSET_MOUNT_MNT_FLAG);
|
|
uint32_t v_flag = rk32(v_mount + KSTRUCT_OFFSET_MOUNT_MNT_FLAG);
|
|
|
|
|
+
|
|
|
|
|
+ // unset readonly, nosuid
|
|
|
v_flag = v_flag & ~MNT_NOSUID;
|
|
v_flag = v_flag & ~MNT_NOSUID;
|
|
|
v_flag = v_flag & ~MNT_RDONLY;
|
|
v_flag = v_flag & ~MNT_RDONLY;
|
|
|
|
|
|
|
|
-
|
|
|
|
|
- // unset rootfs flag
|
|
|
|
|
-// wk32(v_mount + KSTRUCT_OFFSET_MOUNT_MNT_FLAG + 1, v_flag & (~(0x1<<6)));
|
|
|
|
|
|
|
+ // write new flags, temporarily unsetting rootfs flag
|
|
|
wk32(v_mount + KSTRUCT_OFFSET_MOUNT_MNT_FLAG, v_flag & ~MNT_ROOTFS);
|
|
wk32(v_mount + KSTRUCT_OFFSET_MOUNT_MNT_FLAG, v_flag & ~MNT_ROOTFS);
|
|
|
|
|
|
|
|
// remount
|
|
// remount
|
|
|
char *nmz = strdup("/dev/disk0s1s1");
|
|
char *nmz = strdup("/dev/disk0s1s1");
|
|
|
-// int lolr = mount("hfs", "/", MNT_UPDATE, (void *)&nmz);
|
|
|
|
|
int lolr = mount("apfs", "/", MNT_UPDATE, (void *)&nmz);
|
|
int lolr = mount("apfs", "/", MNT_UPDATE, (void *)&nmz);
|
|
|
if (lolr == -1) {
|
|
if (lolr == -1) {
|
|
|
LOG("ERROR: could not remount '/'");
|
|
LOG("ERROR: could not remount '/'");
|
|
@@ -46,10 +39,9 @@ kern_return_t do_remount(uint64_t slide) {
|
|
|
}
|
|
}
|
|
|
LOG("successfully remounted '/'");
|
|
LOG("successfully remounted '/'");
|
|
|
|
|
|
|
|
- // set original flags back
|
|
|
|
|
|
|
+ // set rootfs flag again
|
|
|
v_mount = rk64(rootfs_vnode + KSTRUCT_OFFSET_VNODE_V_UN);
|
|
v_mount = rk64(rootfs_vnode + KSTRUCT_OFFSET_VNODE_V_UN);
|
|
|
-// wk32(v_mount + KSTRUCT_OFFSET_MOUNT_MNT_FLAG + 1, v_flag);
|
|
|
|
|
wk32(v_mount + KSTRUCT_OFFSET_MOUNT_MNT_FLAG, v_flag);
|
|
wk32(v_mount + KSTRUCT_OFFSET_MOUNT_MNT_FLAG, v_flag);
|
|
|
-
|
|
|
|
|
|
|
+
|
|
|
return KERN_SUCCESS;
|
|
return KERN_SUCCESS;
|
|
|
}
|
|
}
|