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
d2bc2cfc
Commit
d2bc2cfc
authored
Jan 18, 2021
by
topjohnwu
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Install both 32 and 64 bit binaries
parent
5a71998b
Show whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
74 additions
and
54 deletions
+74
-54
applets.cpp
native/jni/core/applets.cpp
+2
-1
restorecon.cpp
native/jni/core/restorecon.cpp
+5
-6
rootdir.cpp
native/jni/init/rootdir.cpp
+33
-10
ramdisk.cpp
native/jni/magiskboot/ramdisk.cpp
+25
-27
boot_patch.sh
scripts/boot_patch.sh
+9
-10
No files found.
native/jni/core/applets.cpp
View file @
d2bc2cfc
...
@@ -35,7 +35,8 @@ int main(int argc, char *argv[]) {
...
@@ -35,7 +35,8 @@ int main(int argc, char *argv[]) {
cmdline_logging
();
cmdline_logging
();
init_argv0
(
argc
,
argv
);
init_argv0
(
argc
,
argv
);
if
(
basename
(
argv
[
0
])
==
"magisk"
sv
)
{
string_view
base
=
basename
(
argv
[
0
]);
if
(
base
==
"magisk"
||
base
==
"magisk32"
||
base
==
"magisk64"
)
{
if
(
argc
>
1
&&
argv
[
1
][
0
]
!=
'-'
)
{
if
(
argc
>
1
&&
argv
[
1
][
0
]
!=
'-'
)
{
// Calling applet via magisk [applet] args
// Calling applet via magisk [applet] args
--
argc
;
--
argc
;
...
...
native/jni/core/restorecon.cpp
View file @
d2bc2cfc
...
@@ -93,10 +93,9 @@ void restore_tmpcon() {
...
@@ -93,10 +93,9 @@ void restore_tmpcon() {
auto
dir
=
xopen_dir
(
MAGISKTMP
.
data
());
auto
dir
=
xopen_dir
(
MAGISKTMP
.
data
());
int
dfd
=
dirfd
(
dir
.
get
());
int
dfd
=
dirfd
(
dir
.
get
());
for
(
dirent
*
entry
;
(
entry
=
xreaddir
(
dir
.
get
()));)
{
for
(
dirent
*
entry
;
(
entry
=
xreaddir
(
dir
.
get
()));)
if
(
SDK_INT
>=
26
&&
entry
->
d_name
==
"magisk"
sv
)
setfilecon_at
(
dfd
,
entry
->
d_name
,
EXEC_CON
);
else
setfilecon_at
(
dfd
,
entry
->
d_name
,
SYSTEM_CON
);
setfilecon_at
(
dfd
,
entry
->
d_name
,
SYSTEM_CON
);
}
string
magisk
=
MAGISKTMP
+
"/magisk"
;
setfilecon
(
magisk
.
data
(),
EXEC_CON
);
}
}
native/jni/init/rootdir.cpp
View file @
d2bc2cfc
...
@@ -175,7 +175,8 @@ static void magic_mount(const string &sdir, const string &ddir = "") {
...
@@ -175,7 +175,8 @@ static void magic_mount(const string &sdir, const string &ddir = "") {
}
}
static
void
patch_socket_name
(
const
char
*
path
)
{
static
void
patch_socket_name
(
const
char
*
path
)
{
char
rstr
[
16
];
static
char
rstr
[
16
]
=
{
0
};
if
(
rstr
[
0
]
==
'\0'
)
gen_rand_str
(
rstr
,
sizeof
(
rstr
));
gen_rand_str
(
rstr
,
sizeof
(
rstr
));
auto
bin
=
mmap_data
::
rw
(
path
);
auto
bin
=
mmap_data
::
rw
(
path
);
bin
.
patch
({
make_pair
(
MAIN_SOCKET
,
rstr
)
});
bin
.
patch
({
make_pair
(
MAIN_SOCKET
,
rstr
)
});
...
@@ -289,12 +290,23 @@ void SARBase::patch_rootdir() {
...
@@ -289,12 +290,23 @@ void SARBase::patch_rootdir() {
// Extract magisk
// Extract magisk
{
{
auto
magisk
=
mmap_data
::
ro
(
"magisk.xz"
);
auto
magisk
=
mmap_data
::
ro
(
"magisk
32
.xz"
);
unlink
(
"magisk.xz"
);
unlink
(
"magisk
32
.xz"
);
int
fd
=
xopen
(
"magisk"
,
O_WRONLY
|
O_CREAT
,
0755
);
int
fd
=
xopen
(
"magisk
32
"
,
O_WRONLY
|
O_CREAT
,
0755
);
unxz
(
fd
,
magisk
.
buf
,
magisk
.
sz
);
unxz
(
fd
,
magisk
.
buf
,
magisk
.
sz
);
close
(
fd
);
close
(
fd
);
patch_socket_name
(
"magisk"
);
patch_socket_name
(
"magisk32"
);
if
(
access
(
"magisk64.xz"
,
F_OK
)
==
0
)
{
magisk
=
mmap_data
::
ro
(
"magisk64.xz"
);
unlink
(
"magisk64.xz"
);
fd
=
xopen
(
"magisk64"
,
O_WRONLY
|
O_CREAT
,
0755
);
unxz
(
fd
,
magisk
.
buf
,
magisk
.
sz
);
close
(
fd
);
patch_socket_name
(
"magisk64"
);
xsymlink
(
"./magisk64"
,
"magisk"
);
}
else
{
xsymlink
(
"./magisk32"
,
"magisk"
);
}
}
}
// Mount rootdir
// Mount rootdir
...
@@ -352,22 +364,33 @@ void MagiskProxy::start() {
...
@@ -352,22 +364,33 @@ void MagiskProxy::start() {
// Backup stuffs before removing them
// Backup stuffs before removing them
self
=
mmap_data
::
ro
(
"/sbin/magisk"
);
self
=
mmap_data
::
ro
(
"/sbin/magisk"
);
config
=
mmap_data
::
ro
(
"/.backup/.magisk"
);
config
=
mmap_data
::
ro
(
"/.backup/.magisk"
);
auto
magisk
=
mmap_data
::
ro
(
"/sbin/magisk.xz"
);
auto
magisk
=
mmap_data
::
ro
(
"/sbin/magisk32.xz"
);
auto
magisk64
=
mmap_data
::
ro
(
"/sbin/magisk64.xz"
);
char
custom_rules_dir
[
64
];
char
custom_rules_dir
[
64
];
custom_rules_dir
[
0
]
=
'\0'
;
custom_rules_dir
[
0
]
=
'\0'
;
xreadlink
(
TMP_RULESDIR
,
custom_rules_dir
,
sizeof
(
custom_rules_dir
));
xreadlink
(
TMP_RULESDIR
,
custom_rules_dir
,
sizeof
(
custom_rules_dir
));
unlink
(
"/sbin/magisk"
);
unlink
(
"/sbin/magisk"
);
unlink
(
"/sbin/magisk.xz"
);
unlink
(
"/sbin/magisk32.xz"
);
unlink
(
"/sbin/magisk64.xz"
);
rm_rf
(
"/.backup"
);
rm_rf
(
"/.backup"
);
setup_tmp
(
"/sbin"
);
setup_tmp
(
"/sbin"
);
// Extract magisk
// Extract magisk
int
fd
=
xopen
(
"/sbin/magisk"
,
O_WRONLY
|
O_CREAT
,
0755
);
int
fd
=
xopen
(
"/sbin/magisk
32
"
,
O_WRONLY
|
O_CREAT
,
0755
);
unxz
(
fd
,
magisk
.
buf
,
magisk
.
sz
);
unxz
(
fd
,
magisk
.
buf
,
magisk
.
sz
);
close
(
fd
);
close
(
fd
);
patch_socket_name
(
"/sbin/magisk"
);
patch_socket_name
(
"/sbin/magisk32"
);
if
(
magisk64
.
sz
)
{
fd
=
xopen
(
"/sbin/magisk64"
,
O_WRONLY
|
O_CREAT
,
0755
);
unxz
(
fd
,
magisk64
.
buf
,
magisk64
.
sz
);
close
(
fd
);
patch_socket_name
(
"/sbin/magisk64"
);
xsymlink
(
"./magisk64"
,
"/sbin/magisk"
);
}
else
{
xsymlink
(
"./magisk32"
,
"/sbin/magisk"
);
}
// Create symlinks pointing back to /root
// Create symlinks pointing back to /root
recreate_sbin
(
"/root"
,
false
);
recreate_sbin
(
"/root"
,
false
);
...
...
native/jni/magiskboot/ramdisk.cpp
View file @
d2bc2cfc
#include <string.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <utils.hpp>
#include <utils.hpp>
#include <cpio.hpp>
#include <cpio.hpp>
...
@@ -35,7 +31,7 @@ public:
...
@@ -35,7 +31,7 @@ public:
bool
check_env
(
const
char
*
name
)
{
bool
check_env
(
const
char
*
name
)
{
const
char
*
val
=
getenv
(
name
);
const
char
*
val
=
getenv
(
name
);
return
val
?
strcmp
(
val
,
"true"
)
==
0
:
false
;
return
val
?
val
==
"true"
sv
:
false
;
}
}
void
magisk_cpio
::
patch
()
{
void
magisk_cpio
::
patch
()
{
...
@@ -284,60 +280,62 @@ int cpio_commands(int argc, char *argv[]) {
...
@@ -284,60 +280,62 @@ int cpio_commands(int argc, char *argv[]) {
int
cmdc
;
int
cmdc
;
char
*
cmdv
[
6
];
char
*
cmdv
[
6
];
while
(
argc
)
{
for
(
int
i
=
0
;
i
<
argc
;
++
i
)
{
//
Clean up
//
Reset
cmdc
=
0
;
cmdc
=
0
;
memset
(
cmdv
,
NULL
,
sizeof
(
cmdv
));
memset
(
cmdv
,
0
,
sizeof
(
cmdv
));
// Split the commands
// Split the commands
for
(
char
*
tok
=
strtok
(
argv
[
0
],
" "
);
tok
;
tok
=
strtok
(
nullptr
,
" "
))
char
*
tok
=
strtok
(
argv
[
i
],
" "
);
while
(
tok
&&
cmdc
<
std
::
size
(
cmdv
))
{
if
(
cmdc
==
0
&&
tok
[
0
]
==
'#'
)
break
;
cmdv
[
cmdc
++
]
=
tok
;
cmdv
[
cmdc
++
]
=
tok
;
tok
=
strtok
(
nullptr
,
" "
);
}
if
(
cmdc
==
0
)
if
(
cmdc
==
0
)
continue
;
continue
;
if
(
strcmp
(
cmdv
[
0
],
"test"
)
==
0
)
{
if
(
cmdv
[
0
]
==
"test"
sv
)
{
exit
(
cpio
.
test
());
exit
(
cpio
.
test
());
}
else
if
(
strcmp
(
cmdv
[
0
],
"restore"
)
==
0
)
{
}
else
if
(
cmdv
[
0
]
==
"restore"
sv
)
{
cpio
.
restore
();
cpio
.
restore
();
}
else
if
(
strcmp
(
cmdv
[
0
],
"sha1"
)
==
0
)
{
}
else
if
(
cmdv
[
0
]
==
"sha1"
sv
)
{
char
*
sha1
=
cpio
.
sha1
();
char
*
sha1
=
cpio
.
sha1
();
if
(
sha1
)
printf
(
"%s
\n
"
,
sha1
);
if
(
sha1
)
printf
(
"%s
\n
"
,
sha1
);
return
0
;
return
0
;
}
else
if
(
strcmp
(
cmdv
[
0
],
"compress"
)
==
0
){
}
else
if
(
cmdv
[
0
]
==
"compress"
sv
){
cpio
.
compress
();
cpio
.
compress
();
}
else
if
(
strcmp
(
cmdv
[
0
],
"decompress"
)
==
0
){
}
else
if
(
cmdv
[
0
]
==
"decompress"
sv
){
cpio
.
decompress
();
cpio
.
decompress
();
}
else
if
(
strcmp
(
cmdv
[
0
],
"patch"
)
==
0
)
{
}
else
if
(
cmdv
[
0
]
==
"patch"
sv
)
{
cpio
.
patch
();
cpio
.
patch
();
}
else
if
(
cmdc
==
2
&&
strcmp
(
cmdv
[
0
],
"exists"
)
==
0
)
{
}
else
if
(
cmdc
==
2
&&
cmdv
[
0
]
==
"exists"
sv
)
{
exit
(
!
cpio
.
exists
(
cmdv
[
1
]));
exit
(
!
cpio
.
exists
(
cmdv
[
1
]));
}
else
if
(
cmdc
==
2
&&
strcmp
(
cmdv
[
0
],
"backup"
)
==
0
)
{
}
else
if
(
cmdc
==
2
&&
cmdv
[
0
]
==
"backup"
sv
)
{
cpio
.
backup
(
cmdv
[
1
]);
cpio
.
backup
(
cmdv
[
1
]);
}
else
if
(
cmdc
>=
2
&&
strcmp
(
cmdv
[
0
],
"rm"
)
==
0
)
{
}
else
if
(
cmdc
>=
2
&&
cmdv
[
0
]
==
"rm"
sv
)
{
bool
r
=
cmdc
>
2
&&
strcmp
(
cmdv
[
1
],
"-r"
)
==
0
;
bool
r
=
cmdc
>
2
&&
cmdv
[
1
]
==
"-r"
sv
;
cpio
.
rm
(
cmdv
[
1
+
r
],
r
);
cpio
.
rm
(
cmdv
[
1
+
r
],
r
);
}
else
if
(
cmdc
==
3
&&
strcmp
(
cmdv
[
0
],
"mv"
)
==
0
)
{
}
else
if
(
cmdc
==
3
&&
cmdv
[
0
]
==
"mv"
sv
)
{
cpio
.
mv
(
cmdv
[
1
],
cmdv
[
2
]);
cpio
.
mv
(
cmdv
[
1
],
cmdv
[
2
]);
}
else
if
(
strcmp
(
cmdv
[
0
],
"extract"
)
==
0
)
{
}
else
if
(
cmdv
[
0
]
==
"extract"
sv
)
{
if
(
cmdc
==
3
)
{
if
(
cmdc
==
3
)
{
return
!
cpio
.
extract
(
cmdv
[
1
],
cmdv
[
2
]);
return
!
cpio
.
extract
(
cmdv
[
1
],
cmdv
[
2
]);
}
else
{
}
else
{
cpio
.
extract
();
cpio
.
extract
();
return
0
;
return
0
;
}
}
}
else
if
(
cmdc
==
3
&&
strcmp
(
cmdv
[
0
],
"mkdir"
)
==
0
)
{
}
else
if
(
cmdc
==
3
&&
cmdv
[
0
]
==
"mkdir"
sv
)
{
cpio
.
mkdir
(
strtoul
(
cmdv
[
1
],
nullptr
,
8
),
cmdv
[
2
]);
cpio
.
mkdir
(
strtoul
(
cmdv
[
1
],
nullptr
,
8
),
cmdv
[
2
]);
}
else
if
(
cmdc
==
3
&&
strcmp
(
cmdv
[
0
],
"ln"
)
==
0
)
{
}
else
if
(
cmdc
==
3
&&
cmdv
[
0
]
==
"ln"
sv
)
{
cpio
.
ln
(
cmdv
[
1
],
cmdv
[
2
]);
cpio
.
ln
(
cmdv
[
1
],
cmdv
[
2
]);
}
else
if
(
cmdc
==
4
&&
strcmp
(
cmdv
[
0
],
"add"
)
==
0
)
{
}
else
if
(
cmdc
==
4
&&
cmdv
[
0
]
==
"add"
sv
)
{
cpio
.
add
(
strtoul
(
cmdv
[
1
],
nullptr
,
8
),
cmdv
[
2
],
cmdv
[
3
]);
cpio
.
add
(
strtoul
(
cmdv
[
1
],
nullptr
,
8
),
cmdv
[
2
],
cmdv
[
3
]);
}
else
{
}
else
{
return
1
;
return
1
;
}
}
--
argc
;
++
argv
;
}
}
cpio
.
dump
(
incpio
);
cpio
.
dump
(
incpio
);
...
...
scripts/boot_patch.sh
View file @
d2bc2cfc
...
@@ -53,8 +53,8 @@ if [ -z $SOURCEDMODE ]; then
...
@@ -53,8 +53,8 @@ if [ -z $SOURCEDMODE ]; then
cd
"
`
getdir
"
${
BASH_SOURCE
:-
$0
}
"
`
"
cd
"
`
getdir
"
${
BASH_SOURCE
:-
$0
}
"
`
"
# Load utility functions
# Load utility functions
.
./util_functions.sh
.
./util_functions.sh
#
Detect version and architecture
#
Check if 64-bit
api_level_arch_detect
[
-d
/system/lib64
]
&&
IS64BIT
=
true
||
IS64BIT
=
false
fi
fi
BOOTIMAGE
=
"
$1
"
BOOTIMAGE
=
"
$1
"
...
@@ -135,23 +135,22 @@ echo "RECOVERYMODE=$RECOVERYMODE" >> config
...
@@ -135,23 +135,22 @@ echo "RECOVERYMODE=$RECOVERYMODE" >> config
[
!
-z
$SHA1
]
&&
echo
"SHA1=
$SHA1
"
>>
config
[
!
-z
$SHA1
]
&&
echo
"SHA1=
$SHA1
"
>>
config
# Compress to save precious ramdisk space
# Compress to save precious ramdisk space
if
$IS64BIT
;
then
./magiskboot
compress
=
xz magisk32 magisk32.xz
./magiskboot
compress
=
xz magisk64 magisk.xz
./magiskboot
compress
=
xz magisk64 magisk64.xz
else
$IS64BIT
&&
SKIP64
=
""
||
SKIP64
=
"#"
./magiskboot
compress
=
xz magisk32 magisk.xz
fi
./magiskboot cpio ramdisk.cpio
\
./magiskboot cpio ramdisk.cpio
\
"add 750 init magiskinit"
\
"add
0
750 init magiskinit"
\
"mkdir 0750 overlay.d"
\
"mkdir 0750 overlay.d"
\
"mkdir 0750 overlay.d/sbin"
\
"mkdir 0750 overlay.d/sbin"
\
"add 750 overlay.d/sbin/magisk.xz magisk.xz"
\
"add 0644 overlay.d/sbin/magisk32.xz magisk32.xz"
\
"
$SKIP64
add 0644 overlay.d/sbin/magisk64.xz magisk64.xz"
\
"patch"
\
"patch"
\
"backup ramdisk.cpio.orig"
\
"backup ramdisk.cpio.orig"
\
"mkdir 000 .backup"
\
"mkdir 000 .backup"
\
"add 000 .backup/.magisk config"
"add 000 .backup/.magisk config"
rm
-f
ramdisk.cpio.orig config magisk.xz
rm
-f
ramdisk.cpio.orig config magisk
*
.xz
#################
#################
# Binary Patches
# Binary Patches
...
...
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