fixup! Add new manager hook
This commit is contained in:
parent
8114710745
commit
de040b9cda
|
|
@ -9,27 +9,11 @@ apply plugin: 'com.android.application'
|
||||||
static def calcSha256(file) {
|
static def calcSha256(file) {
|
||||||
def md = MessageDigest.getInstance("SHA-256")
|
def md = MessageDigest.getInstance("SHA-256")
|
||||||
file.eachByte 4096, { bytes, size ->
|
file.eachByte 4096, { bytes, size ->
|
||||||
md.update(bytes, 0, size);
|
md.update(bytes, 0, size)
|
||||||
}
|
}
|
||||||
return md.digest().encodeHex()
|
return md.digest().encodeHex()
|
||||||
}
|
}
|
||||||
|
|
||||||
// Values set here will be overriden by AppVeyor, feel free to modify during development.
|
|
||||||
def buildVersionName = 'v0.5.1.4'
|
|
||||||
def buildVersionCode = 233
|
|
||||||
|
|
||||||
if (System.env.APPVEYOR_BUILD_VERSION != null) {
|
|
||||||
buildVersionName = "v${System.getenv('appveyor_build_version')}"
|
|
||||||
}
|
|
||||||
|
|
||||||
if (System.env.APPVEYOR_BUILD_NUMBER != null) {
|
|
||||||
// Split is necessary because PRs set the build number to "1234-something".
|
|
||||||
def parts = System.env.APPVEYOR_BUILD_NUMBER.split('-')
|
|
||||||
buildVersionCode = Integer.valueOf(parts[0])
|
|
||||||
}
|
|
||||||
|
|
||||||
version buildVersionName
|
|
||||||
|
|
||||||
ext {
|
ext {
|
||||||
module_name = "LSPosed"
|
module_name = "LSPosed"
|
||||||
jar_dest_dir = "${projectDir}/template_override/system/framework/"
|
jar_dest_dir = "${projectDir}/template_override/system/framework/"
|
||||||
|
|
@ -150,7 +134,7 @@ afterEvaluate {
|
||||||
android.applicationVariants.all { variant ->
|
android.applicationVariants.all { variant ->
|
||||||
def variantCapped = variant.name.capitalize()
|
def variantCapped = variant.name.capitalize()
|
||||||
def variantLowered = variant.name.toLowerCase()
|
def variantLowered = variant.name.toLowerCase()
|
||||||
def zipFileName = "${module_name}-${project.version}-${variantLowered}.zip"
|
def zipFileName = "${module_name}-${rootProject.ext.versionName}-${variantLowered}.zip"
|
||||||
|
|
||||||
task("copyMainDex${variantCapped}", type: Copy) {
|
task("copyMainDex${variantCapped}", type: Copy) {
|
||||||
def dexOutPath = variant.name.contains("release") ?
|
def dexOutPath = variant.name.contains("release") ?
|
||||||
|
|
@ -169,19 +153,13 @@ afterEvaluate {
|
||||||
dependsOn "assemble${variantCapped}"
|
dependsOn "assemble${variantCapped}"
|
||||||
dependsOn tasks.getByPath(":sandhook-hooklib:copySandHook${variantCapped}LibraryToMagiskTemplate")
|
dependsOn tasks.getByPath(":sandhook-hooklib:copySandHook${variantCapped}LibraryToMagiskTemplate")
|
||||||
doFirst {
|
doFirst {
|
||||||
copy {
|
|
||||||
from "${projectDir}/tpl/edconfig.tpl"
|
|
||||||
into templateFrameworkPath
|
|
||||||
rename "edconfig.tpl", "edconfig.jar"
|
|
||||||
expand(version: "$version", apiCode: "$apiCode")
|
|
||||||
}
|
|
||||||
copy {
|
copy {
|
||||||
from "${projectDir}/tpl/module.prop.tpl"
|
from "${projectDir}/tpl/module.prop.tpl"
|
||||||
into templateRootPath
|
into templateRootPath
|
||||||
rename "module.prop.tpl", "module.prop"
|
rename "module.prop.tpl", "module.prop"
|
||||||
expand(moduleId: "$module_id",
|
expand(moduleId: "$module_id",
|
||||||
versionName: "$version",
|
versionName: "$rootProject.ext.versionName",
|
||||||
versionCode: "$versionCode", authorList: "$authors",
|
versionCode: "$rootProject.ext.versionCode", authorList: "$authors",
|
||||||
apiCode: "$apiCode", minApi: "$moduleMinRiruApiVersion")
|
apiCode: "$apiCode", minApi: "$moduleMinRiruApiVersion")
|
||||||
filter(FixCrLfFilter.class, eol: FixCrLfFilter.CrLf.newInstance("lf"))
|
filter(FixCrLfFilter.class, eol: FixCrLfFilter.CrLf.newInstance("lf"))
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -8,9 +8,9 @@ import android.view.LayoutInflater;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.view.ViewGroup;
|
import android.view.ViewGroup;
|
||||||
|
|
||||||
|
import com.elderdrivers.riru.edxp.BuildConfig;
|
||||||
import com.elderdrivers.riru.edxp.config.ConfigManager;
|
import com.elderdrivers.riru.edxp.config.ConfigManager;
|
||||||
import com.elderdrivers.riru.edxp.config.EdXpConfigGlobal;
|
import com.elderdrivers.riru.edxp.config.EdXpConfigGlobal;
|
||||||
import com.elderdrivers.riru.edxp.BuildConfig;
|
|
||||||
import com.elderdrivers.riru.edxp.core.EdxpImpl;
|
import com.elderdrivers.riru.edxp.core.EdxpImpl;
|
||||||
import com.elderdrivers.riru.edxp.core.Main;
|
import com.elderdrivers.riru.edxp.core.Main;
|
||||||
import com.elderdrivers.riru.edxp.util.Utils;
|
import com.elderdrivers.riru.edxp.util.Utils;
|
||||||
|
|
@ -26,26 +26,73 @@ import de.robv.android.xposed.XposedHelpers;
|
||||||
|
|
||||||
public class XposedInstallerHooker {
|
public class XposedInstallerHooker {
|
||||||
|
|
||||||
private static final String LEGACY_INSTALLER_PACKAGE_NAME = "de.robv.android.xposed.installer";
|
|
||||||
|
|
||||||
public static void hookXposedInstaller(final ClassLoader classLoader) {
|
public static void hookXposedInstaller(final ClassLoader classLoader) {
|
||||||
// Deopt manager. It will not throw exception.
|
// EdXposed Manager R
|
||||||
deoptMethod(classLoader, "org.meowcat.edxposed.manager.ModulesFragment", "onActivityCreated", Bundle.class);
|
|
||||||
deoptMethod(classLoader, "org.meowcat.edxposed.manager.ModulesFragment", "showMenu", Context.class, View.class, ApplicationInfo.class);
|
|
||||||
deoptMethod(classLoader, "org.meowcat.edxposed.manager.StatusInstallerFragment", "onCreateView", LayoutInflater.class, ViewGroup.class, Bundle.class);
|
|
||||||
deoptMethod(classLoader, "org.meowcat.edxposed.manager.util.ModuleUtil", "updateModulesList", boolean.class, View.class);
|
|
||||||
|
|
||||||
try {
|
try {
|
||||||
final String xposedAppClass = LEGACY_INSTALLER_PACKAGE_NAME + ".XposedApp";
|
XposedHelpers.findAndHookMethod("org.meowcat.edxposed.manager.Constants", classLoader, "getXposedApiVersion", new XC_MethodReplacement() {
|
||||||
final Class InstallZipUtil = XposedHelpers.findClass(LEGACY_INSTALLER_PACKAGE_NAME
|
@Override
|
||||||
+ ".util.InstallZipUtil", classLoader);
|
protected Object replaceHookedMethod(MethodHookParam param) {
|
||||||
|
return XposedBridge.getXposedVersion();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
XposedHelpers.findAndHookMethod("org.meowcat.edxposed.manager.Constants", classLoader, "getXposedVersion", new XC_MethodReplacement() {
|
||||||
|
@Override
|
||||||
|
protected Object replaceHookedMethod(MethodHookParam param) {
|
||||||
|
return BuildConfig.VERSION_NAME;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
XposedHelpers.findAndHookMethod("org.meowcat.edxposed.manager.Constants", classLoader, "getXposedVersionCode", new XC_MethodReplacement() {
|
||||||
|
@Override
|
||||||
|
protected Object replaceHookedMethod(MethodHookParam param) {
|
||||||
|
return BuildConfig.VERSION_CODE;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
XposedHelpers.findAndHookMethod("org.meowcat.edxposed.manager.Constants", classLoader, "getXposedApiVersion", new XC_MethodReplacement() {
|
||||||
|
@Override
|
||||||
|
protected Object replaceHookedMethod(MethodHookParam param) {
|
||||||
|
return XposedBridge.getXposedVersion();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
XposedHelpers.findAndHookMethod("org.meowcat.edxposed.manager.Constants", classLoader, "getXposedVariant", new XC_MethodReplacement() {
|
||||||
|
@Override
|
||||||
|
protected Object replaceHookedMethod(MethodHookParam param) {
|
||||||
|
String variant = "None";
|
||||||
|
switch (Main.getEdxpVariant()) {
|
||||||
|
case EdxpImpl.NONE:
|
||||||
|
break;
|
||||||
|
case EdxpImpl.YAHFA:
|
||||||
|
variant = "YAHFA";
|
||||||
|
break;
|
||||||
|
case EdxpImpl.SANDHOOK:
|
||||||
|
variant = "SandHook";
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return variant;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
XposedHelpers.findAndHookMethod("org.meowcat.edxposed.manager.Constants", classLoader, "getBaseDir", new XC_MethodReplacement() {
|
||||||
|
@Override
|
||||||
|
protected Object replaceHookedMethod(MethodHookParam param) {
|
||||||
|
return ConfigManager.getBaseConfigPath() + "/";
|
||||||
|
}
|
||||||
|
});
|
||||||
|
Utils.logD("Hooked EdXposed Manager R");
|
||||||
|
return;
|
||||||
|
} catch (Throwable t) {
|
||||||
|
Utils.logW("Could not hook EdXposed Manager R", t);
|
||||||
|
}
|
||||||
|
|
||||||
|
// EdXposed Manager and Xposed Installer
|
||||||
|
try {
|
||||||
|
final String xposedAppClass = "de.robv.android.xposed.installer.XposedApp";
|
||||||
|
final Class<?> InstallZipUtil = XposedHelpers.findClass("de.robv.android.xposed.installer.util.InstallZipUtil", classLoader);
|
||||||
XposedHelpers.findAndHookMethod(xposedAppClass, classLoader, "getActiveXposedVersion",
|
XposedHelpers.findAndHookMethod(xposedAppClass, classLoader, "getActiveXposedVersion",
|
||||||
XC_MethodReplacement.returnConstant(XposedBridge.getXposedVersion())
|
XC_MethodReplacement.returnConstant(XposedBridge.getXposedVersion())
|
||||||
);
|
);
|
||||||
XposedHelpers.findAndHookMethod(xposedAppClass, classLoader,
|
XposedHelpers.findAndHookMethod(xposedAppClass, classLoader,
|
||||||
"reloadXposedProp", new XC_MethodHook() {
|
"reloadXposedProp", new XC_MethodHook() {
|
||||||
@Override
|
@Override
|
||||||
protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
|
protected void beforeHookedMethod(MethodHookParam param) {
|
||||||
Utils.logD("before reloadXposedProp...");
|
Utils.logD("before reloadXposedProp...");
|
||||||
final String propFieldName = "mXposedProp";
|
final String propFieldName = "mXposedProp";
|
||||||
final Object thisObject = param.thisObject;
|
final Object thisObject = param.thisObject;
|
||||||
|
|
@ -90,6 +137,17 @@ public class XposedInstallerHooker {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
} catch (Throwable t) {
|
||||||
|
Utils.logW("Could not hook Xposed Installer or EdXposed Manager", t);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// EdXposed Manager
|
||||||
|
deoptMethod(classLoader, "org.meowcat.edxposed.manager.ModulesFragment", "onActivityCreated", Bundle.class);
|
||||||
|
deoptMethod(classLoader, "org.meowcat.edxposed.manager.ModulesFragment", "showMenu", Context.class, View.class, ApplicationInfo.class);
|
||||||
|
deoptMethod(classLoader, "org.meowcat.edxposed.manager.StatusInstallerFragment", "onCreateView", LayoutInflater.class, ViewGroup.class, Bundle.class);
|
||||||
|
deoptMethod(classLoader, "org.meowcat.edxposed.manager.util.ModuleUtil", "updateModulesList", boolean.class, View.class);
|
||||||
|
try {
|
||||||
XposedHelpers.findAndHookMethod("org.meowcat.edxposed.manager.XposedApp", classLoader, "onCreate", new XC_MethodHook() {
|
XposedHelpers.findAndHookMethod("org.meowcat.edxposed.manager.XposedApp", classLoader, "onCreate", new XC_MethodHook() {
|
||||||
@Override
|
@Override
|
||||||
protected void afterHookedMethod(MethodHookParam param) throws Throwable {
|
protected void afterHookedMethod(MethodHookParam param) throws Throwable {
|
||||||
|
|
@ -110,73 +168,21 @@ public class XposedInstallerHooker {
|
||||||
XposedHelpers.findAndHookMethod("org.meowcat.edxposed.manager.StatusInstallerFragment", classLoader, "getCanonicalFile", File.class, new XC_MethodHook() {
|
XposedHelpers.findAndHookMethod("org.meowcat.edxposed.manager.StatusInstallerFragment", classLoader, "getCanonicalFile", File.class, new XC_MethodHook() {
|
||||||
@Override
|
@Override
|
||||||
protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
|
protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
|
||||||
File arg = (File)param.args[0];
|
File arg = (File) param.args[0];
|
||||||
if(arg.equals(new File(AndroidAppHelper.currentApplicationInfo().deviceProtectedDataDir))) {
|
if (arg.equals(new File(AndroidAppHelper.currentApplicationInfo().deviceProtectedDataDir))) {
|
||||||
param.args[0] = new File(ConfigManager.getBaseConfigPath());
|
param.args[0] = new File(ConfigManager.getBaseConfigPath());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
Utils.logD("Hooked EdXposed Manager");
|
||||||
} catch (Throwable t) {
|
} catch (Throwable t) {
|
||||||
Utils.logE("Could not hook Xposed Installer", t);
|
Utils.logD("Hooked Xposed Installer");
|
||||||
}
|
|
||||||
|
|
||||||
// for new manager
|
|
||||||
try {
|
|
||||||
XposedHelpers.findAndHookMethod("org.meowcat.edxposed.manager.Constants", classLoader, "getXposedApiVersion", new XC_MethodReplacement() {
|
|
||||||
@Override
|
|
||||||
protected Object replaceHookedMethod(MethodHookParam param) throws Throwable {
|
|
||||||
return XposedBridge.getXposedVersion();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
XposedHelpers.findAndHookMethod("org.meowcat.edxposed.manager.Constants", classLoader, "getXposedVersion", new XC_MethodReplacement() {
|
|
||||||
@Override
|
|
||||||
protected Object replaceHookedMethod(MethodHookParam param) throws Throwable {
|
|
||||||
return BuildConfig.VERSION_NAME;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
XposedHelpers.findAndHookMethod("org.meowcat.edxposed.manager.Constants", classLoader, "getXposedVersionCode", new XC_MethodReplacement() {
|
|
||||||
@Override
|
|
||||||
protected Object replaceHookedMethod(MethodHookParam param) throws Throwable {
|
|
||||||
return BuildConfig.VERSION_CODE;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
XposedHelpers.findAndHookMethod("org.meowcat.edxposed.manager.Constants", classLoader, "getXposedApiVersion", new XC_MethodReplacement() {
|
|
||||||
@Override
|
|
||||||
protected Object replaceHookedMethod(MethodHookParam param) throws Throwable {
|
|
||||||
return XposedBridge.getXposedVersion();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
XposedHelpers.findAndHookMethod("org.meowcat.edxposed.manager.Constants", classLoader, "getXposedVariant", new XC_MethodReplacement() {
|
|
||||||
@Override
|
|
||||||
protected Object replaceHookedMethod(MethodHookParam param) throws Throwable {
|
|
||||||
String variant = "None";
|
|
||||||
switch (Main.getEdxpVariant()) {
|
|
||||||
case EdxpImpl.NONE:
|
|
||||||
break;
|
|
||||||
case EdxpImpl.YAHFA:
|
|
||||||
variant = "YAHFA";
|
|
||||||
break;
|
|
||||||
case EdxpImpl.SANDHOOK:
|
|
||||||
variant = "SandHook";
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
return variant;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
XposedHelpers.findAndHookMethod("org.meowcat.edxposed.manager.Constants", classLoader, "getBaseDir", new XC_MethodReplacement() {
|
|
||||||
@Override
|
|
||||||
protected Object replaceHookedMethod(MethodHookParam param) throws Throwable {
|
|
||||||
return ConfigManager.getBaseConfigPath() + "/";
|
|
||||||
}
|
|
||||||
});
|
|
||||||
} catch (Throwable t) {
|
|
||||||
Utils.logE("Could not hook EdXposed Installer", t);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void deoptMethod(ClassLoader cl, String className, String methodName, Class<?> ...params) {
|
private static void deoptMethod(ClassLoader cl, String className, String methodName, Class<?>... params) {
|
||||||
try {
|
try {
|
||||||
Class clazz = XposedHelpers.findClassIfExists(className, cl);
|
Class<?> clazz = XposedHelpers.findClassIfExists(className, cl);
|
||||||
if (clazz == null) {
|
if (clazz == null) {
|
||||||
Utils.logE("Class " + className + " not found when deoptimizing EdXposed Manager");
|
Utils.logE("Class " + className + " not found when deoptimizing EdXposed Manager");
|
||||||
return;
|
return;
|
||||||
|
|
@ -184,8 +190,8 @@ public class XposedInstallerHooker {
|
||||||
|
|
||||||
Object method = XposedHelpers.findMethodExact(clazz, methodName, params);
|
Object method = XposedHelpers.findMethodExact(clazz, methodName, params);
|
||||||
EdXpConfigGlobal.getHookProvider().deoptMethodNative(method);
|
EdXpConfigGlobal.getHookProvider().deoptMethodNative(method);
|
||||||
} catch (Throwable e) {
|
} catch (Throwable t) {
|
||||||
Utils.logE("Error when deoptimizing " + className + ":" + methodName, e);
|
Utils.logE("Error when deoptimizing " + className + ":" + methodName, t);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,5 +0,0 @@
|
||||||
version=$apiCode-$version
|
|
||||||
arch=arm64
|
|
||||||
minsdk=26
|
|
||||||
maxsdk=30
|
|
||||||
requires:fbe_aware=1
|
|
||||||
Loading…
Reference in New Issue