爱收集资源网

两个微信安装包怎么办?.apk为新版本6.7.3背景

网络整理 2022-03-27 21:59

设备要求

扎根的安卓手机。

注意:下面使用的两个微信安装包,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;

所以去hookgetPackageInfo方法,将返回的PackageInfo中的versionCode和versionName替换为新版本的值。

但是,从下图中可以看出,PackageManager 是一个抽象接口。

所以不能直接hook它的getPackageInfo方法,必须先获取getPackageManager返回的对象的真实类型,先随便创建一个项目,通过以下代码获取真实的PackageManager类型,

Log.v("test", getPackageManager().getClass().toString());

查看日志,可知真实类型为android.app.ApplicationPackageManager,

然后通过反编译最新版微信,得到versionCode和versionName,

最终的钩子代码如下:

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"))
                    {
                        PackageInfo packageInfo = (PackageInfo) param.getResult();
                        packageInfo.versionName = "6.7.3";
                        packageInfo.versionCode = 1360;
                    }
                }
            });
}

编译安装,重启,输入账号密码,祈祷,结果是版本太低。

,

试试 2、pm uninstall -k 命令

想到老版本可以正常使用,说明只要有登录数据,老版本就可以使用,于是想到先用新版本登录账号微信旧版本不能使用,然后使用pm卸载-k命令卸载应用程序但保留数据,然后安装旧版本。

先安装新版微信,

登录帐户微信旧版本不能使用

卸载后使用 pm uninstall -k com.tencent.mm 安装旧版微信,

结果还是不行,还是提示版本太低。

所以我怀疑是卸载的时候数据一起被删除了,根本没有保留。再次执行 pm uninstall -k com.tencent.mm 查看数据目录。微信目录已不存在。

试试 3、adb install -r 命令

也是先用新版本登录账号,然后用adb install -r命令强制安装,结果还是不行,不能安装低于当前版本的版本,,,

试试4、替换安装目录

由于使用 pm uninstall -k 卸载时不会保留数据,因此请尝试手动替换。

先安装低版本微信,复制安装目录,然后卸载。

然后安装新版微信,登录你的账号。

将新版本的安装目录替换为之前保存的旧版本安装目录,然后重启手机。

重启后提示登录错误,可以重新输入密码。

不知道为什么,我写这篇博文的时候,微信页面还是新版本的版本号,而我之前拿到的另一部手机是真正的旧版本号。

不过这款手机系统设置中的微信版本号已经变成了旧版本,不影响使用。

另一部手机,

自动化程序

我为之前的替换过程编写了一个自动替换程序。代码如下。其中使用的ShellUtils可以参考上一篇文章【安卓手机可以充电但插usb无法识别的解决方案】:

package com.example.wxreversion;

import android.os.Handler;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.text.method.ScrollingMovementMethod;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

import java.io.File;

public class MainActivity extends AppCompatActivity
{
Handler handler;
TextView textView;


private void LogV(String s)
{
Log.v("test", s);
}

private void textAppend(final String s)
{
LogV("textAppend:" + s);
handler.post(new Runnable()
{
@Override
public void run()
{
LogV("run:" + s);

textView.setText(textView.getText() + s);
}
});
}

private String getPath()
{
String path = null;
textAppend("-----------------------------\n");


if (!ShellUtils.checkRootPermission())
{
textAppend("获取root权限失败,请在设置中授予权限!\n");
return path;
}

path = ShellUtils.execCommand("pm path com.tencent.mm", true).successMsg;
if (path != null)
{
try
{
path = path.substring(path.indexOf('/'), path.lastIndexOf('/'));
} catch (Throwable throwable)
{
path = null;
}
}

if (path == null)
{
textAppend("未找到微信安装目录,请先安装!\n");
} else
{
textAppend("找到安装目录:" + path + "\n");
}

return path;
}

private boolean isEnpty(String string)
{
if (string == null || string.length() == 0)
{
return true;
}
return false;
}

private void putResult(ShellUtils.CommandResult result)
{
textAppend("返回码:" + result.result + "\n");

if (!isEnpty(result.successMsg))
{
textAppend(result.successMsg + "\n");
} else if (!isEnpty(result.errorMsg))
{
textAppend("错误消息:" + result.errorMsg + "\n");
}
}

@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
handler = new Handler();

textView = (TextView) findViewById(R.id.textView);
textView.setMovementMethod(ScrollingMovementMethod.getInstance());

((Button) findViewById(R.id.button1)).setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v)
{

new Thread()
{
@Override
public void run()
{
String path = getPath();
if (path == null)
{
return;
}
textAppend("正在保存安装目录!\n");
ShellUtils.CommandResult result = ShellUtils.execCommand("cp -af " + path + " /data/local/tmp/com.tencent.mm", true);
putResult(result);
if (!isEnpty(result.errorMsg))
{
return;
}

textAppend("正在卸载微信!\n");
result = ShellUtils.execCommand("pm uninstall com.tencent.mm", true);//-k无用
putResult(result);
if (!isEnpty(result.errorMsg))
{
return;
}

textAppend("请安装新版微信,并在登录成功后点击【覆盖安装文件并重启】按钮!\n");
}
}.start();

}
});


((Button) findViewById(R.id.button2)).setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v)
{

new Thread()
{
@Override
public void run()
{
String path = getPath();
if (path == null)
{
return;
}

textAppend("正在检查是否有备份的安装文件!\n");
if (!new File("/data/local/tmp/com.tencent.mm").exists())
{
textAppend("不存在备份的安装文件,请先安装低版本微信后点击【覆盖安装文件并重启】按钮!\n");
return;
}

textAppend("已有备份的安装文件,正在删除当前的安装目录!\n");
ShellUtils.CommandResult result = ShellUtils.execCommand("rm -rf " + path + "/*", true);
putResult(result);
if (!isEnpty(result.errorMsg))
{
return;
}


textAppend("正在覆盖安装目录!\n");
result = ShellUtils.execCommand("cp -af /data/local/tmp/com.tencent.mm/* " + path, true);
ShellUtils.execCommand("rm -rf /data/local/tmp/com.tencent.mm", true);
putResult(result);
if (!isEnpty(result.errorMsg))
{
return;
}

textAppend("系统将在10秒后重启!\n");


try
{
sleep(10 * 1000);
handler.post(new Runnable()
{
@Override
public void run()
{
ShellUtils.execCommand("reboot", true);
}
});
} catch (InterruptedException e)
{
e.printStackTrace();
}
}
}.start();

}
});

textView.append("-----------------------------\n");
textView.append("该应用需要root权限!\n");
if (ShellUtils.checkRootPermission())
{
textView.append("获取root权限成功!\n");
} else
{
textView.append("获取root权限失败,请在设置中授予权限!\n");
}


}
}

运行如下:

先安装旧版微信,

运行程序,点击左侧的【保存安装文件并卸载】按钮,

安装新版微信并登录,

点击右侧的【覆盖安装文件并重启】按钮,

重启后,再次输入密码登录。

完整代码 wxreversion.rar

安装包在release目录下

版本 替换 卸载