package me.ele.amigo.hook; import android.content.Context; import android.content.pm.ApplicationInfo; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.os.Bundle; import android.util.Log; import java.io.File; import java.lang.reflect.Method; import me.ele.amigo.Amigo; import me.ele.amigo.PatchApks; import me.ele.amigo.utils.CommonUtils; import static me.ele.amigo.Amigo.getWorkingPatchApkChecksum; public class IPackageManagerHookHandle extends BaseHookHandle { private static final String TAG = IPackageManagerHookHandle.class.getSimpleName(); private static Bundle metaData; public IPackageManagerHookHandle(Context context) { super(context); } @Override protected void init() { hookedMethodHandlers.put("getApplicationInfo", new getApplicationInfo(context)); hookedMethodHandlers.put("getPackageInfo", new getPackageInfo(context)); } private static class getApplicationInfo extends HookedMethodHandler { public getApplicationInfo(Context context) { super(context); } @Override protected void afterInvoke(Object receiver, Method method, Object[] args, Object invokeResult) throws Throwable { if (args == null || args.length == 0) { return; } if (!args[0].equals(context.getPackageName())) { return; } for (Object arg : args) { if ((arg.getClass() == int.class || arg.getClass() == Integer.class) && ((int) arg) == PackageManager.GET_META_DATA) { try { if (metaData == null) { String checksum = Amigo.getWorkingPatchApkChecksum(context); String workingPatchApk = PatchApks.getInstance(context).patchPath (checksum); metaData = context.getPackageManager().getPackageArchiveInfo (workingPatchApk, PackageManager.GET_META_DATA) .applicationInfo.metaData; if (metaData == null) { metaData = CommonUtils.getPackageArchiveInfo(workingPatchApk, PackageManager.GET_META_DATA).applicationInfo.metaData; } } ((ApplicationInfo) invokeResult).metaData = metaData; } catch (Exception e) { e.printStackTrace(); Log.e(TAG, "add metaData fails"); } } } super.afterInvoke(receiver, method, args, invokeResult); } } private class getPackageInfo extends HookedMethodHandler { private int patchVersionCode = 0; private String patchVersionName = "0.0.0"; public getPackageInfo(Context context) { super(context); } @Override protected void afterInvoke(Object receiver, Method method, Object[] args, Object invokeResult) throws Throwable { super.afterInvoke(receiver, method, args, invokeResult); PackageInfo result = (PackageInfo) invokeResult; if (result == null || !context.getPackageName().equals(result.packageName)) { return; } if ("0.0.0".equals(patchVersionName)) { String checksum = getWorkingPatchApkChecksum(context); File patchFile = PatchApks.getInstance(context).patchFile(checksum); PackageInfo workingPatchInfo = CommonUtils.getPackageInfo(context, patchFile, 0); patchVersionCode = workingPatchInfo.versionCode; patchVersionName = workingPatchInfo.versionName; } result.versionCode = patchVersionCode; result.versionName = patchVersionName; } } }