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
a25dace7
Commit
a25dace7
authored
Apr 24, 2019
by
Viktor De Pasquale
Browse files
Options
Browse Files
Download
Plain Diff
Merge remote-tracking branch 'john/master' into development
parents
14ff22fb
54d1207f
Hide whitespace changes
Inline
Side-by-side
Showing
12 changed files
with
160 additions
and
150 deletions
+160
-150
utils.sh
app/src/main/res/raw/utils.sh
+1
-0
daemon.cpp
native/jni/core/daemon.cpp
+2
-0
init.cpp
native/jni/core/init.cpp
+77
-105
magisk.cpp
native/jni/core/magisk.cpp
+1
-0
magiskrc.h
native/jni/core/magiskrc.h
+1
-7
magisk.h
native/jni/include/magisk.h
+0
-2
hide_utils.cpp
native/jni/magiskhide/hide_utils.cpp
+1
-1
magiskhide.h
native/jni/magiskhide/magiskhide.h
+1
-4
proc_monitor.cpp
native/jni/magiskhide/proc_monitor.cpp
+47
-28
rules.cpp
native/jni/magiskpolicy/rules.cpp
+2
-0
selinux.h
native/jni/utils/include/selinux.h
+1
-0
selinux.cpp
native/jni/utils/selinux.cpp
+26
-3
No files found.
app/src/main/res/raw/utils.sh
View file @
a25dace7
...
@@ -77,6 +77,7 @@ post_ota() {
...
@@ -77,6 +77,7 @@ post_ota() {
cat
<<
EOF
> post-fs-data.d/post_ota.sh
cat
<<
EOF
> post-fs-data.d/post_ota.sh
${
1
}
/bootctl mark-boot-successful
${
1
}
/bootctl mark-boot-successful
rm -f
${
1
}
/bootctl
rm -f
${
1
}
/bootctl
rm -f
${
1
}
/post-fs-data.d/post_ota.sh
EOF
EOF
chmod
755 post-fs-data.d/post_ota.sh
chmod
755 post-fs-data.d/post_ota.sh
cd
/
cd
/
...
...
native/jni/core/daemon.cpp
View file @
a25dace7
...
@@ -101,6 +101,8 @@ static void main_daemon() {
...
@@ -101,6 +101,8 @@ static void main_daemon() {
android_logging
();
android_logging
();
setsid
();
setsid
();
setcon
(
"u:r:"
SEPOL_PROC_DOMAIN
":s0"
);
setcon
(
"u:r:"
SEPOL_PROC_DOMAIN
":s0"
);
restore_rootcon
();
int
fd
=
xopen
(
"/dev/null"
,
O_RDWR
|
O_CLOEXEC
);
int
fd
=
xopen
(
"/dev/null"
,
O_RDWR
|
O_CLOEXEC
);
xdup2
(
fd
,
STDOUT_FILENO
);
xdup2
(
fd
,
STDOUT_FILENO
);
xdup2
(
fd
,
STDERR_FILENO
);
xdup2
(
fd
,
STDERR_FILENO
);
...
...
native/jni/core/init.cpp
View file @
a25dace7
...
@@ -46,7 +46,8 @@ static int vprintk(const char *fmt, va_list ap) {
...
@@ -46,7 +46,8 @@ static int vprintk(const char *fmt, va_list ap) {
static
void
setup_klog
()
{
static
void
setup_klog
()
{
mknod
(
"/kmsg"
,
S_IFCHR
|
0666
,
makedev
(
1
,
11
));
mknod
(
"/kmsg"
,
S_IFCHR
|
0666
,
makedev
(
1
,
11
));
kmsg
=
xfopen
(
"/kmsg"
,
"ae"
);
int
fd
=
xopen
(
"/kmsg"
,
O_WRONLY
|
O_CLOEXEC
);
kmsg
=
fdopen
(
fd
,
"w"
);
setbuf
(
kmsg
,
nullptr
);
setbuf
(
kmsg
,
nullptr
);
unlink
(
"/kmsg"
);
unlink
(
"/kmsg"
);
log_cb
.
d
=
log_cb
.
i
=
log_cb
.
w
=
log_cb
.
e
=
vprintk
;
log_cb
.
d
=
log_cb
.
i
=
log_cb
.
w
=
log_cb
.
e
=
vprintk
;
...
@@ -156,11 +157,10 @@ private:
...
@@ -156,11 +157,10 @@ private:
bool
read_dt_fstab
(
const
char
*
name
,
char
*
partname
,
char
*
partfs
);
bool
read_dt_fstab
(
const
char
*
name
,
char
*
partname
,
char
*
partfs
);
bool
patch_sepolicy
();
bool
patch_sepolicy
();
void
cleanup
();
void
cleanup
();
void
re_exec_init
();
public
:
public
:
explicit
MagiskInit
(
char
*
argv
[])
:
argv
(
argv
)
{}
explicit
MagiskInit
(
char
*
argv
[])
:
argv
(
argv
)
{}
void
setup_overlay
();
void
re_exec_init
();
void
start
();
void
start
();
void
test
();
void
test
();
};
};
...
@@ -460,6 +460,27 @@ void MagiskInit::early_mount() {
...
@@ -460,6 +460,27 @@ void MagiskInit::early_mount() {
mount_root
(
odm
);
mount_root
(
odm
);
}
}
static
void
patch_socket_name
(
const
char
*
path
)
{
uint8_t
*
buf
;
char
name
[
sizeof
(
MAIN_SOCKET
)];
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
(
name
,
sizeof
(
name
));
memcpy
(
buf
+
i
,
name
,
sizeof
(
name
));
i
+=
sizeof
(
name
);
}
}
munmap
(
buf
,
size
);
}
constexpr
const
char
wrapper
[]
=
"#!/system/bin/sh
\n
"
"export LD_LIBRARY_PATH=
\"
$LD_LIBRARY_PATH:/apex/com.android.runtime/"
LIBNAME
"
\"\n
"
"exec /sbin/magisk.bin
\"
$0
\"
\"
$@
\"\n
"
;
void
MagiskInit
::
setup_rootfs
()
{
void
MagiskInit
::
setup_rootfs
()
{
bool
patch_init
=
patch_sepolicy
();
bool
patch_init
=
patch_sepolicy
();
...
@@ -531,6 +552,7 @@ void MagiskInit::setup_rootfs() {
...
@@ -531,6 +552,7 @@ void MagiskInit::setup_rootfs() {
gen_rand_str
(
pfd_svc
+
1
,
sizeof
(
pfd_svc
)
-
1
);
gen_rand_str
(
pfd_svc
+
1
,
sizeof
(
pfd_svc
)
-
1
);
gen_rand_str
(
ls_svc
+
1
,
sizeof
(
ls_svc
)
-
1
);
gen_rand_str
(
ls_svc
+
1
,
sizeof
(
ls_svc
)
-
1
);
gen_rand_str
(
bc_svc
+
1
,
sizeof
(
bc_svc
)
-
1
);
gen_rand_str
(
bc_svc
+
1
,
sizeof
(
bc_svc
)
-
1
);
LOGD
(
"Inject magisk services: [%s] [%s] [%s]
\n
"
,
pfd_svc
,
ls_svc
,
bc_svc
);
fprintf
(
rc
,
magiskrc
,
pfd_svc
,
pfd_svc
,
ls_svc
,
bc_svc
,
bc_svc
);
fprintf
(
rc
,
magiskrc
,
pfd_svc
,
pfd_svc
,
ls_svc
,
bc_svc
,
bc_svc
);
fclose
(
rc
);
fclose
(
rc
);
clone_attr
(
"/init.rc"
,
"/init.p.rc"
);
clone_attr
(
"/init.rc"
,
"/init.p.rc"
);
...
@@ -545,6 +567,56 @@ void MagiskInit::setup_rootfs() {
...
@@ -545,6 +567,56 @@ void MagiskInit::setup_rootfs() {
int
rootdir
=
xopen
(
"/root"
,
O_RDONLY
|
O_CLOEXEC
);
int
rootdir
=
xopen
(
"/root"
,
O_RDONLY
|
O_CLOEXEC
);
int
sbin
=
xopen
(
"/sbin"
,
O_RDONLY
|
O_CLOEXEC
);
int
sbin
=
xopen
(
"/sbin"
,
O_RDONLY
|
O_CLOEXEC
);
link_dir
(
sbin
,
rootdir
);
link_dir
(
sbin
,
rootdir
);
close
(
sbin
);
LOGD
(
"Mount /sbin tmpfs overlay
\n
"
);
xmount
(
"tmpfs"
,
"/sbin"
,
"tmpfs"
,
0
,
"mode=755"
);
sbin
=
xopen
(
"/sbin"
,
O_RDONLY
|
O_CLOEXEC
);
char
path
[
64
];
// Create symlinks pointing back to /root
DIR
*
dir
=
xfdopendir
(
rootdir
);
struct
dirent
*
entry
;
while
((
entry
=
xreaddir
(
dir
)))
{
if
(
entry
->
d_name
==
"."
sv
||
entry
->
d_name
==
".."
sv
)
continue
;
sprintf
(
path
,
"/root/%s"
,
entry
->
d_name
);
xsymlinkat
(
path
,
sbin
,
entry
->
d_name
);
}
// Dump binaries
mkdir
(
MAGISKTMP
,
0755
);
fd
=
xopen
(
MAGISKTMP
"/config"
,
O_WRONLY
|
O_CREAT
,
0000
);
write
(
fd
,
config
.
buf
,
config
.
sz
);
close
(
fd
);
fd
=
xopen
(
"/sbin/magiskinit"
,
O_WRONLY
|
O_CREAT
,
0755
);
write
(
fd
,
self
.
buf
,
self
.
sz
);
close
(
fd
);
if
(
access
(
"/system/apex"
,
F_OK
)
==
0
)
{
LOGD
(
"APEX detected, use wrapper
\n
"
);
dump_magisk
(
"/sbin/magisk.bin"
,
0755
);
patch_socket_name
(
"/sbin/magisk.bin"
);
fd
=
xopen
(
"/sbin/magisk"
,
O_WRONLY
|
O_CREAT
,
0755
);
write
(
fd
,
wrapper
,
sizeof
(
wrapper
)
-
1
);
close
(
fd
);
}
else
{
dump_magisk
(
"/sbin/magisk"
,
0755
);
patch_socket_name
(
"/sbin/magisk"
);
}
// Create applet symlinks
for
(
int
i
=
0
;
applet_names
[
i
];
++
i
)
{
sprintf
(
path
,
"/sbin/%s"
,
applet_names
[
i
]);
xsymlink
(
"/sbin/magisk"
,
path
);
}
for
(
int
i
=
0
;
init_applet
[
i
];
++
i
)
{
sprintf
(
path
,
"/sbin/%s"
,
init_applet
[
i
]);
xsymlink
(
"/sbin/magiskinit"
,
path
);
}
close
(
rootdir
);
close
(
sbin
);
}
}
bool
MagiskInit
::
patch_sepolicy
()
{
bool
MagiskInit
::
patch_sepolicy
()
{
...
@@ -603,99 +675,8 @@ void MagiskInit::cleanup() {
...
@@ -603,99 +675,8 @@ void MagiskInit::cleanup() {
umount_root
(
odm
);
umount_root
(
odm
);
}
}
static
inline
void
patch_socket_name
(
const
char
*
path
)
{
uint8_t
*
buf
;
char
name
[
sizeof
(
MAIN_SOCKET
)];
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
(
name
,
sizeof
(
name
));
memcpy
(
buf
+
i
,
name
,
sizeof
(
name
));
i
+=
sizeof
(
name
);
}
}
munmap
(
buf
,
size
);
}
static
const
char
wrapper
[]
=
"#!/system/bin/sh
\n
"
"export LD_LIBRARY_PATH=
\"
$LD_LIBRARY_PATH:/apex/com.android.runtime/"
LIBNAME
"
\"\n
"
"exec /sbin/magisk.bin
\"
$0
\"
\"
$@
\"\n
"
;
void
MagiskInit
::
setup_overlay
()
{
char
path
[
128
];
int
fd
;
// Wait for early-init start
while
(
access
(
EARLYINIT
,
F_OK
)
!=
0
)
usleep
(
10
);
setcon
(
"u:r:"
SEPOL_PROC_DOMAIN
":s0"
);
unlink
(
EARLYINIT
);
#ifdef MAGISK_DEBUG
kmsg
=
xfopen
(
"/dev/kmsg"
,
"ae"
);
setbuf
(
kmsg
,
nullptr
);
#endif
LOGD
(
"Setting up overlay
\n
"
);
// Mount the /sbin tmpfs overlay
xmount
(
"tmpfs"
,
"/sbin"
,
"tmpfs"
,
0
,
nullptr
);
chmod
(
"/sbin"
,
0755
);
setfilecon
(
"/sbin"
,
"u:object_r:rootfs:s0"
);
// Dump binaries
mkdir
(
MAGISKTMP
,
0755
);
fd
=
xopen
(
MAGISKTMP
"/config"
,
O_WRONLY
|
O_CREAT
,
0000
);
write
(
fd
,
config
.
buf
,
config
.
sz
);
close
(
fd
);
fd
=
xopen
(
"/sbin/magiskinit"
,
O_WRONLY
|
O_CREAT
,
0755
);
write
(
fd
,
self
.
buf
,
self
.
sz
);
close
(
fd
);
if
(
access
(
"/system/apex"
,
F_OK
)
==
0
)
{
LOGD
(
"APEX detected, use wrapper
\n
"
);
dump_magisk
(
"/sbin/magisk.bin"
,
0755
);
patch_socket_name
(
"/sbin/magisk.bin"
);
setfilecon
(
"/sbin/magisk.bin"
,
"u:object_r:"
SEPOL_FILE_DOMAIN
":s0"
);
fd
=
xopen
(
"/sbin/magisk"
,
O_WRONLY
|
O_CREAT
,
0755
);
write
(
fd
,
wrapper
,
sizeof
(
wrapper
)
-
1
);
close
(
fd
);
}
else
{
dump_magisk
(
"/sbin/magisk"
,
0755
);
patch_socket_name
(
"/sbin/magisk"
);
}
setfilecon
(
"/sbin/magisk"
,
"u:object_r:"
SEPOL_FILE_DOMAIN
":s0"
);
setfilecon
(
"/sbin/magiskinit"
,
"u:object_r:"
SEPOL_FILE_DOMAIN
":s0"
);
// Create applet symlinks
for
(
int
i
=
0
;
applet_names
[
i
];
++
i
)
{
sprintf
(
path
,
"/sbin/%s"
,
applet_names
[
i
]);
xsymlink
(
"/sbin/magisk"
,
path
);
}
for
(
int
i
=
0
;
init_applet
[
i
];
++
i
)
{
sprintf
(
path
,
"/sbin/%s"
,
init_applet
[
i
]);
xsymlink
(
"/sbin/magiskinit"
,
path
);
}
// Create symlinks pointing back to /root
DIR
*
dir
=
xopendir
(
"/root"
);
struct
dirent
*
entry
;
fd
=
xopen
(
"/sbin"
,
O_RDONLY
);
while
((
entry
=
xreaddir
(
dir
)))
{
if
(
entry
->
d_name
==
"."
sv
||
entry
->
d_name
==
".."
sv
)
continue
;
sprintf
(
path
,
"/root/%s"
,
entry
->
d_name
);
xsymlinkat
(
path
,
fd
,
entry
->
d_name
);
}
closedir
(
dir
);
close
(
fd
);
close
(
xopen
(
EARLYINITDONE
,
O_RDONLY
|
O_CREAT
,
0
));
exit
(
0
);
}
void
MagiskInit
::
re_exec_init
()
{
void
MagiskInit
::
re_exec_init
()
{
LOGD
(
"Re-exec /init
\n
"
);
cleanup
();
cleanup
();
execv
(
"/init"
,
argv
);
execv
(
"/init"
,
argv
);
exit
(
1
);
exit
(
1
);
...
@@ -722,6 +703,7 @@ void MagiskInit::start() {
...
@@ -722,6 +703,7 @@ void MagiskInit::start() {
preset
();
preset
();
early_mount
();
early_mount
();
setup_rootfs
();
setup_rootfs
();
re_exec_init
();
}
}
void
MagiskInit
::
test
()
{
void
MagiskInit
::
test
()
{
...
@@ -767,14 +749,4 @@ int main(int argc, char *argv[]) {
...
@@ -767,14 +749,4 @@ int main(int argc, char *argv[]) {
// Run the main routine
// Run the main routine
init
.
start
();
init
.
start
();
// Close all file descriptors
for
(
int
i
=
0
;
i
<
30
;
++
i
)
close
(
i
);
// Launch daemon to setup overlay
if
(
fork_dont_care
()
==
0
)
init
.
setup_overlay
();
init
.
re_exec_init
();
}
}
native/jni/core/magisk.cpp
View file @
a25dace7
...
@@ -71,6 +71,7 @@ int magisk_main(int argc, char *argv[]) {
...
@@ -71,6 +71,7 @@ int magisk_main(int argc, char *argv[]) {
unlock_blocks
();
unlock_blocks
();
return
0
;
return
0
;
}
else
if
(
strcmp
(
argv
[
1
],
"--restorecon"
)
==
0
)
{
}
else
if
(
strcmp
(
argv
[
1
],
"--restorecon"
)
==
0
)
{
restore_rootcon
();
restorecon
();
restorecon
();
return
0
;
return
0
;
}
else
if
(
strcmp
(
argv
[
1
],
"--clone-attr"
)
==
0
)
{
}
else
if
(
strcmp
(
argv
[
1
],
"--clone-attr"
)
==
0
)
{
...
...
native/jni/core/magiskrc.h
View file @
a25dace7
#include <magisk.h>
#include <magisk.h>
#include <magiskpolicy.h>
#include <magiskpolicy.h>
static
const
char
magiskrc
[]
=
constexpr
const
char
magiskrc
[]
=
"
\n\n
"
"
\n\n
"
"on early-init
\n
"
" write "
EARLYINIT
" 1
\n
"
" wait "
EARLYINITDONE
"
\n
"
" rm "
EARLYINITDONE
"
\n
"
"
\n
"
"on post-fs-data
\n
"
"on post-fs-data
\n
"
" start logd
\n
"
" start logd
\n
"
" load_persist_props
\n
"
" load_persist_props
\n
"
...
...
native/jni/include/magisk.h
View file @
a25dace7
...
@@ -6,8 +6,6 @@
...
@@ -6,8 +6,6 @@
#define JAVA_PACKAGE_NAME "com.topjohnwu.magisk"
#define JAVA_PACKAGE_NAME "com.topjohnwu.magisk"
#define LOGFILE "/cache/magisk.log"
#define LOGFILE "/cache/magisk.log"
#define UNBLOCKFILE "/dev/.magisk_unblock"
#define UNBLOCKFILE "/dev/.magisk_unblock"
#define EARLYINIT "/dev/.magisk_early_init"
#define EARLYINITDONE "/dev/.magisk_early_init_done"
#define DISABLEFILE "/cache/.disable_magisk"
#define DISABLEFILE "/cache/.disable_magisk"
#define MAGISKTMP "/sbin/.magisk"
#define MAGISKTMP "/sbin/.magisk"
#define MIRRDIR MAGISKTMP "/mirror"
#define MIRRDIR MAGISKTMP "/mirror"
...
...
native/jni/magiskhide/hide_utils.cpp
View file @
a25dace7
...
@@ -71,7 +71,7 @@ void crawl_procfs(DIR *dir, const function<bool (int)> &fn) {
...
@@ -71,7 +71,7 @@ void crawl_procfs(DIR *dir, const function<bool (int)> &fn) {
}
}
}
}
bool
proc_name_match
(
int
pid
,
const
char
*
name
)
{
static
bool
proc_name_match
(
int
pid
,
const
char
*
name
)
{
char
buf
[
4019
];
char
buf
[
4019
];
FILE
*
f
;
FILE
*
f
;
#if 0
#if 0
...
...
native/jni/magiskhide/magiskhide.h
View file @
a25dace7
...
@@ -19,8 +19,6 @@
...
@@ -19,8 +19,6 @@
#define SAFETYNET_PKG "com.google.android.gms"
#define SAFETYNET_PKG "com.google.android.gms"
#define MICROG_SAFETYNET "org.microg.gms.droidguard"
#define MICROG_SAFETYNET "org.microg.gms.droidguard"
#define WEVENT(s) (((s) & 0xffff0000) >> 16)
// CLI entries
// CLI entries
void
launch_magiskhide
(
int
client
);
void
launch_magiskhide
(
int
client
);
int
stop_magiskhide
();
int
stop_magiskhide
();
...
@@ -29,15 +27,14 @@ int rm_list(int client);
...
@@ -29,15 +27,14 @@ int rm_list(int client);
void
ls_list
(
int
client
);
void
ls_list
(
int
client
);
// Process monitoring
// Process monitoring
void
*
update_uid_map
(
void
*
p
=
nullptr
);
void
proc_monitor
();
void
proc_monitor
();
void
update_uid_map
();
// Utility functions
// Utility functions
void
manage_selinux
();
void
manage_selinux
();
void
clean_magisk_props
();
void
clean_magisk_props
();
void
crawl_procfs
(
const
std
::
function
<
bool
(
int
)
>
&
fn
);
void
crawl_procfs
(
const
std
::
function
<
bool
(
int
)
>
&
fn
);
void
crawl_procfs
(
DIR
*
dir
,
const
std
::
function
<
bool
(
int
)
>
&
fn
);
void
crawl_procfs
(
DIR
*
dir
,
const
std
::
function
<
bool
(
int
)
>
&
fn
);
bool
proc_name_match
(
int
pid
,
const
char
*
name
);
extern
bool
hide_enabled
;
extern
bool
hide_enabled
;
extern
pthread_mutex_t
monitor_lock
;
extern
pthread_mutex_t
monitor_lock
;
...
...
native/jni/magiskhide/proc_monitor.cpp
View file @
a25dace7
...
@@ -134,18 +134,21 @@ static bool parse_packages_xml(string_view s) {
...
@@ -134,18 +134,21 @@ static bool parse_packages_xml(string_view s) {
return
true
;
return
true
;
}
}
void
update_uid_map
()
{
MutexGuard
lock
(
monitor_lock
);
uid_proc_map
.
clear
();
file_readline
(
"/data/system/packages.xml"
,
parse_packages_xml
,
true
);
}
static
void
check_zygote
()
{
static
void
check_zygote
()
{
int
min_zyg
=
1
;
int
min_zyg
=
1
;
if
(
access
(
"/system/bin/app_process64"
,
R_OK
)
==
0
)
if
(
access
(
"/system/bin/app_process64"
,
R_OK
)
==
0
)
min_zyg
=
2
;
min_zyg
=
2
;
for
(
bool
first
=
true
;
zygote_map
.
size
()
<
min_zyg
;
first
=
false
)
{
for
(;;)
{
if
(
!
first
)
usleep
(
10000
);
crawl_procfs
([](
int
pid
)
->
bool
{
crawl_procfs
([](
int
pid
)
->
bool
{
char
buf
[
512
];
char
buf
[
512
];
snprintf
(
buf
,
sizeof
(
buf
),
"/proc/%d/cmdline"
,
pid
);
snprintf
(
buf
,
sizeof
(
buf
),
"/proc/%d/cmdline"
,
pid
);
FILE
*
f
=
fopen
(
buf
,
"re"
);
if
(
FILE
*
f
=
fopen
(
buf
,
"re"
);
f
)
{
if
(
f
)
{
fgets
(
buf
,
sizeof
(
buf
),
f
);
fgets
(
buf
,
sizeof
(
buf
),
f
);
if
(
strncmp
(
buf
,
"zygote"
,
6
)
==
0
&&
parse_ppid
(
pid
)
==
1
)
if
(
strncmp
(
buf
,
"zygote"
,
6
)
==
0
&&
parse_ppid
(
pid
)
==
1
)
new_zygote
(
pid
);
new_zygote
(
pid
);
...
@@ -153,14 +156,41 @@ static void check_zygote() {
...
@@ -153,14 +156,41 @@ static void check_zygote() {
}
}
return
true
;
return
true
;
});
});
if
(
zygote_map
.
size
()
>=
min_zyg
)
break
;
usleep
(
10000
);
}
}
}
}
void
*
update_uid_map
(
void
*
)
{
#define APP_PROC "/system/bin/app_process"
MutexGuard
lock
(
monitor_lock
);
uid_proc_map
.
clear
();
static
void
setup_inotify
()
{
file_readline
(
"/data/system/packages.xml"
,
parse_packages_xml
,
true
);
inotify_fd
=
xinotify_init1
(
IN_CLOEXEC
);
return
nullptr
;
if
(
inotify_fd
<
0
)
term_thread
();
// Setup inotify asynchronous I/O
fcntl
(
inotify_fd
,
F_SETFL
,
O_ASYNC
);
struct
f_owner_ex
ex
=
{
.
type
=
F_OWNER_TID
,
.
pid
=
gettid
()
};
fcntl
(
inotify_fd
,
F_SETOWN_EX
,
&
ex
);
// Monitor packages.xml
inotify_add_watch
(
inotify_fd
,
"/data/system"
,
IN_CLOSE_WRITE
);
// Monitor app_process
if
(
access
(
APP_PROC
"32"
,
F_OK
)
==
0
)
{
inotify_add_watch
(
inotify_fd
,
APP_PROC
"32"
,
IN_ACCESS
);
if
(
access
(
APP_PROC
"64"
,
F_OK
)
==
0
)
inotify_add_watch
(
inotify_fd
,
APP_PROC
"64"
,
IN_ACCESS
);
}
else
{
inotify_add_watch
(
inotify_fd
,
APP_PROC
,
IN_ACCESS
);
}
// First find existing zygotes
check_zygote
();
}
}
/*************************
/*************************
...
@@ -233,7 +263,10 @@ static void inotify_event(int) {
...
@@ -233,7 +263,10 @@ static void inotify_event(int) {
read
(
inotify_fd
,
buf
,
sizeof
(
buf
));
read
(
inotify_fd
,
buf
,
sizeof
(
buf
));
if
((
event
->
mask
&
IN_CLOSE_WRITE
)
&&
strcmp
(
event
->
name
,
"packages.xml"
)
==
0
)
{
if
((
event
->
mask
&
IN_CLOSE_WRITE
)
&&
strcmp
(
event
->
name
,
"packages.xml"
)
==
0
)
{
LOGD
(
"proc_monitor: /data/system/packages.xml updated
\n
"
);
LOGD
(
"proc_monitor: /data/system/packages.xml updated
\n
"
);
new_daemon_thread
(
update_uid_map
);
uid_proc_map
.
clear
();
file_readline
(
"/data/system/packages.xml"
,
parse_packages_xml
,
true
);
}
else
if
(
event
->
mask
&
IN_ACCESS
)
{
check_zygote
();
}
}
}
}
...
@@ -362,12 +395,10 @@ static void new_zygote(int pid) {
...
@@ -362,12 +395,10 @@ static void new_zygote(int pid) {
xptrace
(
PTRACE_CONT
,
pid
);
xptrace
(
PTRACE_CONT
,
pid
);
}
}
#define WEVENT(s) (((s) & 0xffff0000) >> 16)
#define DETACH_AND_CONT { detach = true; continue; }
#define DETACH_AND_CONT { detach = true; continue; }
void
proc_monitor
()
{
inotify_fd
=
xinotify_init1
(
IN_CLOEXEC
);
if
(
inotify_fd
<
0
)
term_thread
();
void
proc_monitor
()
{
// Unblock some signals
// Unblock some signals
sigset_t
block_set
;
sigset_t
block_set
;
sigemptyset
(
&
block_set
);
sigemptyset
(
&
block_set
);
...
@@ -381,19 +412,7 @@ void proc_monitor() {
...
@@ -381,19 +412,7 @@ void proc_monitor() {
act
.
sa_handler
=
inotify_event
;
act
.
sa_handler
=
inotify_event
;
sigaction
(
SIGIO
,
&
act
,
nullptr
);
sigaction
(
SIGIO
,
&
act
,
nullptr
);
// Setup inotify asynchronous I/O
setup_inotify
();
fcntl
(
inotify_fd
,
F_SETFL
,
O_ASYNC
);
struct
f_owner_ex
ex
=
{
.
type
=
F_OWNER_TID
,
.
pid
=
gettid
()
};
fcntl
(
inotify_fd
,
F_SETOWN_EX
,
&
ex
);
// Start monitoring packages.xml
inotify_add_watch
(
inotify_fd
,
"/data/system"
,
IN_CLOSE_WRITE
);
// First find existing zygotes
check_zygote
();
int
status
;
int
status
;
...
...
native/jni/magiskpolicy/rules.cpp
View file @
a25dace7
...
@@ -54,6 +54,8 @@ void sepol_magisk_rules() {
...
@@ -54,6 +54,8 @@ void sepol_magisk_rules() {
// Let init run stuffs
// Let init run stuffs
sepol_allow
(
"kernel"
,
SEPOL_PROC_DOMAIN
,
"fd"
,
"use"
);
sepol_allow
(
"kernel"
,
SEPOL_PROC_DOMAIN
,
"fd"
,
"use"
);
sepol_allow
(
"init"
,
SEPOL_PROC_DOMAIN
,
"process"
,
ALL
);
sepol_allow
(
"init"
,
SEPOL_PROC_DOMAIN
,
"process"
,
ALL
);
sepol_allow
(
"init"
,
"tmpfs"
,
"file"
,
"getattr"
);
sepol_allow
(
"init"
,
"tmpfs"
,
"file"
,
"execute"
);
// Shell, properties, logs
// Shell, properties, logs
if
(
sepol_exists
(
"default_prop"
))
if
(
sepol_exists
(
"default_prop"
))
...
...
native/jni/utils/include/selinux.h
View file @
a25dace7
...
@@ -36,6 +36,7 @@ void setfilecon_at(int dirfd, const char *name, const char *con);
...
@@ -36,6 +36,7 @@ void setfilecon_at(int dirfd, const char *name, const char *con);
void
selinux_builtin_impl
();
void
selinux_builtin_impl
();
void
dload_selinux
();
void
dload_selinux
();
void
restorecon
();
void
restorecon
();
void
restore_rootcon
();
#ifdef __cplusplus
#ifdef __cplusplus
}
}
...
...
native/jni/utils/selinux.cpp
View file @
a25dace7
#include <sys/xattr.h>
#include <dlfcn.h>
#include <dlfcn.h>
#include <unistd.h>
#include <unistd.h>
#include <fcntl.h>
#include <fcntl.h>
#include <string.h>
#include <string.h>
#include <syscall.h>
#include <syscall.h>
#include <s
ys/xattr.h
>
#include <s
tring_view
>
#include <magisk.h>
#include <magisk.h>
#include <utils.h>
#include <utils.h>
#include <selinux.h>
#include <selinux.h>
using
namespace
std
::
literals
;
#define UNLABEL_CON "u:object_r:unlabeled:s0"
#define UNLABEL_CON "u:object_r:unlabeled:s0"
#define SYSTEM_CON "u:object_r:system_file:s0"
#define SYSTEM_CON "u:object_r:system_file:s0"
#define ADB_CON "u:object_r:adb_data_file:s0"
#define ADB_CON "u:object_r:adb_data_file:s0"
#define ROOT_CON "u:object_r:rootfs:s0"
#define MAGISK_CON "u:object_r:" SEPOL_FILE_DOMAIN ":s0"
#define MAGISK_CON "u:object_r:" SEPOL_FILE_DOMAIN ":s0"
// Stub implementation
// Stub implementation
...
@@ -164,7 +168,7 @@ static void restore_syscon(int dirfd) {
...
@@ -164,7 +168,7 @@ static void restore_syscon(int dirfd) {
dir
=
xfdopendir
(
dirfd
);
dir
=
xfdopendir
(
dirfd
);
while
((
entry
=
xreaddir
(
dir
)))
{
while
((
entry
=
xreaddir
(
dir
)))
{
if
(
strcmp
(
entry
->
d_name
,
"."
)
==
0
||
strcmp
(
entry
->
d_name
,
".."
)
==
0
)
if
(
entry
->
d_name
==
"."
sv
||
entry
->
d_name
==
".."
sv
)
continue
;
continue
;
int
fd
=
openat
(
dirfd
,
entry
->
d_name
,
O_RDONLY
|
O_CLOEXEC
);
int
fd
=
openat
(
dirfd
,
entry
->
d_name
,
O_RDONLY
|
O_CLOEXEC
);
if
(
entry
->
d_type
==
DT_DIR
)
{
if
(
entry
->
d_type
==
DT_DIR
)
{
...
@@ -193,7 +197,7 @@ static void restore_magiskcon(int dirfd) {
...
@@ -193,7 +197,7 @@ static void restore_magiskcon(int dirfd) {
dir
=
xfdopendir
(
dirfd
);
dir
=
xfdopendir
(
dirfd
);
while
((
entry
=
xreaddir
(
dir
)))
{
while
((
entry
=
xreaddir
(
dir
)))
{
if
(
strcmp
(
entry
->
d_name
,
"."
)
==
0
||
strcmp
(
entry
->
d_name
,
".."
)
==
0
)
if
(
entry
->
d_name
==
"."
sv
||
entry
->
d_name
==
".."
sv
)
continue
;
continue
;
int
fd
=
xopenat
(
dirfd
,
entry
->
d_name
,
O_RDONLY
|
O_CLOEXEC
);
int
fd
=
xopenat
(
dirfd
,
entry
->
d_name
,
O_RDONLY
|
O_CLOEXEC
);
if
(
entry
->
d_type
==
DT_DIR
)
{
if
(
entry
->
d_type
==
DT_DIR
)
{
...
@@ -220,3 +224,22 @@ void restorecon() {
...
@@ -220,3 +224,22 @@ void restorecon() {
restore_magiskcon
(
fd
);
restore_magiskcon
(
fd
);
close
(
fd
);
close
(
fd
);
}
}
void
restore_rootcon
()
{
setfilecon
(
"/sbin"
,
ROOT_CON
);
struct
dirent
*
entry
;
DIR
*
dir
=
xopendir
(
"/sbin"
);
int
dfd
=
dirfd
(
dir
);
while
((
entry
=
xreaddir
(
dir
)))
{
if
(
entry
->
d_name
==
"."
sv
||
entry
->
d_name
==
".."
sv
)
continue
;
setfilecon_at
(
dfd
,
entry
->
d_name
,
ROOT_CON
);
}
setfilecon
(
"/sbin/magisk.bin"
,
MAGISK_CON
);
setfilecon
(
"/sbin/magisk"
,
MAGISK_CON
);
setfilecon
(
"/sbin/magiskinit"
,
MAGISK_CON
);
closedir
(
dir
);
}
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