Skip to content

Instantly share code, notes, and snippets.

@spacekitteh
Created February 8, 2017 00:29
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save spacekitteh/dc857bd6dd4da7b67ff436e1ed1032d9 to your computer and use it in GitHub Desktop.
Save spacekitteh/dc857bd6dd4da7b67ff436e1ed1032d9 to your computer and use it in GitHub Desktop.
project build/
diff --git a/target/product/core.mk b/target/product/core.mk
index b108b145e..a8d4ac4b6 100644
--- a/target/product/core.mk
+++ b/target/product/core.mk
@@ -60,6 +60,10 @@ PRODUCT_PACKAGES += \
MmsService \
chromium \
Updater \
+ GmsCore \
+ GsfProxy \
+ MicroGUiTools\
+ UnifiedNlpApi\
F-Droid \
PdfViewer
project frameworks/base/
diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml
index 430c6b64..b23fdb3d 100644
--- a/core/res/AndroidManifest.xml
+++ b/core/res/AndroidManifest.xml
@@ -1903,6 +1903,13 @@
android:description="@string/permdesc_getPackageSize"
android:protectionLevel="normal" />
+ <!-- @hide Allows an application to change the package signature as
+ seen by applications -->
+ <permission android:name="android.permission.FAKE_PACKAGE_SIGNATURE"
+ android:protectionLevel="dangerous"
+ android:label="@string/permlab_fakePackageSignature"
+ android:description="@string/permdesc_fakePackageSignature" />
+
<!-- @deprecated No longer useful, see
{@link android.content.pm.PackageManager#addPackageToPreferred}
for details. -->
diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml
index b79f8a1b..1b21416b 100644
--- a/core/res/res/values/config.xml
+++ b/core/res/res/values/config.xml
@@ -1267,6 +1267,8 @@
<string-array name="config_locationProviderPackageNames" translatable="false">
<!-- The standard AOSP fused location provider -->
<item>com.android.location.fused</item>
+ <!-- The (faked) microg fused location provider -->
+ <item>com.google.android.gms</item>
</string-array>
<!-- This string array can be overriden to enable test location providers initially. -->
diff --git a/core/res/res/values/strings.xml b/core/res/res/values/strings.xml
index f42c9ed1..cfbc4af3 100644
--- a/core/res/res/values/strings.xml
+++ b/core/res/res/values/strings.xml
@@ -664,6 +664,11 @@
<!-- Permissions -->
<!-- Title of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
+ <string name="permlab_fakePackageSignature">Spoof package signature</string>
+ <!-- Description of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
+ <string name="permdesc_fakePackageSignature">Allows the app to pretend to be a different app. Malicious applications might be able to use this to access private application data. Grant this permission with caution only!</string>
+
+ <!-- Title of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
<string name="permlab_statusBar">disable or modify status bar</string>
<!-- Description of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
<string name="permdesc_statusBar">Allows the app to disable the status bar or add and remove system icons.</string>
diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java
index 430538f7..b625b1cc 100644
--- a/services/core/java/com/android/server/pm/PackageManagerService.java
+++ b/services/core/java/com/android/server/pm/PackageManagerService.java
@@ -3067,8 +3067,38 @@ public class PackageManagerService extends IPackageManager.Stub {
? Collections.<String>emptySet() : permissionsState.getPermissions(userId);
final PackageUserState state = ps.readUserState(userId);
- return PackageParser.generatePackageInfo(p, gids, flags,
- ps.firstInstallTime, ps.lastUpdateTime, permissions, state, userId);
+ return mayFakeSignature(p, PackageParser.generatePackageInfo(p, gids, flags,
+ ps.firstInstallTime, ps.lastUpdateTime, permissions, state, userId),
+ permissions);
+ }
+
+ private PackageInfo mayFakeSignature(PackageParser.Package p, PackageInfo pi,
+ Set<String> permissions) {
+ try {
+ if (permissions.contains("android.permission.FAKE_PACKAGE_SIGNATURE")
+ && p.applicationInfo.targetSdkVersion > Build.VERSION_CODES.LOLLIPOP_MR1
+ && p.mAppMetaData != null
+ // Check that it's actually allowed to fake a package signature.
+ // Only core system apps are allowed.
+ && isSystemApp(p)
+ //|| (p.applicationInfo.privateFlags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) != 0)
+ && true == p.coreApp ){
+ String sig = p.mAppMetaData.getString("fake-signature");
+ if (sig != null && pi.signatures != null ){
+ // Add faked signature to the package signatures.
+ Signature[] newSigs = new Signature[pi.signatures.length + 1];
+ System.arraycopy(pi.signatures, 0, newSigs, 0, pi.signatures.length);
+ newSigs[newSigs.length - 1] = new Signature(sig);
+ Log.i("PackageManagerService.FAKE_PACKAGE_SIGNATURE", "Faking package signature: " +
+ sig.toString());
+ pi.signatures = newSigs;
+ }
+ }
+ } catch (Throwable t) {
+ // We should never die because of any failures, this is system code!
+ Log.w("PackageManagerService.FAKE_PACKAGE_SIGNATURE", t);
+ }
+ return pi;
}
@Override
project packages/apps/GmsCore/
diff --git a/Android.mk b/Android.mk
index 516e72b..46f1f2a 100644
--- a/Android.mk
+++ b/Android.mk
@@ -26,12 +26,12 @@ gmscore_build := $(gmscore_root)/$(gmscore_dir)/build
gmscore_apk := build/outputs/apk/play-services-core-release-unsigned.apk
$(gmscore_root)/$(gmscore_dir)/$(gmscore_apk):
- rm -Rf $(gmscore_build)
- mkdir -p $(gmscore_out)
- ln -s $(gmscore_out) $(gmscore_build)
- echo "sdk.dir=$(ANDROID_HOME)" > $(gmscore_root)/local.properties
- cd $(gmscore_root) && git submodule update --recursive --init
- cd $(gmscore_root)/$(gmscore_dir) && JAVA_TOOL_OPTIONS="$(JAVA_TOOL_OPTIONS) -Dfile.encoding=UTF8" ../gradlew assembleRelease
+ rm -Rf $(gmscore_build);\
+ mkdir -p $(ANDROID_BUILD_TOP)/$(gmscore_out);\
+ ln -s $(ANDROID_BUILD_TOP)/$(gmscore_out) $(ANDROID_BUILD_TOP)/$(gmscore_build) ;\
+ echo "sdk.dir=$(ANDROID_HOME)" > $(gmscore_root)/local.properties ;\
+ cd $(gmscore_root) && git submodule update --recursive --init ;\
+ cd $(gmscore_dir) && JAVA_TOOL_OPTIONS="$(JAVA_TOOL_OPTIONS) -Dfile.encoding=UTF8" ../gradlew assembleRelease
LOCAL_CERTIFICATE := platform
LOCAL_SRC_FILES := $(gmscore_dir)/$(gmscore_apk)
diff --git a/play-services-core/src/main/AndroidManifest.xml b/play-services-core/src/main/AndroidManifest.xml
index 96f3b38..b03eb9f 100644
--- a/play-services-core/src/main/AndroidManifest.xml
+++ b/play-services-core/src/main/AndroidManifest.xml
@@ -15,6 +15,7 @@
~ limitations under the License.
-->
<manifest package="com.google.android.gms"
+ coreApp="true"
xmlns:android="http://schemas.android.com/apk/res/android">
<permission
project packages/apps/GsfProxy/
diff --git a/Android.mk b/Android.mk
index 50889ae..f3988d1 100644
--- a/Android.mk
+++ b/Android.mk
@@ -26,12 +26,12 @@ gsfproxy_build := $(gsfproxy_root)/$(gsfproxy_dir)/build
gsfproxy_apk := build/outputs/apk/services-framework-proxy-release-unsigned.apk
$(gsfproxy_root)/$(gsfproxy_dir)/$(gsfproxy_apk):
- rm -Rf $(gsfproxy_build)
- mkdir -p $(gsfproxy_out)
- ln -s $(gsfproxy_out) $(gsfproxy_build)
- echo "sdk.dir=$(ANDROID_HOME)" > $(gsfproxy_root)/local.properties
- cd $(gsfproxy_root) && git submodule update --recursive --init
- cd $(gsfproxy_root)/$(gsfproxy_dir) && JAVA_TOOL_OPTIONS="$(JAVA_TOOL_OPTIONS) -Dfile.encoding=UTF8" ../gradlew assembleRelease
+ rm -Rf $(gsfproxy_build); \
+ mkdir -p $(ANDROID_BUILD_TOP)/$(gsfproxy_out); \
+ ln -s $(ANDROID_BUILD_TOP)/$(gsfproxy_out) $(ANDROID_BUILD_TOP)/$(gsfproxy_build); \
+ echo "sdk.dir=$(ANDROID_HOME)" > $(gsfproxy_root)/local.properties; \
+ cd $(gsfproxy_root) && git submodule update --recursive --init ; \
+ cd $(gsfproxy_dir) && JAVA_TOOL_OPTIONS="$(JAVA_TOOL_OPTIONS) -Dfile.encoding=UTF8" ../gradlew assembleRelease
LOCAL_CERTIFICATE := platform
LOCAL_SRC_FILES := $(gsfproxy_dir)/$(gsfproxy_apk)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment