Fix `systemMain` being inlined in Android 13

This commit is contained in:
LoveSy 2022-02-12 18:22:08 +08:00 committed by 双草酸酯
parent efa0fb4645
commit ef1439a3f3
6 changed files with 19 additions and 17 deletions

View File

@ -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",

View File

@ -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_);

View File

@ -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",

View File

@ -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);
} }

View File

@ -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);

View File

@ -0,0 +1,4 @@
package com.android.internal.os;
public class ZygoteInit {
}