Fix `systemMain` being inlined in Android 13
This commit is contained in:
parent
efa0fb4645
commit
ef1439a3f3
|
|
@ -319,11 +319,11 @@ namespace lspd {
|
||||||
if (*allowUnload) api_->setOption(zygisk::DLCLOSE_MODULE_LIBRARY);
|
if (*allowUnload) api_->setOption(zygisk::DLCLOSE_MODULE_LIBRARY);
|
||||||
}
|
}
|
||||||
|
|
||||||
void preServerSpecialize(zygisk::ServerSpecializeArgs *) override {
|
void preServerSpecialize([[maybe_unused]] zygisk::ServerSpecializeArgs *args) override {
|
||||||
Context::GetInstance()->OnNativeForkSystemServerPre(env_);
|
Context::GetInstance()->OnNativeForkSystemServerPre(env_);
|
||||||
}
|
}
|
||||||
|
|
||||||
void postServerSpecialize(const zygisk::ServerSpecializeArgs *) override {
|
void postServerSpecialize([[maybe_unused]] const zygisk::ServerSpecializeArgs *args) override {
|
||||||
if (__system_property_find("ro.vendor.product.ztename")) {
|
if (__system_property_find("ro.vendor.product.ztename")) {
|
||||||
auto *process = env_->FindClass("android/os/Process");
|
auto *process = env_->FindClass("android/os/Process");
|
||||||
auto *set_argv0 = env_->GetStaticMethodID(process, "setArgV0",
|
auto *set_argv0 = env_->GetStaticMethodID(process, "setArgV0",
|
||||||
|
|
|
||||||
|
|
@ -322,7 +322,7 @@ namespace lspd {
|
||||||
}
|
}
|
||||||
auto parcel_fd = JNI_CallObjectMethod(env, reply, read_file_descriptor_method_);
|
auto parcel_fd = JNI_CallObjectMethod(env, reply, read_file_descriptor_method_);
|
||||||
int fd = JNI_CallIntMethod(env, parcel_fd, detach_fd_method_);
|
int fd = JNI_CallIntMethod(env, parcel_fd, detach_fd_method_);
|
||||||
auto size = JNI_CallLongMethod(env, reply, read_long_method_);
|
auto size = static_cast<size_t>(JNI_CallLongMethod(env, reply, read_long_method_));
|
||||||
JNI_CallVoidMethod(env, data, recycleMethod_);
|
JNI_CallVoidMethod(env, data, recycleMethod_);
|
||||||
JNI_CallVoidMethod(env, reply, recycleMethod_);
|
JNI_CallVoidMethod(env, reply, recycleMethod_);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -28,13 +28,15 @@ import android.os.Environment;
|
||||||
import android.os.IBinder;
|
import android.os.IBinder;
|
||||||
import android.os.Process;
|
import android.os.Process;
|
||||||
|
|
||||||
|
import com.android.internal.os.ZygoteInit;
|
||||||
|
|
||||||
import org.lsposed.lspd.BuildConfig;
|
import org.lsposed.lspd.BuildConfig;
|
||||||
import org.lsposed.lspd.config.LSPApplicationServiceClient;
|
import org.lsposed.lspd.config.LSPApplicationServiceClient;
|
||||||
import org.lsposed.lspd.deopt.PrebuiltMethodsDeopter;
|
import org.lsposed.lspd.deopt.PrebuiltMethodsDeopter;
|
||||||
import org.lsposed.lspd.hooker.CrashDumpHooker;
|
import org.lsposed.lspd.hooker.CrashDumpHooker;
|
||||||
import org.lsposed.lspd.hooker.HandleBindAppHooker;
|
import org.lsposed.lspd.hooker.HandleBindAppHooker;
|
||||||
import org.lsposed.lspd.hooker.LoadedApkCstrHooker;
|
import org.lsposed.lspd.hooker.LoadedApkCstrHooker;
|
||||||
import org.lsposed.lspd.hooker.SystemMainHooker;
|
import org.lsposed.lspd.hooker.HandleSystemServerProcessHooker;
|
||||||
import org.lsposed.lspd.util.ParasiticManagerHooker;
|
import org.lsposed.lspd.util.ParasiticManagerHooker;
|
||||||
import org.lsposed.lspd.util.Utils;
|
import org.lsposed.lspd.util.Utils;
|
||||||
import org.lsposed.lspd.yahfa.hooker.YahfaHooker;
|
import org.lsposed.lspd.yahfa.hooker.YahfaHooker;
|
||||||
|
|
@ -51,8 +53,8 @@ public class Main {
|
||||||
XposedHelpers.findAndHookMethod(Thread.class, "dispatchUncaughtException",
|
XposedHelpers.findAndHookMethod(Thread.class, "dispatchUncaughtException",
|
||||||
Throwable.class, new CrashDumpHooker());
|
Throwable.class, new CrashDumpHooker());
|
||||||
if (isSystem) {
|
if (isSystem) {
|
||||||
XposedHelpers.findAndHookMethod(ActivityThread.class,
|
XposedBridge.hookAllMethods(ZygoteInit.class,
|
||||||
"systemMain", new SystemMainHooker());
|
"handleSystemServerProcess", new HandleSystemServerProcessHooker());
|
||||||
}
|
}
|
||||||
XposedHelpers.findAndHookMethod(ActivityThread.class,
|
XposedHelpers.findAndHookMethod(ActivityThread.class,
|
||||||
"handleBindApplication",
|
"handleBindApplication",
|
||||||
|
|
|
||||||
|
|
@ -20,33 +20,29 @@
|
||||||
|
|
||||||
package org.lsposed.lspd.hooker;
|
package org.lsposed.lspd.hooker;
|
||||||
|
|
||||||
import android.os.Build;
|
|
||||||
|
|
||||||
import org.lsposed.lspd.deopt.PrebuiltMethodsDeopter;
|
import org.lsposed.lspd.deopt.PrebuiltMethodsDeopter;
|
||||||
import org.lsposed.lspd.util.Hookers;
|
import org.lsposed.lspd.util.Hookers;
|
||||||
|
|
||||||
import de.robv.android.xposed.XC_MethodHook;
|
import de.robv.android.xposed.XC_MethodHook;
|
||||||
|
import de.robv.android.xposed.XposedBridge;
|
||||||
import de.robv.android.xposed.XposedHelpers;
|
import de.robv.android.xposed.XposedHelpers;
|
||||||
|
|
||||||
// system_server initialization
|
// system_server initialization
|
||||||
public class SystemMainHooker extends XC_MethodHook {
|
public class HandleSystemServerProcessHooker extends XC_MethodHook {
|
||||||
|
|
||||||
public static volatile ClassLoader systemServerCL;
|
public static volatile ClassLoader systemServerCL;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void afterHookedMethod(MethodHookParam param) {
|
protected void afterHookedMethod(MethodHookParam param) {
|
||||||
Hookers.logD("ActivityThread#systemMain() starts");
|
Hookers.logD("ZygoteInit#handleSystemServerProcess() starts");
|
||||||
try {
|
try {
|
||||||
// get system_server classLoader
|
// get system_server classLoader
|
||||||
systemServerCL = Thread.currentThread().getContextClassLoader();
|
systemServerCL = Thread.currentThread().getContextClassLoader();
|
||||||
// deopt methods in SYSTEMSERVERCLASSPATH
|
// deopt methods in SYSTEMSERVERCLASSPATH
|
||||||
PrebuiltMethodsDeopter.deoptSystemServerMethods(systemServerCL);
|
PrebuiltMethodsDeopter.deoptSystemServerMethods(systemServerCL);
|
||||||
var sbsHooker = new StartBootstrapServicesHooker();
|
XposedBridge.hookAllMethods(
|
||||||
Object[] paramTypesAndCallback = Build.VERSION.SDK_INT >= Build.VERSION_CODES.R ?
|
XposedHelpers.findClass("com.android.server.SystemServer", systemServerCL),
|
||||||
new Object[]{"com.android.server.utils.TimingsTraceAndSlog", sbsHooker} :
|
"startBootstrapServices", new StartBootstrapServicesHooker());
|
||||||
new Object[]{sbsHooker};
|
|
||||||
XposedHelpers.findAndHookMethod("com.android.server.SystemServer",
|
|
||||||
systemServerCL, "startBootstrapServices", paramTypesAndCallback);
|
|
||||||
} catch (Throwable t) {
|
} catch (Throwable t) {
|
||||||
Hookers.logE("error when hooking systemMain", t);
|
Hookers.logE("error when hooking systemMain", t);
|
||||||
}
|
}
|
||||||
|
|
@ -41,7 +41,7 @@ public class StartBootstrapServicesHooker extends XC_MethodHook {
|
||||||
XC_LoadPackage.LoadPackageParam lpparam = new XC_LoadPackage.LoadPackageParam(XposedBridge.sLoadedPackageCallbacks);
|
XC_LoadPackage.LoadPackageParam lpparam = new XC_LoadPackage.LoadPackageParam(XposedBridge.sLoadedPackageCallbacks);
|
||||||
lpparam.packageName = "android";
|
lpparam.packageName = "android";
|
||||||
lpparam.processName = "android"; // it's actually system_server, but other functions return this as well
|
lpparam.processName = "android"; // it's actually system_server, but other functions return this as well
|
||||||
lpparam.classLoader = SystemMainHooker.systemServerCL;
|
lpparam.classLoader = HandleSystemServerProcessHooker.systemServerCL;
|
||||||
lpparam.appInfo = null;
|
lpparam.appInfo = null;
|
||||||
lpparam.isFirstApplication = true;
|
lpparam.isFirstApplication = true;
|
||||||
XC_LoadPackage.callAll(lpparam);
|
XC_LoadPackage.callAll(lpparam);
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,4 @@
|
||||||
|
package com.android.internal.os;
|
||||||
|
|
||||||
|
public class ZygoteInit {
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue