Skip to content

Commit 9efadf0

Browse files
committed
Try fix compatability with merged fields
1 parent b6e3f67 commit 9efadf0

File tree

1 file changed

+19
-6
lines changed

1 file changed

+19
-6
lines changed

library/src/main/java/org/lsposed/hiddenapibypass/HiddenApiBypass.java

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
import java.lang.reflect.Field;
3434
import java.lang.reflect.InvocationTargetException;
3535
import java.lang.reflect.Method;
36+
import java.lang.reflect.Modifier;
3637
import java.lang.reflect.Type;
3738
import java.util.ArrayList;
3839
import java.util.Arrays;
@@ -106,9 +107,14 @@ public final class HiddenApiBypass {
106107
methodOffset = unsafe.objectFieldOffset(executableClass.getDeclaredField("artMethod"));
107108
classOffset = unsafe.objectFieldOffset(executableClass.getDeclaredField("declaringClass"));
108109
artOffset = unsafe.objectFieldOffset(methodHandleClass.getDeclaredField("artFieldOrMethod"));
110+
long fieldOffset;
111+
try {
112+
fieldOffset = unsafe.objectFieldOffset(classClass.getDeclaredField("fields"));
113+
} catch (NoSuchFieldException e) {
114+
fieldOffset = unsafe.objectFieldOffset(classClass.getDeclaredField("iFields"));
115+
}
116+
iFieldOffset = fieldOffset;
109117
methodsOffset = unsafe.objectFieldOffset(classClass.getDeclaredField("methods"));
110-
iFieldOffset = unsafe.objectFieldOffset(classClass.getDeclaredField("iFields"));
111-
sFieldOffset = unsafe.objectFieldOffset(classClass.getDeclaredField("sFields"));
112118
Method mA = Helper.NeverCall.class.getDeclaredMethod("a");
113119
Method mB = Helper.NeverCall.class.getDeclaredMethod("b");
114120
mA.setAccessible(true);
@@ -139,6 +145,11 @@ public final class HiddenApiBypass {
139145
Long.toString(jAddr, 16) + ", " +
140146
Long.toString(iFields, 16));
141147
artFieldBias = iAddr - iFields;
148+
if (unsafe.getInt(unsafe.getLong(Helper.NeverCall.class, iFieldOffset)) == 4) {
149+
sFieldOffset = iFieldOffset;
150+
} else {
151+
sFieldOffset = unsafe.objectFieldOffset(classClass.getDeclaredField("sFields"));
152+
}
142153
} catch (ReflectiveOperationException e) {
143154
Log.e(TAG, "Initialize error", e);
144155
throw new ExceptionInInitializerError(e);
@@ -337,14 +348,15 @@ public static List<Field> getInstanceFields(@NonNull Class<?> clazz) {
337348
long fields = unsafe.getLong(clazz, iFieldOffset);
338349
if (fields == 0) return list;
339350
int numFields = unsafe.getInt(fields);
340-
if (BuildConfig.DEBUG) Log.d(TAG, clazz + " has " + numFields + " instance fields");
351+
if (BuildConfig.DEBUG) Log.d(TAG, clazz + " has " + numFields + " fields");
341352
for (int i = 0; i < numFields; i++) {
342353
long field = fields + i * artFieldSize + artFieldBias;
343354
unsafe.putLong(mh, artOffset, field);
344355
Field member = MethodHandles.reflectAs(Field.class, mh);
345356
if (BuildConfig.DEBUG)
346357
Log.v(TAG, "got " + member.getType() + " " + clazz.getTypeName() + "." + member.getName());
347-
list.add(member);
358+
if (!Modifier.isStatic(member.getModifiers()))
359+
list.add(member);
348360
}
349361
return list;
350362
}
@@ -370,14 +382,15 @@ public static List<Field> getStaticFields(@NonNull Class<?> clazz) {
370382
long fields = unsafe.getLong(clazz, sFieldOffset);
371383
if (fields == 0) return list;
372384
int numFields = unsafe.getInt(fields);
373-
if (BuildConfig.DEBUG) Log.d(TAG, clazz + " has " + numFields + " static fields");
385+
if (BuildConfig.DEBUG) Log.d(TAG, clazz + " has " + numFields + " fields");
374386
for (int i = 0; i < numFields; i++) {
375387
long field = fields + i * artFieldSize + artFieldBias;
376388
unsafe.putLong(mh, artOffset, field);
377389
Field member = MethodHandles.reflectAs(Field.class, mh);
378390
if (BuildConfig.DEBUG)
379391
Log.v(TAG, "got " + member.getType() + " " + clazz.getTypeName() + "." + member.getName());
380-
list.add(member);
392+
if (Modifier.isStatic(member.getModifiers()))
393+
list.add(member);
381394
}
382395
return list;
383396
}

0 commit comments

Comments
 (0)