Skip to content

Commit 235ee81

Browse files
MlgmXyysdLoveSy
and
LoveSy
committed
Revert YAHFA to fix OatQuickMethodHeader soft reboot issue
Co-Authored-By: LoveSy <[email protected]>
1 parent eadb07f commit 235ee81

File tree

23 files changed

+566
-993
lines changed

23 files changed

+566
-993
lines changed

Diff for: edxp-common/src/main/java/com/elderdrivers/riru/edxp/core/Yahfa.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ public class Yahfa {
1212

1313
public static native void init(int sdkVersion);
1414

15-
public static native void setMethodNonCompilable(Member member);
15+
// public static native void setMethodNonCompilable(Member member);
1616

1717
public static native void recordHooked(Member member);
1818

Diff for: edxp-common/src/main/java/com/elderdrivers/riru/edxp/core/yahfa/HookMain.java

+8-104
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22

33
import com.elderdrivers.riru.edxp.art.Heap;
44
import com.elderdrivers.riru.edxp.core.Yahfa;
5-
import com.elderdrivers.riru.edxp.util.ClassUtils;
65
import com.elderdrivers.riru.edxp.util.Utils;
76

87
import java.lang.reflect.Constructor;
@@ -11,89 +10,7 @@
1110
import java.lang.reflect.Modifier;
1211
import java.util.ArrayList;
1312
import java.util.Arrays;
14-
import java.util.HashSet;
15-
import java.util.Set;
16-
17-
import de.robv.android.xposed.XposedHelpers;
18-
1913
public class HookMain {
20-
21-
private static final Set<String> hookItemWhiteList = new HashSet<String>();
22-
23-
public static void addHookItemWhiteList(String className) {
24-
hookItemWhiteList.add(className);
25-
}
26-
27-
public static void doHookDefault(ClassLoader patchClassLoader, ClassLoader originClassLoader, String hookInfoClassName) {
28-
try {
29-
Class<?> hookInfoClass = Class.forName(hookInfoClassName, true, patchClassLoader);
30-
String[] hookItemNames = (String[]) hookInfoClass.getField("hookItemNames").get(null);
31-
for (String hookItemName : hookItemNames) {
32-
doHookItemDefault(patchClassLoader, hookItemName, originClassLoader);
33-
}
34-
} catch (Throwable e) {
35-
Utils.logE("error when hooking all in: " + hookInfoClassName, e);
36-
}
37-
}
38-
39-
private static void doHookItemDefault(ClassLoader patchClassLoader, String hookItemName, ClassLoader originClassLoader) {
40-
try {
41-
Utils.logD("Start hooking with item " + hookItemName);
42-
Class<?> hookItem = Class.forName(hookItemName, true, patchClassLoader);
43-
44-
String className = (String) hookItem.getField("className").get(null);
45-
String methodName = (String) hookItem.getField("methodName").get(null);
46-
String methodSig = (String) hookItem.getField("methodSig").get(null);
47-
48-
if (className == null || className.equals("")) {
49-
Utils.logW("No target class. Skipping...");
50-
return;
51-
}
52-
Class<?> clazz = null;
53-
try {
54-
clazz = Class.forName(className, true, originClassLoader);
55-
} catch (ClassNotFoundException cnfe) {
56-
Utils.logE(className + " not found in " + originClassLoader);
57-
return;
58-
}
59-
if (Modifier.isAbstract(clazz.getModifiers())) {
60-
Utils.logW("Hook may fail for abstract class: " + className);
61-
}
62-
63-
Method hook = null;
64-
Method backup = null;
65-
for (Method method : hookItem.getDeclaredMethods()) {
66-
if (method.getName().equals("hook") && Modifier.isStatic(method.getModifiers())) {
67-
hook = method;
68-
} else if (method.getName().equals("backup") && Modifier.isStatic(method.getModifiers())) {
69-
backup = method;
70-
}
71-
}
72-
if (hook == null) {
73-
Utils.logE("Cannot find hook for " + methodName);
74-
return;
75-
}
76-
findAndBackupAndHook(clazz, methodName, methodSig, hook, backup);
77-
} catch (Throwable e) {
78-
if (!hookItemWhiteList.contains(hookItemName)) {
79-
Utils.logE("error when hooking " + hookItemName, e);
80-
}
81-
}
82-
}
83-
84-
public static void findAndHook(Class targetClass, String methodName, String methodSig, Method hook) {
85-
hook(findMethod(targetClass, methodName, methodSig), hook);
86-
}
87-
88-
public static void findAndBackupAndHook(Class targetClass, String methodName, String methodSig,
89-
Method hook, Method backup) {
90-
backupAndHook(findMethod(targetClass, methodName, methodSig), hook, backup);
91-
}
92-
93-
public static void hook(Member target, Method hook) {
94-
backupAndHook(target, hook, null);
95-
}
96-
9714
public static void backupAndHook(Member target, Method hook, Method backup) {
9815
Utils.logD(String.format("target=%s, hook=%s, backup=%s", target, hook, backup));
9916
if (target == null) {
@@ -106,13 +23,13 @@ public static void backupAndHook(Member target, Method hook, Method backup) {
10623
if (!Modifier.isStatic(hook.getModifiers())) {
10724
throw new IllegalArgumentException("Hook must be a static method: " + hook);
10825
}
109-
checkCompatibleMethods(target, hook, "Original", "Hook");
26+
checkCompatibleMethods(target, hook, "Hook");
11027
if (backup != null) {
11128
if (!Modifier.isStatic(backup.getModifiers())) {
11229
throw new IllegalArgumentException("Backup must be a static method: " + backup);
11330
}
11431
// backup is just a placeholder and the constraint could be less strict
115-
checkCompatibleMethods(target, backup, "Original", "Backup");
32+
checkCompatibleMethods(target, backup, "Backup");
11633
}
11734
// make sure GC completed before hook
11835
int lastGcType = Heap.waitForGcToComplete();
@@ -121,28 +38,15 @@ public static void backupAndHook(Member target, Method hook, Method backup) {
12138
Runtime.getRuntime().gc();
12239
}
12340

124-
if (!Yahfa.backupAndHookNative(target, hook, backup)) {
41+
if(!Yahfa.backupAndHookNative(target, hook, backup)){
12542
throw new RuntimeException("Failed to hook " + target + " with " + hook);
12643
} else {
12744
Yahfa.recordHooked(target);
128-
Yahfa.recordHooked(backup);
129-
}
130-
}
131-
132-
public static Member findMethod(Class cls, String methodName, String methodSig) {
133-
if (cls == null) {
134-
throw new IllegalArgumentException("null class");
135-
}
136-
if (methodName == null) {
137-
throw new IllegalArgumentException("null method name");
138-
}
139-
if (methodSig == null) {
140-
throw new IllegalArgumentException("null method signature");
45+
// Yahfa.recordHooked(backup);
14146
}
142-
return Yahfa.findMethodNative(cls, methodName, methodSig);
14347
}
14448

145-
private static void checkCompatibleMethods(Object original, Method replacement, String originalName, String replacementName) {
49+
private static void checkCompatibleMethods(Object original, Method replacement, String replacementName) {
14650
ArrayList<Class<?>> originalParams;
14751
if (original instanceof Method) {
14852
originalParams = new ArrayList<>(Arrays.asList(((Method) original).getParameterTypes()));
@@ -168,20 +72,20 @@ private static void checkCompatibleMethods(Object original, Method replacement,
16872

16973
if (original instanceof Method
17074
&& !replacement.getReturnType().isAssignableFrom(((Method) original).getReturnType())) {
171-
throw new IllegalArgumentException("Incompatible return types. " + originalName + ": " + ((Method) original).getReturnType() + ", " + replacementName + ": " + replacement.getReturnType());
75+
throw new IllegalArgumentException("Incompatible return types. " + "Original" + ": " + ((Method) original).getReturnType() + ", " + replacementName + ": " + replacement.getReturnType());
17276
} else if (original instanceof Constructor) {
17377
if (replacement.getReturnType().equals(Void.class)) {
17478
throw new IllegalArgumentException("Incompatible return types. " + "<init>" + ": " + "V" + ", " + replacementName + ": " + replacement.getReturnType());
17579
}
17680
}
17781

17882
if (originalParams.size() != replacementParams.size()) {
179-
throw new IllegalArgumentException("Number of arguments don't match. " + originalName + ": " + originalParams.size() + ", " + replacementName + ": " + replacementParams.size());
83+
throw new IllegalArgumentException("Number of arguments don't match. " + "Original" + ": " + originalParams.size() + ", " + replacementName + ": " + replacementParams.size());
18084
}
18185

18286
for (int i = 0; i < originalParams.size(); i++) {
18387
if (!replacementParams.get(i).isAssignableFrom(originalParams.get(i))) {
184-
throw new IllegalArgumentException("Incompatible argument #" + i + ": " + originalName + ": " + originalParams.get(i) + ", " + replacementName + ": " + replacementParams.get(i));
88+
throw new IllegalArgumentException("Incompatible argument #" + i + ": " + "Original" + ": " + originalParams.get(i) + ", " + replacementName + ": " + replacementParams.get(i));
18589
}
18690
}
18791
}

Diff for: edxp-common/src/main/java/com/elderdrivers/riru/edxp/proxy/BaseRouter.java

+18-42
Original file line numberDiff line numberDiff line change
@@ -32,8 +32,6 @@ public abstract class BaseRouter implements Router {
3232

3333
protected volatile AtomicBoolean bootstrapHooked = new AtomicBoolean(false);
3434

35-
protected static boolean useXposedApi = false;
36-
3735
public void initResourcesHook() {
3836
XposedBridge.initXResources();
3937
}
@@ -81,49 +79,27 @@ public String parsePackageName(String appDataDir) {
8179
public void startBootstrapHook(boolean isSystem) {
8280
Utils.logD("startBootstrapHook starts: isSystem = " + isSystem);
8381
ClassLoader classLoader = BaseRouter.class.getClassLoader();
84-
if (useXposedApi) {
85-
if (isSystem) {
86-
XposedHelpers.findAndHookMethod(SystemMainHooker.className, classLoader,
87-
SystemMainHooker.methodName, new SystemMain());
88-
}
89-
XposedHelpers.findAndHookMethod(HandleBindAppHooker.className, classLoader,
90-
HandleBindAppHooker.methodName,
91-
"android.app.ActivityThread$AppBindData",
92-
new HandleBindApp());
93-
XposedHelpers.findAndHookConstructor(LoadedApkConstructorHooker.className, classLoader,
94-
ActivityThread.class, ApplicationInfo.class, CompatibilityInfo.class,
95-
ClassLoader.class, boolean.class, boolean.class, boolean.class,
96-
new LoadedApkCstr());
97-
} else {
98-
if (isSystem) {
99-
HookMain.doHookDefault(
100-
BaseRouter.class.getClassLoader(),
101-
classLoader,
102-
SysBootstrapHookInfo.class.getName());
103-
} else {
104-
HookMain.doHookDefault(
105-
BaseRouter.class.getClassLoader(),
106-
classLoader,
107-
AppBootstrapHookInfo.class.getName());
108-
}
82+
if (isSystem) {
83+
XposedHelpers.findAndHookMethod(SystemMainHooker.className, classLoader,
84+
SystemMainHooker.methodName, new SystemMain());
10985
}
86+
XposedHelpers.findAndHookMethod(HandleBindAppHooker.className, classLoader,
87+
HandleBindAppHooker.methodName,
88+
"android.app.ActivityThread$AppBindData",
89+
new HandleBindApp());
90+
XposedHelpers.findAndHookConstructor(LoadedApkConstructorHooker.className, classLoader,
91+
ActivityThread.class, ApplicationInfo.class, CompatibilityInfo.class,
92+
ClassLoader.class, boolean.class, boolean.class, boolean.class,
93+
new LoadedApkCstr());
11094
}
11195

11296
public void startSystemServerHook() {
113-
ClassLoader classLoader = BaseRouter.class.getClassLoader();
114-
if (useXposedApi) {
115-
StartBootstrapServices sbsHooker = new StartBootstrapServices();
116-
Object[] paramTypesAndCallback = Versions.hasR() ?
117-
new Object[]{"com.android.server.utils.TimingsTraceAndSlog", sbsHooker} :
118-
new Object[]{sbsHooker};
119-
XposedHelpers.findAndHookMethod(StartBootstrapServicesHooker.className,
120-
SystemMain.systemServerCL,
121-
StartBootstrapServicesHooker.methodName, paramTypesAndCallback);
122-
} else {
123-
HookMain.doHookDefault(
124-
classLoader,
125-
SystemMain.systemServerCL,
126-
SysInnerHookInfo.class.getName());
127-
}
97+
StartBootstrapServices sbsHooker = new StartBootstrapServices();
98+
Object[] paramTypesAndCallback = Versions.hasR() ?
99+
new Object[]{"com.android.server.utils.TimingsTraceAndSlog", sbsHooker} :
100+
new Object[]{sbsHooker};
101+
XposedHelpers.findAndHookMethod(StartBootstrapServicesHooker.className,
102+
SystemMain.systemServerCL,
103+
StartBootstrapServicesHooker.methodName, paramTypesAndCallback);
128104
}
129105
}

Diff for: edxp-common/src/main/java/com/elderdrivers/riru/edxp/proxy/NormalProxy.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -41,9 +41,9 @@ private void forkPostCommon(int pid, boolean isSystem, String appDataDir, String
4141
mRouter.initResourcesHook();
4242
mRouter.prepare(isSystem);
4343
PrebuiltMethodsDeopter.deoptBootMethods(); // do it once for secondary zygote
44-
mRouter.installBootstrapHooks(isSystem);
4544
ConfigManager.appDataDir = appDataDir;
4645
ConfigManager.niceName = niceName;
46+
mRouter.installBootstrapHooks(isSystem);
4747
XposedInit.prefsBasePath = ConfigManager.getPrefsPath("");
4848
mRouter.onEnterChildProcess();
4949
Utils.logI("Loading modules for " + niceName);

Diff for: edxp-common/src/main/java/com/elderdrivers/riru/edxp/util/FileUtils.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,6 @@ public static String getPackageName(String dataDir) {
7272
}
7373

7474
public static String getDataPathPrefix() {
75-
return ConfigManager.getDataPathPrefix();
75+
return ConfigManager.getDataPathPrefix() + "/";
7676
}
7777
}

Diff for: edxp-core/src/main/cpp/external/yahfa/include/HookMain.h

+4-13
Original file line numberDiff line numberDiff line change
@@ -17,21 +17,12 @@ jboolean Java_lab_galaxy_yahfa_HookMain_backupAndHookNative(JNIEnv *env, jclass
1717
jobject target, jobject hook,
1818
jobject backup);
1919

20-
void Java_lab_galaxy_yahfa_HookMain_ensureMethodCached(JNIEnv *env, jclass clazz,
21-
jobject hook,
22-
jobject backup);
23-
#ifdef __cplusplus
24-
}
25-
#endif
2620
void setNonCompilable(void *method);
2721

2822
void *getArtMethod(JNIEnv *env, jobject jmethod);
2923

30-
// TODO: move to common utils instead of in YAHFA's code
31-
void *getEntryPoint(void* method);
32-
33-
// get original entrypoint from target ArtMethod
34-
void *getOriginalEntryPointFromTargetMethod(void* method);
35-
24+
#ifdef __cplusplus
25+
}
26+
#endif
3627

37-
#endif // HOOK_MAIN_H
28+
#endif // HOOK_MAIN_H

Diff for: edxp-core/src/main/cpp/external/yahfa/include/trampoline.h

+9-4
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,17 @@
66
#define YAHFA_TAMPOLINE_H
77

88
extern int SDKVersion;
9+
extern int OFFSET_entry_point_from_quick_compiled_code_in_ArtMethod;
10+
11+
extern unsigned int hookCap; // capacity for trampolines
12+
extern unsigned int hookCount; // current count of used trampolines
913

1014
extern unsigned char trampoline[];
11-
extern unsigned char trampolineForBackup[];
1215

13-
void* doInitHookCap(size_t cap);
14-
void setupTrampoline(uint8_t offset);
15-
void *genTrampoline(void *toMethod, void *entrypoint);
16+
int doInitHookCap(unsigned int cap);
17+
void setupTrampoline();
18+
void *genTrampoline(void *hookMethod);
19+
20+
#define DEFAULT_CAP 1 //size of each trampoline area would be no more than 4k Bytes(one page)
1621

1722
#endif //YAHFA_TAMPOLINE_H

0 commit comments

Comments
 (0)