You've already forked ReZygisk
mirror of
https://github.com/PerformanC/ReZygisk.git
synced 2025-09-06 06:37:01 +00:00
@@ -6,6 +6,8 @@ edition = "2021"
|
||||
rust-version = "1.69"
|
||||
|
||||
[dependencies]
|
||||
csv = "1.3.0"
|
||||
serde = { version = "1.0.130", features = ["derive"] }
|
||||
android_logger = "0.13"
|
||||
anyhow = { version = "1.0", features = ["backtrace"] }
|
||||
bitflags = { version = "2.3" }
|
||||
|
||||
@@ -3,6 +3,7 @@ plugins {
|
||||
alias(libs.plugins.rust.android)
|
||||
}
|
||||
|
||||
val minApatchVersion: Int by rootProject.extra
|
||||
val minKsuVersion: Int by rootProject.extra
|
||||
val maxKsuVersion: Int by rootProject.extra
|
||||
val minMagiskVersion: Int by rootProject.extra
|
||||
@@ -17,6 +18,7 @@ android.buildFeatures {
|
||||
|
||||
cargo {
|
||||
module = "."
|
||||
pythonCommand = "python3"
|
||||
libname = "zygiskd"
|
||||
targetIncludes = arrayOf("zygiskd")
|
||||
targets = listOf("arm64", "arm", "x86", "x86_64")
|
||||
@@ -25,6 +27,7 @@ cargo {
|
||||
profile = if (isDebug) "debug" else "release"
|
||||
exec = { spec, _ ->
|
||||
spec.environment("ANDROID_NDK_HOME", android.ndkDirectory.path)
|
||||
spec.environment("MIN_APATCH_VERSION", minApatchVersion)
|
||||
spec.environment("MIN_KSU_VERSION", minKsuVersion)
|
||||
spec.environment("MAX_KSU_VERSION", maxKsuVersion)
|
||||
spec.environment("MIN_MAGISK_VERSION", minMagiskVersion)
|
||||
|
||||
@@ -5,6 +5,7 @@ use konst::unwrap_ctx;
|
||||
use log::LevelFilter;
|
||||
use num_enum::TryFromPrimitive;
|
||||
|
||||
pub const MIN_APATCH_VERSION: i32 = unwrap_ctx!(parse_i32(env!("MIN_APATCH_VERSION")));
|
||||
pub const MIN_KSU_VERSION: i32 = unwrap_ctx!(parse_i32(env!("MIN_KSU_VERSION")));
|
||||
pub const MAX_KSU_VERSION: i32 = unwrap_ctx!(parse_i32(env!("MAX_KSU_VERSION")));
|
||||
pub const MIN_MAGISK_VERSION: i32 = unwrap_ctx!(parse_i32(env!("MIN_MAGISK_VERSION")));
|
||||
@@ -42,6 +43,7 @@ bitflags! {
|
||||
const PROCESS_GRANTED_ROOT = 1 << 0;
|
||||
const PROCESS_ON_DENYLIST = 1 << 1;
|
||||
const PROCESS_IS_MANAGER = 1 << 28;
|
||||
const PROCESS_ROOT_IS_APATCH = 1 << 27;
|
||||
const PROCESS_ROOT_IS_KSU = 1 << 29;
|
||||
const PROCESS_ROOT_IS_MAGISK = 1 << 30;
|
||||
const PROCESS_IS_SYSUI = 1 << 31;
|
||||
|
||||
113
zygiskd/src/root_impl/apatch.rs
Normal file
113
zygiskd/src/root_impl/apatch.rs
Normal file
@@ -0,0 +1,113 @@
|
||||
use std::process::{Command, Stdio};
|
||||
use std::fs::File;
|
||||
use serde::Deserialize;
|
||||
use crate::constants::MIN_APATCH_VERSION;
|
||||
|
||||
pub enum Version {
|
||||
Supported,
|
||||
TooOld,
|
||||
Abnormal,
|
||||
}
|
||||
fn parse_version(output: &str) -> i32 {
|
||||
let mut version: Option<i32> = None;
|
||||
for line in output.lines() {
|
||||
if let Some(num) = line.trim().split_whitespace().last() {
|
||||
if let Ok(v) = num.parse::<i32>() {
|
||||
version = Some(v);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
version.unwrap_or_default()
|
||||
}
|
||||
|
||||
pub fn get_apatch() -> Option<Version> {
|
||||
let output1 = Command::new("/data/adb/apd")
|
||||
.arg("-V")
|
||||
.stdout(Stdio::piped())
|
||||
.stderr(Stdio::null())
|
||||
.output()
|
||||
.ok()?;
|
||||
let stdout1 = String::from_utf8(output1.stdout).ok()?;
|
||||
let version = parse_version(&stdout1);
|
||||
const MAX_OLD_VERSION: i32 = MIN_APATCH_VERSION - 1;
|
||||
match version {
|
||||
0 => Some(Version::Abnormal),
|
||||
v if v >= MIN_APATCH_VERSION && v <= 999999 => Some(Version::Supported),
|
||||
v if v >= 1 && v <= MAX_OLD_VERSION => Some(Version::TooOld),
|
||||
_ => None,
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Deserialize)]
|
||||
#[allow(dead_code)]
|
||||
struct PackageConfig {
|
||||
pkg: String,
|
||||
exclude: i32,
|
||||
allow: i32,
|
||||
uid: i32,
|
||||
to_uid: i32,
|
||||
sctx: String,
|
||||
}
|
||||
|
||||
fn read_package_config() -> Result<Vec<PackageConfig>, std::io::Error> {
|
||||
let file = File::open("/data/adb/ap/package_config")?;
|
||||
let mut reader = csv::Reader::from_reader(file);
|
||||
|
||||
let mut package_configs = Vec::new();
|
||||
for record in reader.deserialize() {
|
||||
match record {
|
||||
Ok(config) => package_configs.push(config),
|
||||
Err(error) => {
|
||||
log::warn!("Error deserializing record: {}", error);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Ok(package_configs)
|
||||
}
|
||||
|
||||
pub fn uid_granted_root(uid: i32) -> bool {
|
||||
match read_package_config() {
|
||||
Ok(package_configs) => {
|
||||
package_configs
|
||||
.iter()
|
||||
.find(|config| config.uid == uid)
|
||||
.map(|config| config.allow == 1)
|
||||
.unwrap_or(false)
|
||||
}
|
||||
Err(err) => {
|
||||
log::warn!("Error reading package config: {}", err);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
pub fn uid_should_umount(uid: i32) -> bool {
|
||||
match read_package_config() {
|
||||
Ok(package_configs) => {
|
||||
package_configs
|
||||
.iter()
|
||||
.find(|config| config.uid == uid)
|
||||
.map(|config| {
|
||||
match config.exclude {
|
||||
1 => true,
|
||||
_ => false,
|
||||
}
|
||||
})
|
||||
.unwrap_or(false)
|
||||
}
|
||||
Err(err) => {
|
||||
log::warn!("Error reading package configs: {}", err);
|
||||
false
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// TODO: signature
|
||||
pub fn uid_is_manager(uid: i32) -> bool {
|
||||
if let Ok(s) = rustix::fs::stat("/data/user_de/0/me.bmax.apatch") {
|
||||
return s.st_uid == uid as u32;
|
||||
}
|
||||
false
|
||||
}
|
||||
@@ -2,6 +2,7 @@ use std::ptr::addr_of;
|
||||
|
||||
mod kernelsu;
|
||||
mod magisk;
|
||||
mod apatch;
|
||||
|
||||
#[derive(Debug)]
|
||||
pub enum RootImpl {
|
||||
@@ -11,26 +12,34 @@ pub enum RootImpl {
|
||||
Multiple,
|
||||
KernelSU,
|
||||
Magisk,
|
||||
APatch,
|
||||
}
|
||||
|
||||
static mut ROOT_IMPL: RootImpl = RootImpl::None;
|
||||
|
||||
pub fn setup() {
|
||||
let apatch_version = apatch::get_apatch();
|
||||
let ksu_version = kernelsu::get_kernel_su();
|
||||
let magisk_version = magisk::get_magisk();
|
||||
|
||||
let impl_ = match (ksu_version, magisk_version) {
|
||||
(None, None) => RootImpl::None,
|
||||
(Some(_), Some(_)) => RootImpl::Multiple,
|
||||
(Some(ksu_version), None) => match ksu_version {
|
||||
let impl_ = match (apatch_version, ksu_version, magisk_version) {
|
||||
(None, None, None) => RootImpl::None,
|
||||
(Some(_), Some(_), Some(_)) => RootImpl::Multiple,
|
||||
(Some(apatch_version),None, None) => match apatch_version {
|
||||
apatch::Version::Supported => RootImpl::APatch,
|
||||
apatch::Version::TooOld => RootImpl::TooOld,
|
||||
apatch::Version::Abnormal => RootImpl::Abnormal,
|
||||
},
|
||||
(None,Some(ksu_version), None) => match ksu_version {
|
||||
kernelsu::Version::Supported => RootImpl::KernelSU,
|
||||
kernelsu::Version::TooOld => RootImpl::TooOld,
|
||||
kernelsu::Version::Abnormal => RootImpl::Abnormal,
|
||||
},
|
||||
(None, Some(magisk_version)) => match magisk_version {
|
||||
(None, None, Some(magisk_version)) => match magisk_version {
|
||||
magisk::Version::Supported => RootImpl::Magisk,
|
||||
magisk::Version::TooOld => RootImpl::TooOld,
|
||||
},
|
||||
_ => RootImpl::None,
|
||||
};
|
||||
unsafe {
|
||||
ROOT_IMPL = impl_;
|
||||
@@ -45,6 +54,7 @@ pub fn uid_granted_root(uid: i32) -> bool {
|
||||
match get_impl() {
|
||||
RootImpl::KernelSU => kernelsu::uid_granted_root(uid),
|
||||
RootImpl::Magisk => magisk::uid_granted_root(uid),
|
||||
RootImpl::APatch => apatch::uid_granted_root(uid),
|
||||
_ => panic!("uid_granted_root: unknown root impl {:?}", get_impl()),
|
||||
}
|
||||
}
|
||||
@@ -53,6 +63,7 @@ pub fn uid_should_umount(uid: i32) -> bool {
|
||||
match get_impl() {
|
||||
RootImpl::KernelSU => kernelsu::uid_should_umount(uid),
|
||||
RootImpl::Magisk => magisk::uid_should_umount(uid),
|
||||
RootImpl::APatch => apatch::uid_should_umount(uid),
|
||||
_ => panic!("uid_should_umount: unknown root impl {:?}", get_impl()),
|
||||
}
|
||||
}
|
||||
@@ -61,6 +72,7 @@ pub fn uid_is_manager(uid: i32) -> bool {
|
||||
match get_impl() {
|
||||
RootImpl::KernelSU => kernelsu::uid_is_manager(uid),
|
||||
RootImpl::Magisk => magisk::uid_is_manager(uid),
|
||||
RootImpl::APatch => apatch::uid_is_manager(uid),
|
||||
_ => panic!("uid_is_manager: unknown root impl {:?}", get_impl()),
|
||||
}
|
||||
}
|
||||
|
||||
@@ -51,7 +51,7 @@ pub fn main() -> Result<()> {
|
||||
{
|
||||
let mut msg = Vec::<u8>::new();
|
||||
let info = match root_impl::get_impl() {
|
||||
root_impl::RootImpl::KernelSU | root_impl::RootImpl::Magisk => {
|
||||
root_impl::RootImpl::KernelSU | root_impl::RootImpl::Magisk | root_impl::RootImpl::APatch => {
|
||||
msg.extend_from_slice(&constants::DAEMON_SET_INFO.to_le_bytes());
|
||||
let module_names: Vec<_> = modules.iter().map(|m| m.name.as_str()).collect();
|
||||
format!(
|
||||
@@ -254,6 +254,7 @@ fn handle_daemon_action(
|
||||
match root_impl::get_impl() {
|
||||
root_impl::RootImpl::KernelSU => flags |= ProcessFlags::PROCESS_ROOT_IS_KSU,
|
||||
root_impl::RootImpl::Magisk => flags |= ProcessFlags::PROCESS_ROOT_IS_MAGISK,
|
||||
root_impl::RootImpl::APatch => flags |= ProcessFlags::PROCESS_ROOT_IS_APATCH,
|
||||
_ => panic!("wrong root impl: {:?}", root_impl::get_impl()),
|
||||
}
|
||||
trace!(
|
||||
|
||||
Reference in New Issue
Block a user