hasking
哦哦 不好意思 应该是我理解错了,我以为是 untrusted app去调用 putStringForUser。
很久之前的文章,是我没表达清楚,最好直接在系统服务里面改,最保险。
```
Class<?> SettingsProviderClazz = RuntimeManagerService.findclass(
"com.android.providers.settings.SettingsProvider");
if (SettingsProviderClazz == null) {
CLog.e("ServiceBaseInfoProcessor mockAndroidId ContentProviderProxyClazz == null");
return;
}
//public Bundle call(String method, String name, Bundle args) {
hook_set.add(RposedHelpers.findAndHookMethod(SettingsProviderClazz,
"call", String.class,
String.class, Bundle.class, new RC_MethodHook() {
@Override
protected void afterHookedMethod(MethodHookParam param) throws Throwable {
super.afterHookedMethod(param);
//GET_secure/android_id/Bundle[mParcelledData.dataSize=48]
var thisOjb = (ContentProvider) param.thisObject;
if (thisOjb == null) return;
//if(!FPServiceProcessManager.isMatchCallPackageInfo(thisOjb.getCallingPackage())) return;
String key = (String) param.args[1];
if (StringUtils.isEmpty(key)) {
return;
}
//args bundle
//Bundle bundle = (Bundle) param.args[2];
//result
Bundle result = (Bundle) param.getResult();
if (result == null) return;
String orig_value = result.getString("value");
if (StringUtils.isEmpty(orig_value)) {
//CLog.e("[" + key + "] orig_value == null orig -> "+orig_value+" " + thisOjb.getCallingPackage());
return;
}
String mock_value = getMockValueDistribution(orig_value, key, thisOjb.getCallingPackage());
if (StringUtils.isEmpty(mock_value)) {
CLog.e("[" + key + "] mock_value == null orig -> " + orig_value + " " + thisOjb.getCallingPackage());
return;
}
//不相等情况进行set
if (mock_value.equals(orig_value)) {
return;
}
Bundle temp_result = new Bundle();
temp_result.putString("value", mock_value);
param.setResult(temp_result);
// CLog.i("[" + key + "] system_service orig value [" + orig_value + "] mock value -> ["
// + mock_value + "] call package -> " + thisOjb.getCallingPackage());
}
}));
```
系统服务里面hook这个