@Override public ProviderHook fetch(boolean external, IInterface provider) { if (external) { return new ExternalProviderHook(provider); } return new InternalProviderHook(provider); } };
@Override public Cursor query(MethodBox methodBox, Uri url, String[] projection, String selection, String[] selectionArgs, String sortOrder, Bundle originQueryArgs) throws InvocationTargetException { Cursor cursor = super.query(methodBox, url, projection, selection, selectionArgs, sortOrder, originQueryArgs); return new QueryRedirectCursor(cursor, DownloadManager.COLUMN_LOCAL_FILENAME); } }
@Override public Cursor query(MethodBox methodBox, Uri url, String[] projection, String selection, String[] selectionArgs, String sortOrder, Bundle originQueryArgs) throws InvocationTargetException { Cursor cursor = super.query(methodBox, url, projection, selection, selectionArgs, sortOrder, originQueryArgs); return new QueryRedirectCursor(cursor, COLUMN_NAME); } }
@Override public Object invoke(Object proxy, Method method, Object... args) throws Throwable { try { processArgs(method, args); } catch (Throwable e) { e.printStackTrace(); String arg = (String) args[start + 1]; Bundle extras = (Bundle) args[start + 2]; return call(methodBox, methodName, arg, extras); } else if ("insert".equals(name)) { Uri url = (Uri) args[start]; ContentValues initialValues = (ContentValues) args[start + 1]; return insert(methodBox, url, initialValues); } else if ("getType".equals(name)) { return getType(methodBox, (Uri) args[0]); } else if ("delete".equals(name)) { Uri url = (Uri) args[start]; String selection = (String) args[start + 1]; String[] selectionArgs = (String[]) args[start + 2]; return delete(methodBox, url, selection, selectionArgs); } else if ("bulkInsert".equals(name)) { Uri url = (Uri) args[start]; ContentValues[] initialValues = (ContentValues[]) args[start + 1]; return bulkInsert(methodBox, url, initialValues); } else if ("update".equals(name)) { Uri url = (Uri) args[start]; String selection = (String) args[start + 2]; String[] selectionArgs = (String[]) args[start + 3];
public static IInterface createProxy(boolean external, String authority, IInterface provider) { if (provider instanceof Proxy && Proxy.getInvocationHandler(provider) instanceof ProviderHook) { return provider; } ProviderHook.HookFetcher fetcher = ProviderHook.fetchHook(authority); if (fetcher != null) { ProviderHook hook = fetcher.fetch(external, provider); IInterface proxyProvider = ProviderHook.createProxy(provider, hook); if (proxyProvider != null) { provider = proxyProvider; } } return provider; }
@Override public Bundle call(MethodBox methodBox, String method, String arg, Bundle extras) throws InvocationTargetException { if (!VClientImpl.get().isBound()) { return methodBox.call(); } int methodType = getMethodType(method); if (METHOD_GET == methodType) { String presetValue = PRE_SET_VALUES.get(arg); if (presetValue != null) { return wrapBundle(arg, presetValue); } if ("android_id".equals(arg)) { return wrapBundle("android_id", VClientImpl.get().getDeviceInfo().androidId); } } if (METHOD_PUT == methodType) { if (isSecureMethod(method)) { return null; } } try { return methodBox.call(); } catch (InvocationTargetException e) { if (e.getCause() instanceof SecurityException) { return null; } throw e; } }
provider = ProviderHook.createProxy(true, info.authority, provider); ActivityThread.ProviderClientRecordJB.mProvider.set(clientRecord, provider); ContentProviderHolderOreo.provider.set(holder, provider); provider = ProviderHook.createProxy(true, info.authority, provider); ActivityThread.ProviderClientRecordJB.mProvider.set(clientRecord, provider); IActivityManager.ContentProviderHolder.provider.set(holder, provider); IInterface provider = ActivityThread.ProviderClientRecord.mProvider.get(clientRecord); if (provider != null && !authority.startsWith(VASettings.STUB_CP_AUTHORITY)) { provider = ProviderHook.createProxy(true, authority, provider); ActivityThread.ProviderClientRecord.mProvider.set(clientRecord, provider);
@Override public ProviderHook fetch(boolean external, IInterface provider) { return new SettingsProviderHook(provider); } });
@Override public ProviderHook fetch(boolean external, IInterface provider) { return new DownloadProviderHook(provider); } });
@Override protected void processArgs(Method method, Object... args) { super.processArgs(method, args); } }
@Override public Uri insert(MethodBox methodBox, Uri url, ContentValues initialValues) throws InvocationTargetException { if (!(MediaStore.Audio.Media.INTERNAL_CONTENT_URI.equals(url) || MediaStore.Audio.Media.EXTERNAL_CONTENT_URI.equals(url)) || MediaStore.Video.Media.INTERNAL_CONTENT_URI.equals(url) || MediaStore.Video.Media.EXTERNAL_CONTENT_URI.equals(url) || MediaStore.Images.Media.INTERNAL_CONTENT_URI.equals(url) || MediaStore.Images.Media.EXTERNAL_CONTENT_URI.equals(url) ) { return super.insert(methodBox, url, initialValues); } Object v2 = initialValues.get(COLUMN_NAME); if (!(v2 instanceof String)) { return super.insert(methodBox, url, initialValues); } String path = NativeEngine.getEscapePath((String) v2); initialValues.put(COLUMN_NAME, path); return super.insert(methodBox, url, initialValues); }
@Override public Uri insert(MethodBox methodBox, Uri url, ContentValues initialValues) throws InvocationTargetException { if (initialValues.containsKey(COLUMN_NOTIFICATION_PACKAGE)) { initialValues.put(COLUMN_NOTIFICATION_PACKAGE, VirtualCore.get().getHostPkg()); } if (initialValues.containsKey(COLUMN_COOKIE_DATA)) { String cookie = initialValues.getAsString(COLUMN_COOKIE_DATA); initialValues.remove(COLUMN_COOKIE_DATA); // retrieve the next free INSERT_KEY_PREFIX int headerIndex = 0; while (initialValues.containsKey(INSERT_KEY_PREFIX + headerIndex)) { headerIndex++; } // add the cookie initialValues.put(INSERT_KEY_PREFIX + headerIndex, "Cookie" + ": " + cookie); } if (!initialValues.containsKey(COLUMN_IS_PUBLIC_API)) { initialValues.put(COLUMN_IS_PUBLIC_API, true); } for (String column : ENFORCE_REMOVE_COLUMNS) { if (initialValues.containsKey(column)) { initialValues.remove(column); } } return super.insert(methodBox, url, initialValues); }
@Override public ProviderHook fetch(boolean external, IInterface provider) { return new MediaProviderHook(provider); } });
@Override public void copyStringToBuffer(int columnIndex, CharArrayBuffer buffer) { if (columnIndex < 0 || columnIndex != this.dataIndex || buffer == null) { super.copyStringToBuffer(columnIndex, buffer); return; } String path = getString(columnIndex); if (path == null) { super.copyStringToBuffer(columnIndex, buffer); return; } char[] chars = path.toCharArray(); int v1 = Math.min(chars.length, buffer.data.length); System.arraycopy(chars, 0, buffer.data, 0, v1); buffer.sizeCopied = v1; }
@Override public ProviderHook fetch(boolean external, IInterface provider) { if (external) { return new ExternalProviderHook(provider); } return new InternalProviderHook(provider); } };
@Override public Cursor query(MethodBox methodBox, Uri url, String[] projection, String selection, String[] selectionArgs, String sortOrder, Bundle originQueryArgs) throws InvocationTargetException { Cursor cursor = super.query(methodBox, url, projection, selection, selectionArgs, sortOrder, originQueryArgs); return new QueryRedirectCursor(cursor, COLUMN_NAME); } }
@Override public Cursor query(MethodBox methodBox, Uri url, String[] projection, String selection, String[] selectionArgs, String sortOrder, Bundle originQueryArgs) throws InvocationTargetException { Cursor cursor = super.query(methodBox, url, projection, selection, selectionArgs, sortOrder, originQueryArgs); return new QueryRedirectCursor(cursor, DownloadManager.COLUMN_LOCAL_FILENAME); } }
info = ContentProviderHolderOreo.info.get(holder); if (provider != null) { provider = ProviderHook.createProxy(true, info.authority, provider); info = IActivityManager.ContentProviderHolder.info.get(holder); if (provider != null) { provider = ProviderHook.createProxy(true, info.authority, provider);
@Override public ProviderHook fetch(boolean external, IInterface provider) { return new MediaProviderHook(provider); } });
@Override public ProviderHook fetch(boolean external, IInterface provider) { if (external) { return new ExternalProviderHook(provider); } return new InternalProviderHook(provider); } };