3333import java .lang .reflect .Field ;
3434import java .lang .reflect .InvocationTargetException ;
3535import java .lang .reflect .Method ;
36+ import java .lang .reflect .Modifier ;
3637import java .lang .reflect .Type ;
3738import java .util .ArrayList ;
3839import 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