设备要求
已root的Android手机。
注:下面使用的两个微信安装包,com.tencent.mm.apk为旧版本6.5.16,weixin_new.apk为新版本6.7.3
背景
最近在弄一些关于微信的东西,测试过程中,本来打算强行停止后重新启动微信,结果手残点到卸载了。当我重新安装后出现了尴尬的情况,登录的时候,提示微信版本过低,需要安装最新版才能登录。
但是之前做的一些东西都是基于老版本的微信,所以不能安装新版本,必须想办法在老版本登录才行。
操作过程
尝试1、替换版本号
最开始的想法是,既然要验证版本,那我就把旧版本的伪装一下,让它变成新版本的试试。
但是,因为没有时间去仔细分析微信是怎么验证的,于是就抱着侥幸心理,写了个xposed模块替换版本号,
一般情况下是通过以下代码获取版本号的:
PackageInfo packageInfo = getPackageManager().getPackageInfo("com.tencent.mm",0); int versionCode = packageInfo.versionCode; String versionName = packageInfo.versionName;
所以去hook getPackageInfo方法,将其返回的PackageInfo中的versionCode和versionName替换成新版本的值就行,
但是,由下图可知PackageManager是一个抽象接口,
所以不能直接hook它的getPackageInfo方法,要先获取getPackageManager返回的对象的真实类型,先随便创建一个工程,通过以下代码获取真实的PackageManager类型,
Log.v("test", getPackageManager().getClass().toString());
查看日志,可知真实类型为android.app.ApplicationPackageManager,
然后通过反编译最新版本的微信,获得versionCode和versionName,
最后的hook代码如下:
if (loadPackageParam.packageName.equals("com.tencent.mm")) { XposedHelpers.findAndHookMethod( "android.app.ApplicationPackageManager", loadPackageParam.classLoader, "getPackageInfo", String.class, int.class, new XC_MethodHook() { @Override protected void afterHookedMethod(MethodHookParam param) throws Throwable { if (param.args[0].equals("com.tencent.mm"