mirror of
https://github.com/chiteroman/PlayIntegrityFix.git
synced 2025-04-29 17:42:11 +08:00
111 lines
3.7 KiB
Java
111 lines
3.7 KiB
Java
package es.chiteroman.playintegrityfix;
|
|
|
|
import android.os.Build;
|
|
import android.util.Log;
|
|
|
|
import org.lsposed.hiddenapibypass.HiddenApiBypass;
|
|
|
|
import java.lang.reflect.Field;
|
|
import java.security.KeyStore;
|
|
import java.security.KeyStoreException;
|
|
import java.security.KeyStoreSpi;
|
|
import java.security.Provider;
|
|
import java.security.Security;
|
|
import java.util.List;
|
|
|
|
public class EntryPoint {
|
|
private static List<Field> fields;
|
|
|
|
static {
|
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
|
|
try {
|
|
fields = HiddenApiBypass.getStaticFields(Class.forName("android.os.Build"));
|
|
LOG("Fields added in list: " + fields.size());
|
|
} catch (ClassNotFoundException e) {
|
|
throw new RuntimeException(e);
|
|
}
|
|
}
|
|
}
|
|
|
|
public static void init() {
|
|
spoofDevice();
|
|
spoofProvider();
|
|
}
|
|
|
|
private static void spoofProvider() {
|
|
final String KEYSTORE = "AndroidKeyStore";
|
|
|
|
try {
|
|
Provider provider = Security.getProvider(KEYSTORE);
|
|
KeyStore keyStore = KeyStore.getInstance(KEYSTORE);
|
|
|
|
Field f = keyStore.getClass().getDeclaredField("keyStoreSpi");
|
|
f.setAccessible(true);
|
|
CustomKeyStoreSpi.keyStoreSpi = (KeyStoreSpi) f.get(keyStore);
|
|
f.setAccessible(false);
|
|
|
|
CustomProvider customProvider = new CustomProvider(provider);
|
|
Security.removeProvider(KEYSTORE);
|
|
Security.insertProviderAt(customProvider, 1);
|
|
|
|
LOG("Spoof KeyStoreSpi and Provider done!");
|
|
|
|
} catch (KeyStoreException e) {
|
|
LOG("Couldn't find KeyStore: " + e);
|
|
} catch (NoSuchFieldException e) {
|
|
LOG("Couldn't find field: " + e);
|
|
} catch (IllegalAccessException e) {
|
|
LOG("Couldn't change access of field: " + e);
|
|
}
|
|
}
|
|
|
|
public static void spoofDevice() {
|
|
final String PRODUCT = "WW_Phone";
|
|
final String DEVICE = "ASUS_X00HD_4";
|
|
final String MANUFACTURER = "Asus";
|
|
final String BRAND = "Asus";
|
|
final String MODEL = "ASUS_X00HD";
|
|
final String FINGERPRINT = "asus/WW_Phone/ASUS_X00HD_4:7.1.1/NMF26F/14.2016.1801.372-20180119:user/release-keys";
|
|
|
|
setProp("PRODUCT", PRODUCT);
|
|
setProp("DEVICE", DEVICE);
|
|
setProp("MANUFACTURER", MANUFACTURER);
|
|
setProp("BRAND", BRAND);
|
|
setProp("MODEL", MODEL);
|
|
|
|
setProp("PRODUCT_FOR_ATTESTATION", PRODUCT);
|
|
setProp("DEVICE_FOR_ATTESTATION", DEVICE);
|
|
setProp("MANUFACTURER_FOR_ATTESTATION", MANUFACTURER);
|
|
setProp("BRAND_FOR_ATTESTATION", BRAND);
|
|
setProp("MODEL_FOR_ATTESTATION", MODEL);
|
|
|
|
setProp("FINGERPRINT", FINGERPRINT);
|
|
}
|
|
|
|
private static void setProp(String name, String value) {
|
|
try {
|
|
Field field = null;
|
|
if (fields != null && !fields.isEmpty()) {
|
|
for (Field f : fields) {
|
|
if (f.getName().equals(name)) {
|
|
field = f;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
if (field == null) field = Build.class.getDeclaredField(name);
|
|
field.setAccessible(true);
|
|
field.set(null, value);
|
|
field.setAccessible(false);
|
|
LOG(String.format("Modified field '%s' with value '%s'", name, value));
|
|
} catch (NoSuchFieldException e) {
|
|
LOG(String.format("Couldn't find '%s' field name.", name));
|
|
} catch (IllegalAccessException e) {
|
|
LOG(String.format("Couldn't modify '%s' field value.", name));
|
|
}
|
|
}
|
|
|
|
public static void LOG(String msg) {
|
|
Log.d("PIF/Java", msg);
|
|
}
|
|
} |