Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Contribute to GitLab
Sign in / Register
Toggle navigation
M
Magisk
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Administrator
Magisk
Commits
e0a28158
Commit
e0a28158
authored
Apr 12, 2020
by
topjohnwu
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Preparation for dynamic tmpfs path
parent
d739dcac
Expand all
Show whitespace changes
Inline
Side-by-side
Showing
13 changed files
with
289 additions
and
258 deletions
+289
-258
Android.mk
native/jni/Android.mk
+1
-0
bootstages.cpp
native/jni/core/bootstages.cpp
+117
-110
daemon.cpp
native/jni/core/daemon.cpp
+20
-6
magisk.cpp
native/jni/core/magisk.cpp
+5
-3
restorecon.cpp
native/jni/core/restorecon.cpp
+6
-9
socket.cpp
native/jni/core/socket.cpp
+1
-4
daemon.hpp
native/jni/include/daemon.hpp
+3
-21
magisk.hpp
native/jni/include/magisk.hpp
+11
-7
socket.hpp
native/jni/include/socket.hpp
+21
-0
init.hpp
native/jni/init/init.hpp
+24
-15
mount.cpp
native/jni/init/mount.cpp
+37
-6
rootdir.cpp
native/jni/init/rootdir.cpp
+34
-61
twostage.cpp
native/jni/init/twostage.cpp
+9
-16
No files found.
native/jni/Android.mk
View file @
e0a28158
...
...
@@ -61,6 +61,7 @@ LOCAL_SRC_FILES := \
init/rootdir.cpp \
init/getinfo.cpp \
init/twostage.cpp \
core/socket.cpp \
magiskpolicy/api.cpp \
magiskpolicy/magiskpolicy.cpp \
magiskpolicy/rules.cpp \
...
...
native/jni/core/bootstages.cpp
View file @
e0a28158
This diff is collapsed.
Click to expand it.
native/jni/core/daemon.cpp
View file @
e0a28158
...
...
@@ -4,6 +4,7 @@
#include <string.h>
#include <pthread.h>
#include <signal.h>
#include <libgen.h>
#include <sys/un.h>
#include <sys/types.h>
#include <sys/mount.h>
...
...
@@ -16,8 +17,11 @@
#include <resetprop.hpp>
#include <flags.h>
using
namespace
std
;
int
SDK_INT
=
-
1
;
bool
RECOVERY_MODE
=
false
;
string
MAGISKTMP
;
static
struct
stat
self_st
;
static
void
verify_client
(
int
client
,
pid_t
pid
)
{
...
...
@@ -91,6 +95,10 @@ static void *request_handler(void *args) {
}
close
(
client
);
break
;
case
GET_PATH
:
write_string
(
client
,
MAGISKTMP
.
data
());
close
(
client
);
break
;
default:
close
(
client
);
break
;
...
...
@@ -114,11 +122,19 @@ static void main_daemon() {
setsid
();
setcon
(
"u:r:"
SEPOL_PROC_DOMAIN
":s0"
);
// Get self stat
char
path
[
4096
];
xreadlink
(
"/proc/self/exe"
,
path
,
sizeof
(
path
));
MAGISKTMP
=
dirname
(
path
);
xstat
(
"/proc/self/exe"
,
&
self_st
);
restore_rootcon
();
// Unmount pre-init patches
if
(
access
(
ROOTMNT
,
F_OK
)
==
0
)
{
file_readline
(
true
,
ROOTMNT
,
[](
auto
line
)
->
bool
{
auto
mount_list
=
MAGISKTMP
+
"/"
ROOTMNT
;
if
(
access
(
mount_list
.
data
(),
F_OK
)
==
0
)
{
file_readline
(
true
,
mount_list
.
data
(),
[](
string_view
line
)
->
bool
{
umount2
(
line
.
data
(),
MNT_DETACH
);
return
true
;
});
...
...
@@ -126,9 +142,6 @@ static void main_daemon() {
LOGI
(
NAME_WITH_VER
(
Magisk
)
" daemon started
\n
"
);
// Get server stat
stat
(
"/proc/self/exe"
,
&
self_st
);
// Get API level
parse_prop_file
(
"/system/build.prop"
,
[](
auto
key
,
auto
val
)
->
bool
{
if
(
key
==
"ro.build.version.sdk"
)
{
...
...
@@ -148,7 +161,8 @@ static void main_daemon() {
}
// Load config status
parse_prop_file
(
MAGISKTMP
"/config"
,
[](
auto
key
,
auto
val
)
->
bool
{
auto
config
=
MAGISKTMP
+
"/"
INTLROOT
"/config"
;
parse_prop_file
(
config
.
data
(),
[](
auto
key
,
auto
val
)
->
bool
{
if
(
key
==
"RECOVERYMODE"
&&
val
==
"true"
)
RECOVERY_MODE
=
true
;
return
true
;
...
...
native/jni/core/magisk.cpp
View file @
e0a28158
...
...
@@ -37,7 +37,7 @@ Advanced Options (Internal APIs):
--clone-attr SRC DEST clone permission, owner, and selinux context
--clone SRC DEST clone SRC to DEST
--sqlite SQL exec SQL commands to Magisk database
--path print
internal
tmpfs mount path
--path print
Magisk
tmpfs mount path
Available applets:
)EOF"
);
...
...
@@ -116,8 +116,10 @@ int magisk_main(int argc, char *argv[]) {
write_int
(
fd
,
REMOVE_MODULES
);
return
read_int
(
fd
);
}
else
if
(
argv
[
1
]
==
"--path"
sv
)
{
// TODO: hardcode /sbin for now, actual logic will be used for Android 11
printf
(
"/sbin
\n
"
);
int
fd
=
connect_daemon
();
write_int
(
fd
,
GET_PATH
);
char
*
path
=
read_string
(
fd
);
printf
(
"%s
\n
"
,
path
);
return
0
;
}
#if 0
...
...
native/jni/core/restorecon.cpp
View file @
e0a28158
...
...
@@ -81,20 +81,17 @@ void restorecon() {
}
void
restore_rootcon
()
{
setfilecon
(
"/sbin"
,
ROOT_CON
);
setfilecon
(
MAGISKTMP
,
ROOT_CON
);
setfilecon
(
MIRRDIR
,
ROOT_CON
);
setfilecon
(
BLOCKDIR
,
ROOT_CON
);
setfilecon
(
MAGISKTMP
.
data
(),
ROOT_CON
);
auto
dir
=
xopen_dir
(
"/sbin"
);
auto
dir
=
xopen_dir
(
MAGISKTMP
.
data
()
);
int
dfd
=
dirfd
(
dir
.
get
());
for
(
dirent
*
entry
;
(
entry
=
xreaddir
(
dir
.
get
()));)
{
if
(
entry
->
d_name
==
"."
sv
||
entry
->
d_name
==
".."
sv
)
continue
;
if
(
entry
->
d_name
==
"magisk"
sv
||
entry
->
d_name
==
"magiskinit"
sv
)
setfilecon_at
(
dfd
,
entry
->
d_name
,
MAGISK_CON
);
else
setfilecon_at
(
dfd
,
entry
->
d_name
,
ROOT_CON
);
}
setfilecon
(
"/sbin/magisk"
,
MAGISK_CON
);
setfilecon
(
"/sbin/magiskinit"
,
MAGISK_CON
);
}
native/jni/core/socket.cpp
View file @
e0a28158
/* socket.c - All socket related operations
*/
#include <string.h>
#include <stdlib.h>
#include <fcntl.h>
#include <endian.h>
#include <
daemon
.hpp>
#include <
socket
.hpp>
#include <utils.hpp>
#include <logging.hpp>
...
...
native/jni/include/daemon.hpp
View file @
e0a28158
#pragma once
#include <pthread.h>
#include <sys/un.h>
#include <sys/socket.h>
#include <string>
#include <vector>
#include <socket.hpp>
// Commands require connecting to daemon
enum
{
DO_NOTHING
=
0
,
...
...
@@ -18,6 +18,7 @@ enum {
MAGISKHIDE
,
SQLITE_CMD
,
REMOVE_MODULES
,
GET_PATH
,
};
// Return codes for daemon
...
...
@@ -32,25 +33,6 @@ enum {
int
connect_daemon
(
bool
create
=
false
);
// socket.cpp
socklen_t
setup_sockaddr
(
struct
sockaddr_un
*
sun
,
const
char
*
name
);
int
create_rand_socket
(
struct
sockaddr_un
*
sun
);
int
socket_accept
(
int
sockfd
,
int
timeout
);
void
get_client_cred
(
int
fd
,
struct
ucred
*
cred
);
int
recv_fd
(
int
sockfd
);
void
send_fd
(
int
sockfd
,
int
fd
);
int
read_int
(
int
fd
);
int
read_int_be
(
int
fd
);
void
write_int
(
int
fd
,
int
val
);
void
write_int_be
(
int
fd
,
int
val
);
char
*
read_string
(
int
fd
);
char
*
read_string_be
(
int
fd
);
void
write_string
(
int
fd
,
const
char
*
val
);
void
write_string_be
(
int
fd
,
const
char
*
val
);
void
write_key_value
(
int
fd
,
const
char
*
key
,
const
char
*
val
);
void
write_key_token
(
int
fd
,
const
char
*
key
,
int
tok
);
/***************
* Boot Stages *
***************/
...
...
native/jni/include/magisk.hpp
View file @
e0a28158
#pragma once
#include <logging.hpp>
#include <string>
#define MAIN_SOCKET "d30138f2310a9fb9c54a3e0c21f58591"
#define JAVA_PACKAGE_NAME "com.topjohnwu.magisk"
#define LOGFILE "/cache/magisk.log"
#define UNBLOCKFILE "/dev/.magisk_unblock"
#define DISABLEFILE "/cache/.disable_magisk"
#define MAGISKTMP "/sbin/.magisk"
#define MIRRDIR MAGISKTMP "/mirror"
#define BLOCKDIR MAGISKTMP "/block"
#define BBPATH MAGISKTMP "/busybox"
#define MODULEMNT MAGISKTMP "/modules"
#define ROOTOVL MAGISKTMP "/rootdir"
#define ROOTMNT ROOTOVL "/.mount_list"
#define SECURE_DIR "/data/adb"
#define MODULEROOT SECURE_DIR "/modules"
#define MODULEUPGRADE SECURE_DIR "/modules_update"
...
...
@@ -21,6 +15,16 @@
#define MAGISKDB SECURE_DIR "/magisk.db"
#define MANAGERAPK DATABIN "/magisk.apk"
// tmpfs paths
extern
std
::
string
MAGISKTMP
;
#define INTLROOT ".magisk"
#define MIRRDIR INTLROOT "/mirror"
#define BLOCKDIR INTLROOT "/block"
#define MODULEMNT INTLROOT "/modules"
#define BBPATH INTLROOT "/busybox"
#define ROOTOVL INTLROOT "/rootdir"
#define ROOTMNT ROOTOVL "/.mount_list"
constexpr
const
char
*
applet_names
[]
=
{
"su"
,
"resetprop"
,
"magiskhide"
,
nullptr
};
// Multi-call entrypoints
...
...
native/jni/include/socket.hpp
0 → 100644
View file @
e0a28158
#pragma once
#include <sys/un.h>
#include <sys/socket.h>
socklen_t
setup_sockaddr
(
struct
sockaddr_un
*
sun
,
const
char
*
name
);
int
create_rand_socket
(
struct
sockaddr_un
*
sun
);
int
socket_accept
(
int
sockfd
,
int
timeout
);
void
get_client_cred
(
int
fd
,
struct
ucred
*
cred
);
int
recv_fd
(
int
sockfd
);
void
send_fd
(
int
sockfd
,
int
fd
);
int
read_int
(
int
fd
);
int
read_int_be
(
int
fd
);
void
write_int
(
int
fd
,
int
val
);
void
write_int_be
(
int
fd
,
int
val
);
char
*
read_string
(
int
fd
);
char
*
read_string_be
(
int
fd
);
void
write_string
(
int
fd
,
const
char
*
val
);
void
write_string_be
(
int
fd
,
const
char
*
val
);
void
write_key_value
(
int
fd
,
const
char
*
key
,
const
char
*
val
);
void
write_key_token
(
int
fd
,
const
char
*
key
,
int
tok
);
native/jni/init/init.hpp
View file @
e0a28158
...
...
@@ -5,7 +5,7 @@
#include <stdlib.h>
#include <vector>
#include <
magisk
.hpp>
#include <
logging
.hpp>
struct
cmdline
{
bool
skip_initramfs
;
...
...
@@ -57,26 +57,25 @@ public:
class
MagiskInit
:
public
BaseInit
{
protected
:
raw_data
self
;
const
char
*
persist_dir
;
std
::
string
persist_dir
;
virtual
void
early_mount
()
=
0
;
bool
patch_sepolicy
(
const
char
*
file
=
"/sepolicy"
);
public
:
MagiskInit
(
char
*
argv
[],
cmdline
*
cmd
)
:
BaseInit
(
argv
,
cmd
)
{}
;
MagiskInit
(
char
*
argv
[],
cmdline
*
cmd
)
:
BaseInit
(
argv
,
cmd
)
{}
};
class
SARBase
:
public
MagiskInit
{
protected
:
raw_data
config
;
std
::
vector
<
raw_file
>
overlays
;
std
::
string
tmp_dir
;
void
backup_files
();
void
patch_rootdir
();
void
mount_system_root
();
public
:
SARBase
(
char
*
argv
[],
cmdline
*
cmd
)
:
MagiskInit
(
argv
,
cmd
)
{
persist_dir
=
MIRRDIR
"/persist/magisk"
;
}
SARBase
(
char
*
argv
[],
cmdline
*
cmd
)
:
MagiskInit
(
argv
,
cmd
)
{}
void
start
()
override
{
early_mount
();
patch_rootdir
();
...
...
@@ -92,7 +91,9 @@ class ForcedFirstStageInit : public BaseInit {
private
:
void
prepare
();
public
:
ForcedFirstStageInit
(
char
*
argv
[],
cmdline
*
cmd
)
:
BaseInit
(
argv
,
cmd
)
{};
ForcedFirstStageInit
(
char
*
argv
[],
cmdline
*
cmd
)
:
BaseInit
(
argv
,
cmd
)
{
LOGD
(
"%s
\n
"
,
__FUNCTION__
);
};
void
start
()
override
{
prepare
();
exec_init
(
"/system/bin/init"
);
...
...
@@ -103,7 +104,9 @@ class FirstStageInit : public BaseInit {
private
:
void
prepare
();
public
:
FirstStageInit
(
char
*
argv
[],
cmdline
*
cmd
)
:
BaseInit
(
argv
,
cmd
)
{};
FirstStageInit
(
char
*
argv
[],
cmdline
*
cmd
)
:
BaseInit
(
argv
,
cmd
)
{
LOGD
(
"%s
\n
"
,
__FUNCTION__
);
};
void
start
()
override
{
prepare
();
exec_init
();
...
...
@@ -116,7 +119,9 @@ private:
protected
:
void
early_mount
()
override
;
public
:
SARFirstStageInit
(
char
*
argv
[],
cmdline
*
cmd
)
:
SARBase
(
argv
,
cmd
)
{};
SARFirstStageInit
(
char
*
argv
[],
cmdline
*
cmd
)
:
SARBase
(
argv
,
cmd
)
{
LOGD
(
"%s
\n
"
,
__FUNCTION__
);
};
void
start
()
override
{
early_mount
();
traced_exec_init
();
...
...
@@ -128,7 +133,9 @@ protected:
void
early_mount
()
override
;
void
cleanup
()
override
{
/* Do not do any cleanup */
}
public
:
SecondStageInit
(
char
*
argv
[])
:
SARBase
(
argv
,
nullptr
)
{};
SecondStageInit
(
char
*
argv
[])
:
SARBase
(
argv
,
nullptr
)
{
LOGD
(
"%s
\n
"
,
__FUNCTION__
);
};
};
/* ***********
...
...
@@ -139,7 +146,9 @@ class SARInit : public SARBase {
protected
:
void
early_mount
()
override
;
public
:
SARInit
(
char
*
argv
[],
cmdline
*
cmd
)
:
SARBase
(
argv
,
cmd
)
{};
SARInit
(
char
*
argv
[],
cmdline
*
cmd
)
:
SARBase
(
argv
,
cmd
)
{
LOGD
(
"%s
\n
"
,
__FUNCTION__
);
};
};
/* **********
...
...
@@ -148,13 +157,12 @@ public:
class
RootFSInit
:
public
MagiskInit
{
private
:
int
root
=
-
1
;
void
setup_rootfs
();
protected
:
void
early_mount
()
override
;
public
:
RootFSInit
(
char
*
argv
[],
cmdline
*
cmd
)
:
MagiskInit
(
argv
,
cmd
)
{
persist_dir
=
"/dev/mnt/persist/magisk"
;
LOGD
(
"%s
\n
"
,
__FUNCTION__
)
;
}
void
start
()
override
{
...
...
@@ -164,9 +172,10 @@ public:
}
};
#define INIT_SOCKET "MAGISKINIT"
void
load_kernel_info
(
cmdline
*
cmd
);
int
dump_magisk
(
const
char
*
path
,
mode_t
mode
);
int
magisk_proxy_main
(
int
argc
,
char
*
argv
[]);
void
setup_klog
();
void
mount_sbin
();
socklen_t
setup_sockaddr
(
struct
sockaddr_un
*
sun
);
void
setup_tmp
(
const
char
*
path
,
const
raw_data
&
self
,
const
raw_data
&
config
);
native/jni/init/mount.cpp
View file @
e0a28158
...
...
@@ -175,7 +175,6 @@ void RootFSInit::early_mount() {
full_read
(
"/init"
,
self
.
buf
,
self
.
sz
);
LOGD
(
"Reverting /init
\n
"
);
root
=
xopen
(
"/"
,
O_RDONLY
|
O_CLOEXEC
);
rename
(
"/.backup/init"
,
"/init"
);
mount_root
(
system
);
...
...
@@ -186,7 +185,7 @@ void RootFSInit::early_mount() {
xmkdir
(
"/dev/mnt"
,
0755
);
mount_persist
(
"/dev/block"
,
"/dev/mnt"
);
mount_list
.
emplace_back
(
"/dev/mnt/persist"
);
mount_list
.
emplace_back
(
"/dev/mnt/cache"
)
;
persist_dir
=
"/dev/mnt/persist/magisk"
;
}
void
SARBase
::
backup_files
()
{
...
...
@@ -261,13 +260,45 @@ void BaseInit::cleanup() {
mount_list
.
shrink_to_fit
();
}
void
mount_sbin
()
{
LOGD
(
"Mount /sbin tmpfs overlay
\n
"
);
xmount
(
"tmpfs"
,
"/sbin"
,
"tmpfs"
,
0
,
"mode=755"
);
static
void
patch_socket_name
(
const
char
*
path
)
{
char
*
buf
;
size_t
size
;
mmap_rw
(
path
,
buf
,
size
);
for
(
int
i
=
0
;
i
<
size
;
++
i
)
{
if
(
memcmp
(
buf
+
i
,
MAIN_SOCKET
,
sizeof
(
MAIN_SOCKET
))
==
0
)
{
gen_rand_str
(
buf
+
i
,
16
);
i
+=
sizeof
(
MAIN_SOCKET
);
}
}
munmap
(
buf
,
size
);
}
void
setup_tmp
(
const
char
*
path
,
const
raw_data
&
self
,
const
raw_data
&
config
)
{
LOGD
(
"Setup Magisk tmp at %s
\n
"
,
path
);
xmount
(
"tmpfs"
,
path
,
"tmpfs"
,
0
,
"mode=755"
);
chdir
(
path
);
xmkdir
(
MAGISKTMP
,
0755
);
xmkdir
(
INTLROOT
,
0755
);
xmkdir
(
MIRRDIR
,
0
);
xmkdir
(
BLOCKDIR
,
0
);
mount_persist
(
BLOCKDIR
,
MIRRDIR
);
int
fd
=
xopen
(
INTLROOT
"/config"
,
O_WRONLY
|
O_CREAT
,
0
);
xwrite
(
fd
,
config
.
buf
,
config
.
sz
);
close
(
fd
);
fd
=
xopen
(
"magiskinit"
,
O_WRONLY
|
O_CREAT
,
0755
);
xwrite
(
fd
,
self
.
buf
,
self
.
sz
);
close
(
fd
);
dump_magisk
(
"magisk"
,
0755
);
patch_socket_name
(
"magisk"
);
// Create applet symlinks
for
(
int
i
=
0
;
applet_names
[
i
];
++
i
)
xsymlink
(
"./magisk"
,
applet_names
[
i
]);
xsymlink
(
"./magiskinit"
,
"magiskpolicy"
);
xsymlink
(
"./magiskinit"
,
"supolicy"
);
chdir
(
"/"
);
}
native/jni/init/rootdir.cpp
View file @
e0a28158
...
...
@@ -6,6 +6,7 @@
#include <magisk.hpp>
#include <magiskpolicy.hpp>
#include <utils.hpp>
#include <socket.hpp>
#include "init.hpp"
#include "magiskrc.inc"
...
...
@@ -18,19 +19,6 @@
using
namespace
std
;
static
void
patch_socket_name
(
const
char
*
path
)
{
char
*
buf
;
size_t
size
;
mmap_rw
(
path
,
buf
,
size
);
for
(
int
i
=
0
;
i
<
size
;
++
i
)
{
if
(
memcmp
(
buf
+
i
,
MAIN_SOCKET
,
sizeof
(
MAIN_SOCKET
))
==
0
)
{
gen_rand_str
(
buf
+
i
,
16
);
i
+=
sizeof
(
MAIN_SOCKET
);
}
}
munmap
(
buf
,
size
);
}
static
vector
<
raw_data
>
rc_list
;
static
void
patch_init_rc
(
FILE
*
rc
)
{
...
...
@@ -153,15 +141,14 @@ bool MagiskInit::patch_sepolicy(const char *file) {
sepol_allow
(
SEPOL_PROC_DOMAIN
,
ALL
,
ALL
,
ALL
);
// Custom rules
if
(
auto
dir
=
xopen_dir
(
persist_dir
);
dir
)
{
char
path
[
4096
];
if
(
auto
dir
=
xopen_dir
(
persist_dir
.
data
());
dir
)
{
for
(
dirent
*
entry
;
(
entry
=
xreaddir
(
dir
.
get
()));)
{
if
(
entry
->
d_name
==
"."
sv
||
entry
->
d_name
==
".."
sv
)
continue
;
snprintf
(
path
,
sizeof
(
path
),
"%s/%s/sepolicy.rule"
,
persist_dir
,
entry
->
d_name
)
;
if
(
access
(
path
,
R_OK
)
==
0
)
{
LOGD
(
"Loading custom sepolicy patch: %s
\n
"
,
path
);
load_rule_file
(
path
);
auto
rule
=
persist_dir
+
"/"
+
entry
->
d_name
+
"/sepolicy.rule"
;
if
(
access
(
rule
.
data
()
,
R_OK
)
==
0
)
{
LOGD
(
"Loading custom sepolicy patch: %s
\n
"
,
rule
.
data
()
);
load_rule_file
(
rule
.
data
()
);
}
}
}
...
...
@@ -178,30 +165,6 @@ bool MagiskInit::patch_sepolicy(const char *file) {
return
patch_init
;
}
static
void
sbin_overlay
(
const
raw_data
&
self
,
const
raw_data
&
config
)
{
mount_sbin
();
// Dump binaries
xmkdir
(
MAGISKTMP
,
0755
);
int
fd
=
xopen
(
MAGISKTMP
"/config"
,
O_WRONLY
|
O_CREAT
,
0000
);
xwrite
(
fd
,
config
.
buf
,
config
.
sz
);
close
(
fd
);
fd
=
xopen
(
"/sbin/magiskinit"
,
O_WRONLY
|
O_CREAT
,
0755
);
xwrite
(
fd
,
self
.
buf
,
self
.
sz
);
close
(
fd
);
dump_magisk
(
"/sbin/magisk"
,
0755
);
patch_socket_name
(
"/sbin/magisk"
);
// Create applet symlinks
char
path
[
64
];
for
(
int
i
=
0
;
applet_names
[
i
];
++
i
)
{
sprintf
(
path
,
"/sbin/%s"
,
applet_names
[
i
]);
xsymlink
(
"./magisk"
,
path
);
}
xsymlink
(
"./magiskinit"
,
"/sbin/magiskpolicy"
);
xsymlink
(
"./magiskinit"
,
"/sbin/supolicy"
);
}
static
void
recreate_sbin
(
const
char
*
mirror
,
bool
use_bind_mount
)
{
auto
dp
=
xopen_dir
(
mirror
);
int
src
=
dirfd
(
dp
.
get
());
...
...
@@ -233,12 +196,6 @@ static void recreate_sbin(const char *mirror, bool use_bind_mount) {
}
}
#define ROOTMIR MIRRDIR "/system_root"
#define ROOTBLK BLOCKDIR "/system_root"
#define MONOPOLICY "/sepolicy"
#define PATCHPOLICY "/sbin/.se"
#define LIBSELINUX "/system/" LIBNAME "/libselinux.so"
static
string
magic_mount_list
;
static
void
magic_mount
(
const
string
&
sdir
,
const
string
&
ddir
=
""
)
{
...
...
@@ -262,8 +219,20 @@ static void magic_mount(const string &sdir, const string &ddir = "") {
}
}
#define ROOTMIR MIRRDIR "/system_root"
#define ROOTBLK BLOCKDIR "/system_root"
#define MONOPOLICY "/sepolicy"
#define PATCHPOLICY "/sbin/.se"
#define LIBSELINUX "/system/" LIBNAME "/libselinux.so"
void
SARBase
::
patch_rootdir
()
{
sbin_overlay
(
self
,
config
);
// TODO: dynamic paths
tmp_dir
=
"/sbin"
;
setup_tmp
(
tmp_dir
.
data
(),
self
,
config
);
persist_dir
=
tmp_dir
+
"/"
MIRRDIR
"/persist"
;
chdir
(
tmp_dir
.
data
());
// Mount system_root mirror
struct
stat
st
;
...
...
@@ -273,7 +242,8 @@ void SARBase::patch_rootdir() {
if
(
xmount
(
ROOTBLK
,
ROOTMIR
,
"ext4"
,
MS_RDONLY
,
nullptr
))
xmount
(
ROOTBLK
,
ROOTMIR
,
"erofs"
,
MS_RDONLY
,
nullptr
);
// Recreate original sbin structure
// Recreate original sbin structure if necessary
if
(
tmp_dir
==
"/sbin"
)
recreate_sbin
(
ROOTMIR
"/sbin"
,
true
);
// Patch init
...
...
@@ -332,20 +302,21 @@ void SARBase::patch_rootdir() {
patch_sepolicy
(
PATCHPOLICY
);
// Handle overlay
struct
sockaddr_un
sun
{};
socklen_t
len
=
setup_sockaddr
(
&
sun
);
int
socketfd
=
xsocket
(
AF_LOCAL
,
SOCK_STREAM
|
SOCK_CLOEXEC
,
0
);
if
(
connect
(
socketfd
,
(
struct
sockaddr
*
)
&
sun
,
len
)
==
0
)
{
struct
sockaddr_un
sun
;
int
sockfd
=
xsocket
(
AF_LOCAL
,
SOCK_STREAM
|
SOCK_CLOEXEC
,
0
);
if
(
connect
(
sockfd
,
(
struct
sockaddr
*
)
&
sun
,
setup_sockaddr
(
&
sun
,
INIT_SOCKET
))
==
0
)
{
LOGD
(
"ACK init tracer to write backup files
\n
"
);
// Let tracer know where tmp_dir is
write_string
(
sockfd
,
tmp_dir
.
data
());
// Wait for tracer to finish copying files
int
ack
;
// Wait for init tracer finish copying files
read
(
socketfd
,
&
ack
,
sizeof
(
ack
));
read
(
sockfd
,
&
ack
,
sizeof
(
ack
));
}
else
{
LOGD
(
"Restore backup files locally
\n
"
);
restore_folder
(
ROOTOVL
,
overlays
);
overlays
.
clear
();
}
close
(
sock
et
fd
);
close
(
sockfd
);
if
(
access
(
ROOTOVL
"/sbin"
,
F_OK
)
==
0
)
{
file_attr
a
;
getattr
(
"/sbin"
,
&
a
);
...
...
@@ -362,9 +333,11 @@ void SARBase::patch_rootdir() {
// Mount rootdir
magic_mount
(
ROOTOVL
);
dest
=
xopen
(
ROOTMNT
,
O_WRONLY
|
O_CREAT
|
O_CLOEXEC
);
dest
=
xopen
(
ROOTMNT
,
O_WRONLY
|
O_CREAT
|
O_CLOEXEC
,
0
);
write
(
dest
,
magic_mount_list
.
data
(),
magic_mount_list
.
length
());
close
(
dest
);
chdir
(
"/"
);
}
int
magisk_proxy_main
(
int
argc
,
char
*
argv
[])
{
...
...
@@ -381,7 +354,7 @@ int magisk_proxy_main(int argc, char *argv[]) {
unlink
(
"/sbin/magisk"
);
rm_rf
(
"/.backup"
);
s
bin_overlay
(
self
,
config
);
s
etup_tmp
(
"/sbin"
,
self
,
config
);
// Create symlinks pointing back to /root
recreate_sbin
(
"/root"
,
false
);
...
...
native/jni/init/twostage.cpp
View file @
e0a28158
#include <sys/ptrace.h>
#include <sys/wait.h>
#include <magisk.hpp>
#include <utils.hpp>
#include <logging.hpp>
#include <socket.hpp>
#include "init.hpp"
...
...
@@ -103,14 +105,6 @@ static inline long xptrace(int request, pid_t pid, void *addr = nullptr, intptr_
return
xptrace
(
request
,
pid
,
addr
,
reinterpret_cast
<
void
*>
(
data
));
}
#define INIT_SOCKET "MAGISKINIT"
socklen_t
setup_sockaddr
(
struct
sockaddr_un
*
sun
)
{
sun
->
sun_family
=
AF_LOCAL
;
strcpy
(
sun
->
sun_path
+
1
,
INIT_SOCKET
);
return
sizeof
(
sa_family_t
)
+
sizeof
(
INIT_SOCKET
);
}
void
SARFirstStageInit
::
traced_exec_init
()
{
int
pid
=
getpid
();
...
...
@@ -132,11 +126,6 @@ void SARFirstStageInit::traced_exec_init() {
// Re-exec init
exec_init
();
}
else
{
// Close all file descriptors and stop logging
no_logging
();
for
(
int
i
=
0
;
i
<
20
;
++
i
)
close
(
i
);
// Attach to parent to trace exec
xptrace
(
PTRACE_ATTACH
,
pid
);
waitpid
(
pid
,
nullptr
,
__WALL
|
__WNOTHREAD
);
...
...
@@ -155,18 +144,22 @@ void SARFirstStageInit::traced_exec_init() {
xumount2
(
"/dev"
,
MNT_DETACH
);
// Establish socket for 2nd stage ack
struct
sockaddr_un
sun
{}
;
struct
sockaddr_un
sun
;
int
sockfd
=
xsocket
(
AF_LOCAL
,
SOCK_STREAM
|
SOCK_CLOEXEC
,
0
);
xbind
(
sockfd
,
(
struct
sockaddr
*
)
&
sun
,
setup_sockaddr
(
&
sun
));
xbind
(
sockfd
,
(
struct
sockaddr
*
)
&
sun
,
setup_sockaddr
(
&
sun
,
INIT_SOCKET
));
xlisten
(
sockfd
,
1
);
// Resume init
xptrace
(
PTRACE_DETACH
,
pid
);
// Wait for second stage ack
int
client
=
xaccept4
(
sockfd
,
nullptr
,
nullptr
,
SOCK_CLOEXEC
);
// Write backup files
int
cfg
=
xopen
(
MAGISKTMP
"/config"
,
O_WRONLY
|
O_CREAT
,
0000
);
char
*
tmp_dir
=
read_string
(
client
);
chdir
(
tmp_dir
);
free
(
tmp_dir
);
int
cfg
=
xopen
(
INTLROOT
"/config"
,
O_WRONLY
|
O_CREAT
,
0
);
xwrite
(
cfg
,
config
.
buf
,
config
.
sz
);
close
(
cfg
);
restore_folder
(
ROOTOVL
,
overlays
);
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment