33
33
import java .lang .reflect .Field ;
34
34
import java .lang .reflect .InvocationTargetException ;
35
35
import java .lang .reflect .Method ;
36
+ import java .lang .reflect .Modifier ;
36
37
import java .lang .reflect .Type ;
37
38
import java .util .ArrayList ;
38
39
import java .util .Arrays ;
@@ -106,9 +107,14 @@ public final class HiddenApiBypass {
106
107
methodOffset = unsafe .objectFieldOffset (executableClass .getDeclaredField ("artMethod" ));
107
108
classOffset = unsafe .objectFieldOffset (executableClass .getDeclaredField ("declaringClass" ));
108
109
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 ;
109
117
methodsOffset = unsafe .objectFieldOffset (classClass .getDeclaredField ("methods" ));
110
- iFieldOffset = unsafe .objectFieldOffset (classClass .getDeclaredField ("iFields" ));
111
- sFieldOffset = unsafe .objectFieldOffset (classClass .getDeclaredField ("sFields" ));
112
118
Method mA = Helper .NeverCall .class .getDeclaredMethod ("a" );
113
119
Method mB = Helper .NeverCall .class .getDeclaredMethod ("b" );
114
120
mA .setAccessible (true );
@@ -139,6 +145,11 @@ public final class HiddenApiBypass {
139
145
Long .toString (jAddr , 16 ) + ", " +
140
146
Long .toString (iFields , 16 ));
141
147
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
+ }
142
153
} catch (ReflectiveOperationException e ) {
143
154
Log .e (TAG , "Initialize error" , e );
144
155
throw new ExceptionInInitializerError (e );
@@ -337,14 +348,15 @@ public static List<Field> getInstanceFields(@NonNull Class<?> clazz) {
337
348
long fields = unsafe .getLong (clazz , iFieldOffset );
338
349
if (fields == 0 ) return list ;
339
350
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" );
341
352
for (int i = 0 ; i < numFields ; i ++) {
342
353
long field = fields + i * artFieldSize + artFieldBias ;
343
354
unsafe .putLong (mh , artOffset , field );
344
355
Field member = MethodHandles .reflectAs (Field .class , mh );
345
356
if (BuildConfig .DEBUG )
346
357
Log .v (TAG , "got " + member .getType () + " " + clazz .getTypeName () + "." + member .getName ());
347
- list .add (member );
358
+ if (!Modifier .isStatic (member .getModifiers ()))
359
+ list .add (member );
348
360
}
349
361
return list ;
350
362
}
@@ -370,14 +382,15 @@ public static List<Field> getStaticFields(@NonNull Class<?> clazz) {
370
382
long fields = unsafe .getLong (clazz , sFieldOffset );
371
383
if (fields == 0 ) return list ;
372
384
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" );
374
386
for (int i = 0 ; i < numFields ; i ++) {
375
387
long field = fields + i * artFieldSize + artFieldBias ;
376
388
unsafe .putLong (mh , artOffset , field );
377
389
Field member = MethodHandles .reflectAs (Field .class , mh );
378
390
if (BuildConfig .DEBUG )
379
391
Log .v (TAG , "got " + member .getType () + " " + clazz .getTypeName () + "." + member .getName ());
380
- list .add (member );
392
+ if (Modifier .isStatic (member .getModifiers ()))
393
+ list .add (member );
381
394
}
382
395
return list ;
383
396
}
0 commit comments