public
class
BuildHook
extends
MethodHook
{
public
BuildHook(XC_LoadPackage.LoadPackageParam paramLoadPackageParam, DeviceInfoModel deviceInfoModel,
final
Context context) {
super
(paramLoadPackageParam, deviceInfoModel);
hookMethodByClassMethodName(
"android.os.SystemProperties"
,
"set"
);
hookMethodByClassMethodName(
"android.os.SystemProperties"
,
"get"
);
hookMethodByClassMethodName(Settings.System.
class
.getName(),
"putStringForUser"
);
if
(Build.VERSION.SDK_INT >= Build.VERSION_CODES.CUPCAKE) {
hookMethodByClassMethodName(Settings.Secure.
class
.getName(),
"putStringForUser"
);
}
if
(Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
hookMethodByClassMethodName(Settings.Global.
class
.getName(),
"putStringForUser"
);
}
hookMethodByClassMethodName(Settings.System.
class
.getName(),
"getStringForUser"
);
if
(Build.VERSION.SDK_INT >= Build.VERSION_CODES.CUPCAKE) {
hookMethodByClassMethodName(Settings.Secure.
class
.getName(),
"getStringForUser"
);
}
if
(Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
hookMethodByClassMethodName(Settings.Global.
class
.getName(),
"getStringForUser"
);
}
hookMethodByClassMethodName(
"android.provider.Settings$NameValueCache"
,
"getStringForUser"
);
}
@SuppressLint
(
"SuspiciousIndentation"
)
private
void
setBuilds() {
XposedHelpers.setStaticObjectField(Build.
class
,
"BOOTLOADER"
,
"unkown"
);
if
(!TextUtils.isEmpty(
this
.deviceInfoModel.getBuildBrand()))
XposedHelpers.setStaticObjectField(Build.
class
,
"BRAND"
,
this
.deviceInfoModel.getBuildBrand());
if
(!TextUtils.isEmpty(
this
.deviceInfoModel.getBuildBoard()))
XposedHelpers.setStaticObjectField(Build.
class
,
"BOARD"
,
this
.deviceInfoModel.getBuildBoard());
if
(!TextUtils.isEmpty(
this
.deviceInfoModel.getBuildModel()))
XposedHelpers.setStaticObjectField(Build.
class
,
"MODEL"
,
this
.deviceInfoModel.getBuildModel());
if
(!TextUtils.isEmpty(
this
.deviceInfoModel.getDisplayId()))
XposedHelpers.setStaticObjectField(Build.
class
,
"DISPLAY"
,
this
.deviceInfoModel.getDisplayId());
if
(!TextUtils.isEmpty(
this
.deviceInfoModel.getBuildProduct()))
XposedHelpers.setStaticObjectField(Build.
class
,
"PRODUCT"
,
this
.deviceInfoModel.getBuildProduct());
if
(!TextUtils.isEmpty(
this
.deviceInfoModel.getBuildManufacturer()))
XposedHelpers.setStaticObjectField(Build.
class
,
"MANUFACTURER"
,
this
.deviceInfoModel.getBuildManufacturer());
if
(!TextUtils.isEmpty(
this
.deviceInfoModel.getBuildDevice()))
XposedHelpers.setStaticObjectField(Build.
class
,
"DEVICE"
,
this
.deviceInfoModel.getBuildDevice());
if
(!TextUtils.isEmpty(
this
.deviceInfoModel.getBuildRelease()))
XposedHelpers.setStaticObjectField(Build.VERSION.
class
,
"RELEASE"
,
this
.deviceInfoModel.getBuildRelease());
if
(!TextUtils.isEmpty(
this
.deviceInfoModel.getBuildSdk()))
XposedHelpers.setStaticObjectField(Build.VERSION.
class
,
"SDK"
,
this
.deviceInfoModel.getBuildSdk());
if
(!TextUtils.isEmpty(
this
.deviceInfoModel.getBuildFingerprint()))
XposedHelpers.setStaticObjectField(Build.
class
,
"FINGERPRINT"
,
this
.deviceInfoModel.getBuildFingerprint());
if
(!TextUtils.isEmpty(
this
.deviceInfoModel.getBuildHardware()))
XposedHelpers.setStaticObjectField(Build.
class
,
"HARDWARE"
,
this
.deviceInfoModel.getBuildHardware());
if
(!TextUtils.isEmpty(
this
.deviceInfoModel.getBuildCodename()))
XposedHelpers.setStaticObjectField(Build.VERSION.
class
,
"CODENAME"
,
this
.deviceInfoModel.getBuildCodename());
if
(!TextUtils.isEmpty(
this
.deviceInfoModel.getBuildIncremental()))
XposedHelpers.setStaticObjectField(Build.VERSION.
class
,
"INCREMENTAL"
,
this
.deviceInfoModel.getBuildIncremental());
if
(!TextUtils.isEmpty(
this
.deviceInfoModel.getBuildHost()))
XposedHelpers.setStaticObjectField(Build.
class
,
"HOST"
,
this
.deviceInfoModel.getBuildHost());
if
(!TextUtils.isEmpty(
this
.deviceInfoModel.getBuildId()))
XposedHelpers.setStaticObjectField(Build.
class
,
"ID"
,
this
.deviceInfoModel.getBuildId());
if
(!TextUtils.isEmpty(
this
.deviceInfoModel.getBuildType()))
XposedHelpers.setStaticObjectField(Build.
class
,
"TYPE"
,
this
.deviceInfoModel.getBuildType());
if
(!TextUtils.isEmpty(
this
.deviceInfoModel.getBuildUser()))
XposedHelpers.setStaticObjectField(Build.
class
,
"USER"
,
this
.deviceInfoModel.getBuildUser());
if
(!TextUtils.isEmpty(
this
.deviceInfoModel.getBuildSerialno()))
XposedHelpers.setStaticObjectField(Build.
class
,
"SERIAL"
,
this
.deviceInfoModel.getBuildSerialno());
if
(!TextUtils.isEmpty(
this
.deviceInfoModel.getBuildTags()))
XposedHelpers.setStaticObjectField(Build.
class
,
"TAGS"
,
this
.deviceInfoModel.getBuildTags());
if
(
this
.deviceInfoModel.getBuildUtc() > 0L)
XposedHelpers.setStaticObjectField(Build.
class
,
"TIME"
, Long.valueOf(
this
.deviceInfoModel.getBuildUtc()));
if
(!TextUtils.isEmpty(
this
.deviceInfoModel.getBuildAbi())){
XposedHelpers.setStaticObjectField(Build.
class
,
"CPU_ABI"
,
this
.deviceInfoModel.getBuildAbi());
}
if
(!TextUtils.isEmpty(
this
.deviceInfoModel.getBuildAbi2())){
XposedHelpers.setStaticObjectField(Build.
class
,
"CPU_ABI2"
,
this
.deviceInfoModel.getBuildAbi2());
}
if
(!TextUtils.isEmpty(
this
.deviceInfoModel.getBuildSdk())){
if
(Integer.parseInt(
this
.deviceInfoModel.getBuildSdk())<
26
){
XposedHelpers.setStaticIntField(Build.VERSION.
class
,
"SDK_INT"
, Integer.parseInt(
this
.deviceInfoModel.getBuildSdk()));
}
}
if
(!TextUtils.isEmpty(
this
.deviceInfoModel.getSecurity_patch())){
XposedHelpers.setStaticObjectField(Build.VERSION.
class
,
"SECURITY_PATCH"
,
this
.deviceInfoModel.getSecurity_patch());
}
}
public
static
Object IIl1lIIlll(DeviceInfoModel arg4, String arg5) {
if
(
"ro.product.model"
.equals(arg5)) {
if
(!TextUtils.isEmpty(arg4.getBuildModel())) {
return
arg4.getBuildModel();
}
}
if
(
"ro.boot.serialno"
.equals(arg5)) {
if
(!TextUtils.isEmpty(arg4.getSerialno())) {
Log.i(
"TestYY"
,
"ro.boot.serialno"
);
return
arg4.getSerialno();
}
}
else
if
(
"ro.build.id"
.equals(arg5)) {
if
(!TextUtils.isEmpty(arg4.getBuildId())) {
return
arg4.getBuildId();
}
}
else
if
(
"ro.build.display.id"
.equals(arg5)) {
if
(!TextUtils.isEmpty(arg4.getDisplayId())) {
return
arg4.getDisplayId();
}
}
else
if
(
"ro.build.type"
.equals(arg5)) {
if
(!TextUtils.isEmpty(arg4.getBuildType())) {
return
arg4.getBuildType();
}
}
else
if
(
"ro.build.user"
.equals(arg5)) {
if
(!TextUtils.isEmpty(arg4.getBuildUser())) {
return
arg4.getBuildUser();
}
}
else
if
(
"ro.build.host"
.equals(arg5)) {
if
(!TextUtils.isEmpty(arg4.getBuildHost())) {
return
arg4.getBuildHost();
}
}
else
if
(
"ro.build.tags"
.equals(arg5)) {
if
(!TextUtils.isEmpty(arg4.getBuildTags())) {
return
arg4.getBuildTags();
}
}
else
if
(
"ro.product.brand"
.equals(arg5)) {
if
(!TextUtils.isEmpty(arg4.getBuildBrand())) {
return
arg4.getBuildBrand();
}
}
else
if
(
"ro.product.device"
.equals(arg5)) {
if
(!TextUtils.isEmpty(arg4.getBuildDevice())) {
return
arg4.getBuildDevice();
}
}
else
if
(
"ro.product.board"
.equals(arg5)) {
if
(!TextUtils.isEmpty(arg4.getBuildBoard())) {
return
arg4.getBuildBoard();
}
}
else
if
(
"ro.product.name"
.equals(arg5)) {
if
(!TextUtils.isEmpty(arg4.getBuildName())) {
return
arg4.getBuildName();
}
}
else
if
(
"ro.product.manufacturer"
.equals(arg5)) {
if
(!TextUtils.isEmpty(arg4.getBuildManufacturer())) {
return
arg4.getBuildManufacturer();
}
}
else
if
(
"ro.hardware"
.equals(arg5)) {
if
(!TextUtils.isEmpty(arg4.getBuildHardware())) {
return
arg4.getBuildHardware();
}
}
else
if
(
"c"
.equals(arg5)) {
if
(!TextUtils.isEmpty(arg4.getBuildSerialno())) {
return
arg4.getBuildSerialno();
}
}
else
if
(
"ro.build.version.incremental"
.equals(arg5)) {
if
(!TextUtils.isEmpty(arg4.getBuildIncremental())) {
return
arg4.getBuildIncremental();
}
}
else
if
(
"ro.build.version.release"
.equals(arg5)) {
if
(!TextUtils.isEmpty(arg4.getBuildRelease())) {
return
arg4.getBuildRelease();
}
}
else
if
(
"ro.build.version.sdk"
.equals(arg5)) {
if
(!TextUtils.isEmpty(arg4.getBuildSdk())) {
return
arg4.getBuildSdk();
}
}
else
if
(
"ro.build.version.codename"
.equals(arg5)) {
if
(!TextUtils.isEmpty(arg4.getBuildCodename())) {
return
arg4.getBuildCodename();
}
}
else
if
(
"ro.build.fingerprint"
.equals(arg5)) {
if
(!TextUtils.isEmpty(arg4.getBuildFingerprint())) {
return
arg4.getBuildFingerprint();
}
}
else
if
(
"ro.build.date.utc"
.equals(arg5)) {
if
(arg4.getBuildUtc() >
0
) {
return
Long.valueOf(arg4.getBuildUtc());
}
}
else
if
(
"gsm.operator.numeric"
.equals(arg5)) {
if
(!TextUtils.isEmpty(arg4.getSimOperator())) {
return
arg4.getSimOperator();
}
}
else
if
(!TextUtils.isEmpty(((CharSequence)arg5)) && (arg5.contains(
"recovery_id"
))) {
return
arg4.getRecoveryId();
}
else
if
((
"gsm.operator.numeric"
.equals(arg5)) || (
"gsm.sim.operator.numeric"
.equals(arg5)) || (
"gsm.apn.sim.operator.numeric"
.equals(arg5))) {
if
(TextUtils.isEmpty(arg4.getSimOperator())) {
return
arg4.getSimOperator();
}
}
else
if
(
"gsm.operator.iso-country"
.equals(arg5) ||
"gsm.sim.operator.iso-country"
.equals(arg5)) {
if
(TextUtils.isEmpty(arg4.getSimCountryIso())) {
return
arg4.getSimCountryIso();
}
}
else
if
(
"gsm.operator.alpha"
.equals(arg5) ||
"gsm.operator.orig.alpha"
.equals(arg5)) {
if
(TextUtils.isEmpty(arg4.getSimOperatorName())) {
return
arg4.getSimOperatorName();
}
}
else
if
(
"ro.build.brand"
.equals(arg5)) {
if
(!TextUtils.isEmpty(arg4.getBuildBrand())) {
return
arg4.getBuildBrand();
}
}
else
if
(
"ro.build.board"
.equals(arg5)) {
if
(!TextUtils.isEmpty(arg4.getBuildBoard())) {
return
arg4.getBuildBoard();
}
}
else
if
(
"net.hostname"
.equals(arg5)) {
if
(!TextUtils.isEmpty(arg4.getNetHostname())) {
return
arg4.getNetHostname();
}
}
else
if
(
"dalvik.vm.heapsize"
.equals(arg5)) {
return
arg4.getVmHeapSize();
}
else
if
(
"ro.build.selinux"
.equals(arg5)) {
return
"1"
;
}
else
if
(
"ro.board.platform"
.equals(arg5)) {
if
(!TextUtils.isEmpty(arg4.getBoardPlat())) {
return
arg4.getBoardPlat();
}
}
else
if
(
"ro.product.cpu.abi"
.equals(arg5)) {
if
(!TextUtils.isEmpty(arg4.getBuildAbi())) {
return
arg4.getBuildAbi();
}
}
else
if
(
"ro.product.cpu.abi2"
.equals(arg5)) {
if
(TextUtils.isEmpty(arg4.getBuildAbi2())) {
arg4.setBuildAbi2(
"armeabi"
);
}
return
arg4.getBuildAbi2();
}
else
{
if
(!arg5.contains(
"gsm.version.baseband"
) && !arg5.contains(
"ro.baseband"
) && !arg5.contains(
"ro.boot.baseband"
)) {
return
null
;
}
if
(TextUtils.isEmpty(arg4.getBuildRadioVersion())) {
return
null
;
}
return
arg4.getBuildRadioVersion();
}
return
null
;
}
@Override
protected
void
afterHookedMethod(
final
XC_MethodHook.MethodHookParam xc_MethodHook$MethodHookParam)
throws
Throwable {
int
v3 =
3
;
Object v0_1;
String name = xc_MethodHook$MethodHookParam.method.getName();
String v1 = xc_MethodHook$MethodHookParam.method.getDeclaringClass().getName();
if
(
"get"
.startsWith(name)) {
v0_1 =
this
.IIl1lIIlll(
this
.deviceInfoModel, (String) xc_MethodHook$MethodHookParam.args[
0
]);
if
(v0_1 !=
null
) {
xc_MethodHook$MethodHookParam.setResult(v0_1);
}
if
(
"android.provider.Settings$NameValueCache"
.equals(v1)) {
this
.setAccessible(xc_MethodHook$MethodHookParam.thisObject,
"mValues"
);
v0_1 = XposedHelpers.getObjectField(xc_MethodHook$MethodHookParam.thisObject,
"mValues"
);
if
(
"android_id"
.equals(xc_MethodHook$MethodHookParam.args[
0
])) {
((HashMap) v0_1).put(
"android_id"
,
this
.deviceInfoModel.getAndroidId());
xc_MethodHook$MethodHookParam.setResult(
this
.deviceInfoModel.getAndroidId());
}
if
(
"accessibility_enabled"
.equals(xc_MethodHook$MethodHookParam.args[
0
])) {
((HashMap) v0_1).put(
"accessibility_enabled"
,
"0"
);
name =
"0"
;
xc_MethodHook$MethodHookParam.setResult(name);
}
if
(
"enabled_accessibility_services"
.equals(xc_MethodHook$MethodHookParam.args[
0
])) {
super
.afterHookedMethod(xc_MethodHook$MethodHookParam);
((HashMap) v0_1).put(
"enabled_accessibility_services"
,
null
);
xc_MethodHook$MethodHookParam.setResult(
null
);
}
}
if
(
"android_id"
.equals(xc_MethodHook$MethodHookParam.args[
0
])) {
xc_MethodHook$MethodHookParam.setResult((Object)
this
.deviceInfoModel.getAndroidId());
}
if
(
"adb_enabled"
.equals(xc_MethodHook$MethodHookParam.args[
0
])) {
xc_MethodHook$MethodHookParam.setResult((Object)
0
);
}
if
(
"data_roaming"
.equals(xc_MethodHook$MethodHookParam.args[
0
])) {
xc_MethodHook$MethodHookParam.setResult((Object)
0
);
}
if
(
"bluetooth_address"
.equals(xc_MethodHook$MethodHookParam.args[
0
])) {
if
(TextUtils.isEmpty(
this
.deviceInfoModel.getBtAddress())) {
super
.afterHookedMethod(xc_MethodHook$MethodHookParam);
xc_MethodHook$MethodHookParam.setResult(
this
.deviceInfoModel.getBtAddress());
}
}
if
(
"bluetooth_name"
.equals(xc_MethodHook$MethodHookParam.args[
0
])) {
if
(TextUtils.isEmpty(
this
.deviceInfoModel.getBtName())) {
super
.afterHookedMethod(xc_MethodHook$MethodHookParam);
xc_MethodHook$MethodHookParam.setResult(
this
.deviceInfoModel.getBtName());
}
}
if
(
"accessibility_enabled"
.equals(xc_MethodHook$MethodHookParam.args[
0
])) {
xc_MethodHook$MethodHookParam.setResult(
0
);
}
if
(
"enabled_accessibility_services"
.equals(xc_MethodHook$MethodHookParam.args[
0
])) {
xc_MethodHook$MethodHookParam.setResult(
null
);
super
.afterHookedMethod(xc_MethodHook$MethodHookParam);
}
if
(xc_MethodHook$MethodHookParam.args[
0
].toString().contains(
"accessibility"
)) {
xc_MethodHook$MethodHookParam.setResult(
null
);
}
}
else
{
if
(
"getStringForUser"
.equals(name)) {
if
(
"android.provider.Settings$NameValueCache"
.equals(v1)) {
this
.setAccessible(xc_MethodHook$MethodHookParam.thisObject,
"mValues"
);
v0_1 = XposedHelpers.getObjectField(xc_MethodHook$MethodHookParam.thisObject,
"mValues"
);
if
(
"android_id"
.equals(xc_MethodHook$MethodHookParam.args[
1
])) {
((HashMap) v0_1).put(
"android_id"
,
this
.deviceInfoModel.getAndroidId());
xc_MethodHook$MethodHookParam.setResult(
this
.deviceInfoModel.getAndroidId());
}
if
(
"accessibility_enabled"
.equals(xc_MethodHook$MethodHookParam.args[
1
])) {
((HashMap) v0_1).put(
"accessibility_enabled"
,
"0"
);
name =
"0"
;
xc_MethodHook$MethodHookParam.setResult(name);
}
if
(
"enabled_accessibility_services"
.equals(xc_MethodHook$MethodHookParam.args[
1
])) {
((HashMap) v0_1).put(
"enabled_accessibility_services"
,
null
);
xc_MethodHook$MethodHookParam.setResult(
null
);
}
super
.afterHookedMethod(xc_MethodHook$MethodHookParam);
}
if
(
"android_id"
.equals(xc_MethodHook$MethodHookParam.args[
1
])) {
xc_MethodHook$MethodHookParam.setResult((Object)
this
.deviceInfoModel.getAndroidId());
}
if
(
"adb_enabled"
.equals(xc_MethodHook$MethodHookParam.args[
1
])) {
xc_MethodHook$MethodHookParam.setResult((Object)
0
);
}
if
(
"data_roaming"
.equals(xc_MethodHook$MethodHookParam.args[
1
])) {
xc_MethodHook$MethodHookParam.setResult((Object)
0
);
}
if
(
"bluetooth_address"
.equals(xc_MethodHook$MethodHookParam.args[
1
])) {
if
(TextUtils.isEmpty(
this
.deviceInfoModel.getBtAddress())) {
super
.afterHookedMethod(xc_MethodHook$MethodHookParam);
xc_MethodHook$MethodHookParam.setResult(
this
.deviceInfoModel.getBtAddress());
}
}
if
(
"bluetooth_name"
.equals(xc_MethodHook$MethodHookParam.args[
1
])) {
if
(TextUtils.isEmpty(
this
.deviceInfoModel.getBtName())) {
super
.afterHookedMethod(xc_MethodHook$MethodHookParam);
xc_MethodHook$MethodHookParam.setResult(
this
.deviceInfoModel.getBtName());
}
}
if
(
"accessibility_enabled"
.equals(xc_MethodHook$MethodHookParam.args[
1
])) {
xc_MethodHook$MethodHookParam.setResult(
0
);
}
if
(
"enabled_accessibility_services"
.equals(xc_MethodHook$MethodHookParam.args[
1
])) {
xc_MethodHook$MethodHookParam.setResult(
null
);
super
.afterHookedMethod(xc_MethodHook$MethodHookParam);
}
if
(xc_MethodHook$MethodHookParam.args[
1
].toString().contains(
"accessibility"
)) {
xc_MethodHook$MethodHookParam.setResult(
null
);
}
}
if
(
"set"
.equals(name)) {
Log.i(
"SysPropertyHook"
,
"SystemProperties set : "
+ xc_MethodHook$MethodHookParam.args[
0
] +
" , "
+ xc_MethodHook$MethodHookParam.args[
1
]);
}
if
(!
"getInt"
.equals(name)) {
}
if
(
"ro.build.version.sdk"
.equals(xc_MethodHook$MethodHookParam.args[
0
])) {
xc_MethodHook$MethodHookParam.setResult(
this
.deviceInfoModel.getBuildSdk());
}
}
}
@Override
protected
void
beforeHookedMethod(XC_MethodHook.MethodHookParam paramMethodHookParam)
throws
Throwable {
super
.beforeHookedMethod(paramMethodHookParam);
String str1 = paramMethodHookParam.method.getName();
Class localClass = paramMethodHookParam.method.getDeclaringClass();
if
(
"putStringForUser"
.equals(str1)) {
Class[] arrayOfClass =
new
Class[
3
];
arrayOfClass[
0
] = ContentResolver.
class
;
arrayOfClass[
1
] = String.
class
;
arrayOfClass[
2
] = Integer.TYPE;
Method localMethod = localClass.getDeclaredMethod(
"getStringForUser"
, arrayOfClass);
Object[] arrayOfObject =
new
Object[
3
];
arrayOfObject[
0
] = paramMethodHookParam.args[
0
];
arrayOfObject[
1
] = paramMethodHookParam.args[
1
];
arrayOfObject[
2
] = paramMethodHookParam.args[
3
];
String str2 = (String) localMethod.invoke(localClass, arrayOfObject);
String str3 = localClass.getSimpleName() +
","
+ paramMethodHookParam.args[
1
] +
","
+ paramMethodHookParam.args[
2
] +
","
+ str2;
Log.i(
"SysPropertyHook"
,
" Settings putStringForUser : "
+str3);
}
else
if
(
"get"
.equals(str1)){
setBuilds();
}
}
}