@Override public ProviderInfo resolveContentProvider(final String name, final int flags) { final ProviderInfo provider = super.resolveContentProvider(name, flags); if (! mCondom.shouldAllowProvider(provider)) return null; return provider; }
@Override public IContentProvider acquireProvider(final Context context, final String name) { if (! mCondom.shouldAllowProvider(context, name, PackageManager.MATCH_ALL)) return null; return super.acquireProvider(context, name); }
@Override public IContentProvider acquireUnstableProvider(final Context context, final String name) { if (! mCondom.shouldAllowProvider(context, name, PackageManager.MATCH_ALL)) return null; return super.acquireUnstableProvider(context, name); }
boolean shouldAllowProvider(final Context context, final String name, final int flags) { return shouldAllowProvider(context.getPackageManager().resolveContentProvider(name, flags)); }
case "getContentProvider": final String name = (String) args[1]; if (! mCondom.shouldAllowProvider(mCondom.mBase, name, PackageManager.MATCH_ALL)) // MATCH_ALL as special hint to ask the hooked IPackageManager.resolveContentProvider() to bypass. return null; // Actually blocked by IPackageManager.resolveContentProvider() which is called in shouldAllowProvider() above. break;
final int flags = (int) args[1]; if ((flags & PackageManager.MATCH_ALL) != 0) return provider; // MATCH_ALL will be used by the hooked IActivityManager.getContentProvider(). return mCondom.shouldAllowProvider(provider) ? provider : null; case "getInstalledApplications": case "getInstalledPackages":
@Override public ProviderInfo resolveContentProvider(final String name, final int flags) { final ProviderInfo provider = super.resolveContentProvider(applyRedirect(name), flags); if (! mCondom.shouldAllowProvider(provider)) return null; return provider; }
@Override public IContentProvider acquireUnstableProvider(final Context context, final String name) { if (! mCondom.shouldAllowProvider(context, name, PackageManager.GET_UNINSTALLED_PACKAGES)) return null; return super.acquireUnstableProvider(context, name); }
@Override public IContentProvider acquireProvider(final Context context, final String name) { if (! mCondom.shouldAllowProvider(context, name, PackageManager.GET_UNINSTALLED_PACKAGES)) return null; return super.acquireProvider(context, name); }
boolean shouldAllowProvider(final Context context, final String name, final int flags) { return shouldAllowProvider(context.getPackageManager().resolveContentProvider(name, flags)); }
return mCondom.shouldAllowProvider(provider) ? provider : null; case "getInstalledApplications": case "getInstalledPackages":
private Object proceed(final Object proxy, final Method method, final Object[] args) throws Exception { final String method_name = method.getName(); final Intent intent; switch (method_name) { case "broadcastIntent": return mCondom.proceed(OutboundType.BROADCAST, (Intent) args[1], 0/* ActivityManager.BROADCAST_SUCCESS */, new CondomCore.WrappedValueProcedureThrows<Integer, Exception>() { @Override public Integer proceed() throws Exception { return (Integer) CondomProcessActivityManager.super.invoke(proxy, method, args); }}); case "bindService": intent = (Intent) args[2]; final Integer result = mCondom.proceed(OutboundType.BIND_SERVICE, intent, 0, new CondomCore.WrappedValueProcedureThrows<Integer, Exception>() { @Override public Integer proceed() throws Exception { return (Integer) CondomProcessActivityManager.super.invoke(proxy, method, args); }}); // Result: 0 - no match, >0 - succeed, <0 - SecurityException. if (result > 0) mCondom.logIfOutboundPass(FULL_TAG, intent, CondomCore.getTargetPackage(intent), CondomCore.CondomEvent.BIND_PASS); return result; case "startService": intent = (Intent) args[1]; final ComponentName component = mCondom.proceed(OutboundType.START_SERVICE, intent, null, new CondomCore.WrappedValueProcedureThrows<ComponentName, Exception>() { @Override public ComponentName proceed() throws Exception { return (ComponentName) CondomProcessActivityManager.super.invoke(proxy, method, args); }}); if (component != null) mCondom.logIfOutboundPass(FULL_TAG, intent, component.getPackageName(), CondomCore.CondomEvent.START_PASS); return component; case "getContentProvider": final String name = (String) args[1]; if (! mCondom.shouldAllowProvider(mCondom.mBase, name, PackageManager.GET_UNINSTALLED_PACKAGES)) return null; // Actually blocked by IPackageManager.resolveContentProvider() which is called in shouldAllowProvider() above. break; } return super.invoke(proxy, method, args); }