package mobi.acpm.inspeckage.util; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; import android.content.pm.ActivityInfo; import android.content.pm.ApplicationInfo; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.content.pm.PathPermission; import android.content.pm.PermissionInfo; import android.content.pm.ProviderInfo; import android.content.pm.ServiceInfo; import java.util.List; import mobi.acpm.inspeckage.Module; /** * Created by acpm on 16/11/15. */ public class PackageDetail { private PackageInfo mPInfo; private ApplicationInfo mAppInfo; private Context mContext; private SharedPreferences mPrefs; private PackageManager pm; public PackageDetail(Context context, String app) { mPrefs = context.getSharedPreferences(Module.PREFS, context.MODE_WORLD_READABLE); mContext = context; pm = context.getPackageManager(); List<PackageInfo> plist = context.getPackageManager().getInstalledPackages(0); for (PackageInfo pi : plist) { if (mPrefs.getBoolean(Config.SP_SWITCH_OUA, true) ? (pi.applicationInfo.flags & 129) == 0 : true) { if (pi.packageName.equals(app)) { try { //gohorse to bypass "TransactionTooLargeExceptions" mPInfo = pm.getPackageInfo(app, PackageManager.GET_META_DATA); mPInfo.gids = pm.getPackageInfo(app, PackageManager.GET_GIDS).gids; mPInfo.activities = pm.getPackageInfo(app, PackageManager.GET_ACTIVITIES).activities;//0xFFFFFFFF); mPInfo.providers = pm.getPackageInfo(app, PackageManager.GET_PROVIDERS).providers; mPInfo.receivers = pm.getPackageInfo(app, PackageManager.GET_RECEIVERS).receivers; mPInfo.services = pm.getPackageInfo(app, PackageManager.GET_SERVICES).services; mPInfo.applicationInfo.sharedLibraryFiles = pm.getPackageInfo(app, PackageManager.GET_SHARED_LIBRARY_FILES).applicationInfo.sharedLibraryFiles; mPInfo.permissions = pm.getPackageInfo(app, PackageManager.GET_PERMISSIONS).permissions; mPInfo.requestedPermissions = pm.getPackageInfo(app, PackageManager.GET_PERMISSIONS).requestedPermissions; mAppInfo = pi.applicationInfo; } catch (PackageManager.NameNotFoundException e) { e.printStackTrace(); } } } } } public Intent getLaunchIntent() { return pm.getLaunchIntentForPackage(getPackageName()); } public String getPackageName() { String pkg_name = ""; if (mPInfo != null) { pkg_name = mPInfo.packageName; } return pkg_name; } public String getAppName() { return "" + mPInfo.applicationInfo.loadLabel(mContext.getPackageManager()).toString(); } public String getVersion() { return mPInfo.versionName; } public String getRequestedPermissions() { StringBuilder sb = new StringBuilder(); if (mPInfo.requestedPermissions != null) { for (String perm : mPInfo.requestedPermissions) { sb.append(perm + "\n"); } } else { sb.append("-- Permissions\n"); } return sb.toString(); } public String getAppPermissions() { StringBuilder sb = new StringBuilder(); if (mPInfo.permissions != null) { for (PermissionInfo perm : mPInfo.permissions) { sb.append(perm.name + "\n"); } } else { sb.append("-- Permissions\n"); } return sb.toString(); } public String getExportedActivities() { StringBuilder sb = new StringBuilder(); if (mPInfo.activities != null) { for (ActivityInfo ai : mPInfo.activities) { //ComponentInfo ci = new ComponentInfo(ai); if (ai.exported) { if (ai.permission != null) { sb.append(ai.name + " PERM: " + ai.permission + "\n"); } else { sb.append(ai.name + "\n"); } } } } else { sb.append(" -- null"); } return sb.toString(); } public String getNonExportedActivities() { StringBuilder sb = new StringBuilder(); if (mPInfo.activities != null) { for (ActivityInfo ai : mPInfo.activities) { if (!ai.exported) sb.append(ai.name + "\n"); } } else { sb.append(" -- null"); } return sb.toString(); } public String getExportedServices() { StringBuilder sb = new StringBuilder(); if (mPInfo.services != null) { for (ServiceInfo si : mPInfo.services) { if (si.exported) { if (si.permission != null) { sb.append(si.name + " PERM: " + si.permission + "\n"); } else { sb.append(si.name + "\n"); } } } } else { sb.append(" -- null"); } return sb.toString(); } public String getNonExportedServices() { StringBuilder sb = new StringBuilder(); if (mPInfo.services != null) { for (ServiceInfo si : mPInfo.services) { if (!si.exported) { if (si.permission != null) { sb.append(si.name + " PERM: " + si.permission + "\n"); } else { sb.append(si.name + "\n"); } } } } else { sb.append(" -- null"); } return sb.toString(); } public String getExportedBroadcastReceivers() { StringBuilder sb = new StringBuilder(); if (mPInfo.receivers != null) { for (ActivityInfo ai : mPInfo.receivers) { if (ai.exported) { if (ai.permission != null) { sb.append(ai.name + " PERM: " + ai.permission + "\n"); } else { sb.append(ai.name + "\n"); } } } } else { sb.append(" -- null"); } return sb.toString(); } public String getNonExportedBroadcastReceivers() { StringBuilder sb = new StringBuilder(); if (mPInfo.receivers != null) { for (ActivityInfo ai : mPInfo.receivers) { if (!ai.exported) { if (ai.permission != null) { sb.append(ai.name + " PERM: " + ai.permission + "\n"); } else { sb.append(ai.name + "\n"); } } } } else { sb.append(" -- null"); } return sb.toString(); } public String getExportedContentProvider() { StringBuilder sb = new StringBuilder(); if (mPInfo.providers != null) { for (ProviderInfo pi : mPInfo.providers) { String piName = pi.name; if (pi.exported) { //Grant Uri Permissions piName = piName + " GRANT: " + String.valueOf(pi.grantUriPermissions) + "|"; if (pi.authority != null) { piName = piName + " AUTHORITY: " + pi.authority + "|"; } if (pi.readPermission != null) { piName = piName + " READ: " + pi.readPermission + "|"; } if (pi.writePermission != null) { piName = piName + " WRITE: " + pi.writePermission + "|"; } PathPermission[] pp = pi.pathPermissions; if (pp != null) { for (PathPermission pathPermission : pp) { piName = piName + " PATH: " + pathPermission.getPath() + "|"; piName = piName + " - READ: " + pathPermission.getReadPermission() + "|"; piName = piName + " - WRITE: " + pathPermission.getWritePermission() + "|"; } } sb.append(piName + "\n"); } } } else { sb.append(" -- null"); } return sb.toString(); } public String getNonExportedContentProvider() { StringBuilder sb = new StringBuilder(); if (mPInfo.providers != null) { for (ProviderInfo pi : mPInfo.providers) { String piName = pi.name; if (!pi.exported) { //Grant Uri Permissions piName = piName + " GRANT: " + String.valueOf(pi.grantUriPermissions) + "|"; if (pi.authority != null) { piName = piName + " AUTHORITY: " + pi.authority + "|"; } if (pi.readPermission != null) { piName = piName + " READ: " + pi.readPermission + "|"; } if (pi.writePermission != null) { piName = piName + " WRITE: " + pi.writePermission + "|"; } PathPermission[] pp = pi.pathPermissions; if (pp != null) { for (PathPermission pathPermission : pp) { piName = piName + " PATH: " + pathPermission.getPath() + "|"; piName = piName + " - READ: " + pathPermission.getReadPermission() + "|"; piName = piName + " - WRITE: " + pathPermission.getWritePermission() + "|"; } } sb.append(piName + "\n"); } } } else { sb.append(" -- null"); } return sb.toString(); } public String getUID() { String uid = ""; if (mAppInfo != null) { uid = String.valueOf(mAppInfo.uid); } else { uid = "-- null"; } return uid; } public String getProcessName() { String pname = ""; if (mAppInfo != null) { pname = mAppInfo.processName; } else { pname = "-- null"; } return pname; } public String getDataDir() { String dir = ""; if (mAppInfo != null) { dir = mAppInfo.dataDir; } return dir; } public String getGIDs() { String gidList = ""; if (mPInfo.gids != null && mPInfo.gids.length != 0) { for (int gid : mPInfo.gids) { gidList = gidList + "" + gid + "-"; } } else { gidList = "-- null"; } return gidList.substring(0, gidList.length() - 1); } public String isDebuggable() { Boolean isDebuggable = false; if (0 != (mAppInfo.flags & ApplicationInfo.FLAG_DEBUGGABLE)) { isDebuggable = true; } return String.valueOf(isDebuggable); } public String allowBackup() { Boolean allow = false; if (0 != (mAppInfo.flags & ApplicationInfo.FLAG_ALLOW_BACKUP)) { allow = true; } return String.valueOf(allow); } public String getIconBase64() { String icon = ""; if (mAppInfo != null) { icon = Util.imageToBase64(mAppInfo.loadIcon(pm)); } return icon; } public String getSharedUserId() { String suserid = ""; if (mPInfo.sharedUserId != null) { suserid = mPInfo.sharedUserId; } else { suserid = "-- null"; } return suserid; } public String getApkDir() { String sourceDir = ""; if (mPInfo.applicationInfo.publicSourceDir != null) sourceDir = mPInfo.applicationInfo.publicSourceDir; return sourceDir; } public String getSharedLibraries() { StringBuilder sb = new StringBuilder(); if (mPInfo.applicationInfo.sharedLibraryFiles != null) { for (String sl : mPInfo.applicationInfo.sharedLibraryFiles) { sb.append(sl + "\n"); } } else { sb.append(" -- null"); } return sb.toString(); } public void extractInfoToFile() { StringBuilder sb = new StringBuilder(); sb.append("Package: " + getPackageName() + "\n"); sb.append("Process Name: " + getProcessName() + "\n"); sb.append("APK Dir: " + getApkDir() + "\n"); sb.append("UID: " + getUID() + "\n"); sb.append("GIDs: " + getGIDs() + "\n"); sb.append("Is Debuggable: " + isDebuggable() + "\n"); sb.append("Allow Backup: " + allowBackup() + "\n"); sb.append("Shared User ID: " + getSharedUserId() + "\n"); sb.append(getRequestedPermissions()); sb.append(getAppPermissions()); sb.append(getExportedActivities()); sb.append(getNonExportedActivities()); sb.append(getExportedServices()); sb.append(getNonExportedServices()); sb.append(getExportedBroadcastReceivers()); sb.append(getNonExportedBroadcastReceivers()); sb.append(getExportedContentProvider()); sb.append(getNonExportedContentProvider()); sb.append(getSharedLibraries()); FileUtil.writeToFile(mPrefs, sb.toString(), FileType.PACKAGE, ""); /** FileUtil.writeToFile(mPrefs, "Package: " + getPackageName() + "\n", FileType.PACKAGE, ""); FileUtil.writeToFile(mPrefs, "Process Name: " + getProcessName() + "\n", FileType.PACKAGE, ""); FileUtil.writeToFile(mPrefs, "APK Dir: " + getApkDir() + "\n", FileType.PACKAGE, ""); FileUtil.writeToFile(mPrefs, "UID: " + getUID() + "\n", FileType.PACKAGE, ""); FileUtil.writeToFile(mPrefs, "GIDs: " + getGIDs() + "\n", FileType.PACKAGE, ""); FileUtil.writeToFile(mPrefs, "Is Debuggable: " + isDebuggable() + "\n", FileType.PACKAGE, ""); FileUtil.writeToFile(mPrefs, "Shared User ID: " + getSharedUserId() + "\n", FileType.PACKAGE, ""); FileUtil.writeToFile(mPrefs, getRequestedPermissions(), FileType.PACKAGE, ""); FileUtil.writeToFile(mPrefs, getAppPermissions(), FileType.PACKAGE, ""); FileUtil.writeToFile(mPrefs, getExportedActivities(), FileType.PACKAGE, ""); FileUtil.writeToFile(mPrefs, getNonExportedActivities(), FileType.PACKAGE, ""); FileUtil.writeToFile(mPrefs, getExportedServices(), FileType.PACKAGE, ""); FileUtil.writeToFile(mPrefs, getNonExportedServices(), FileType.PACKAGE, ""); FileUtil.writeToFile(mPrefs, getExportedBroadcastReceivers(), FileType.PACKAGE, ""); FileUtil.writeToFile(mPrefs, getNonExportedBroadcastReceivers(), FileType.PACKAGE, ""); FileUtil.writeToFile(mPrefs, getExportedContentProvider(), FileType.PACKAGE, ""); FileUtil.writeToFile(mPrefs, getNonExportedContentProvider(), FileType.PACKAGE, ""); FileUtil.writeToFile(mPrefs, getSharedLibraries(), FileType.PACKAGE, "");**/ } }