下沙论坛

 找回密码
 注册论坛(EC通行证)

QQ登录

QQ登录

下沙大学生网QQ群8(千人群)
群号:6490324 ,验证:下沙大学生网。
用手机发布本地信息严禁群发,各种宣传贴请发表在下沙信息版块有问必答,欢迎提问 提升会员等级,助你宣传
新会员必读 大学生的论坛下沙新生必读下沙币获得方法及使用
查看: 19584|回复: 0
打印 上一主题 下一主题

微信降版本登录(微信怎么登录低版本)

[复制链接]
  • TA的每日心情
    擦汗
    3 天前
  • 签到天数: 2402 天

    [LV.Master]伴坛终老

    跳转到指定楼层
    1
    发表于 2019-12-17 09:43:25 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
    设备要求
      已root的Android手机。
      注:下面使用的两个微信安装包,com.tencent.mm.apk为旧版本6.5.16,weixin_new.apk为新版本6.7.3
    背景
      最近在弄一些关于微信的东西,测试过程中,本来打算强行停止后重新启动微信,结果手残点到卸载了。当我重新安装后出现了尴尬的情况,登录的时候,提示微信版本过低,需要安装最新版才能登录。
      
    ! n  f6 }1 T* X# @& B
      但是之前做的一些东西都是基于老版本的微信,所以不能安装新版本,必须想办法在老版本登录才行。

    ( \( R9 \6 j' J8 L' H0 w0 A  @操作过程尝试1、替换版本号
      最开始的想法是,既然要验证版本,那我就把旧版本的伪装一下,让它变成新版本的试试。
      但是,因为没有时间去仔细分析微信是怎么验证的,于是就抱着侥幸心理,写了个xposed模块替换版本号,
      一般情况下是通过以下代码获取版本号的:
    PackageInfo packageInfo = getPackageManager().getPackageInfo("com.tencent.mm",0);int versionCode = packageInfo.versionCode;String versionName = packageInfo.versionName;
    8 N2 v2 S5 N1 F  i" U, n1 Q
      所以去hook getPackageInfo方法,将其返回的PackageInfo中的versionCode和versionName替换成新版本的值就行,
      但是,由下图可知PackageManager是一个抽象接口,
      所以不能直接hook它的getPackageInfo方法,要先获取getPackageManager返回的对象的真实类型,先随便创建一个工程,通过以下代码获取真实的PackageManager类型,
    Log.v("test", getPackageManager().getClass().toString());
    2 m; |8 y7 M5 I
    8 E3 j  l' n8 D, |查看日志,可知真实类型为android.app.ApplicationPackageManager,
      然后通过反编译最新版本的微信,获得versionCode和versionName,
      最后的hook代码如下:
    [url=][/url]
    * O2 _5 i3 K6 mif (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;                    }                }            });}[url=][/url]
    3 ^3 s. P! [+ c/ D6 T) g9 R7 Z
    ( }% ?7 y3 O3 w* S8 b
    5 S- [# B& w  D8 \7 g6 t
      编译安装后重启,一边输入帐号密码,一边祈祷,结果还是提示版本过低,
    ( Q, I" \! |& j# M8 p
    尝试2、pm uninstall -k 命令
      想着之前旧版本的都能正常使用,说明只要有登录数据,就可以使用旧版本的,所以想着先用新版本的把帐号登录,然后使用 pm uninstall -k 命令,卸载应用但保留数据,然后安装旧版本的。
      先安装一个新版本的微信,
      登录帐号,

    3 o7 W( Y& q; d! W. ]0 R8 \; g9 D
      使用pm uninstall -k com.tencent.mm卸载后安装旧版本的微信,
      结果打开还是不行,还是提示版本过低,
    & G# Q" N' W5 W
      于是怀疑卸载的时候数据被一起删了,根本就没有保留,再次执行pm uninstall -k com.tencent.mm,查看data目录,微信的目录已经不存在了。
    尝试3、adb install -r 命令
      同样先用新版本的把帐号登录,然后使用 adb install -r 命令强制安装,结果还是不行,不能安装比当前版本低的,,,
    8 u. E, s0 ?$ ^
    尝试4、替换安装目录
      既然用 pm uninstall -k 卸载时保留数据不行,那么就尝试手动替换。
      首先安装低版本的微信,把安装目录复制一份,然后卸载。
      再安装新版本的微信,并登录帐号。
      用之前保存的旧版本安装目录替换新版本的安装目录,然后重启手机。
      重启后提示登录错误,重新输入密码即可,
      不知道为什么,这个手机在我写这篇博文的时候,关于微信的页面还是新版本的版本号,而我之前弄的另一个手机就是真实的旧版本号,
      但是这个手机系统设置中微信的版本号已经变成旧版本的了,也不影响使用。
      另一个手机的,
    " L; h+ v2 E+ k  h
    自动化程序
      把之前替换的过程写了个自动替换的程序,代码如下,其中使用的ShellUtils在之前的一篇【Android手机插上usb能充电但不能识别的一种解决方法】能找到:
    [url=][/url]
    ( H+ K8 M% z/ y& ?package com.example.wxreversion;
    $ |% g9 n% C) B) U3 N7 U6 B! U; P- [& U, |- W
    import android.os.Handler;& O8 U: t6 M2 ?, n: g
    import android.support.v7.app.AppCompatActivity;
    . ^1 \: d4 X( w+ ^* X; I+ Yimport android.os.Bundle;
    ( J; w4 r# d1 |import android.text.method.ScrollingMovementMethod;
    0 M9 [& L: b* F  \: a* {( dimport android.util.Log;( ~5 @, M- C- l& r
    import android.view.View;) y8 C. s% g$ P5 W) L5 g) k6 }
    import android.widget.Button;
    ( ]0 V8 l: ~0 @  l" limport android.widget.TextView;
    & w3 {# u2 ], Z8 |' c( B/ H! W+ W, \+ w! E( S& k  S! P
    import java.io.File;, O5 O% ]# D* X* U$ n/ z, @

    $ p" i# f9 N* F: G! `public class MainActivity extends AppCompatActivity
    , D: I, u3 Z1 Y{
    8 g( N6 k4 s+ G2 f6 x+ W# T    Handler handler;
      d' \2 a9 Y) S" P% K( k# H# c    TextView textView;
    ( b6 Z6 [- C: W% r: b: h4 d/ N! w- b9 i4 b. c0 d
    6 d5 n. Y% m) U1 A2 i. [
        private void LogV(String s)1 Q. g; a. K: j: h% c& T& \
        {
    , m8 W4 @3 R& f; @) g; z        Log.v("test", s);
    4 `, r2 T& I0 g* J    }3 r( y4 e1 U; \/ x9 _0 ~7 i) l* N
    6 J% p( ?4 i4 H( {0 I- n
        private void textAppend(final String s)
    ; b$ O/ H0 k/ S2 W/ Y    {- a+ Z# V5 c; b, ]: C
            LogV("textAppend:" + s);
    ; D2 A+ \, r1 ^# Z! ]* U        handler.post(new Runnable()5 O2 H: h9 A/ f0 n
            {
      D  E( \' P& q/ e            @Override# D- \* X3 L. }9 j9 F- L1 M' ~
                public void run()/ L) a( L) ~1 G! h) m, v
                {
    . E/ ~4 w: j% r& C- Z; |" w4 H) v                LogV("run:" + s);
    : I! V! B" _: r7 d) k! Z- G: x( \+ {' @$ {
                    textView.setText(textView.getText() + s);3 e, l+ b. }; q+ w: l
                }: @* p$ }: X" U. R& j
            });8 b3 V8 }4 }) r9 |0 n7 o
        }  t! R. Z9 u0 @$ {% W8 H
    $ T9 Y; R5 @+ |+ v
        private String getPath()
    . P2 a+ ^$ r* x5 ~    {- q6 V# d: U) X
            String path = null;% ~( I% N! y! D/ ]0 h7 j4 w
            textAppend("-----------------------------\n");
    % `3 M* v6 ~' c" Y9 s: m- T
    / v& B- j5 D( t# i' a; S6 _. K! u8 ?; Y; i# k, a
            if (!ShellUtils.checkRootPermission()); g  S/ S( R* J1 Z) m
            {% X+ k3 X4 r. B  M! H# [/ {) N. h
                textAppend("获取root权限失败,请在设置中授予权限!\n");
    6 q6 T/ t0 ]3 L/ A1 ]/ c3 `) w            return path;# _  H) l$ C' g
            }
    : n6 y* \# {& p4 _
    % {1 U% t  f$ h! _; h        path = ShellUtils.execCommand("pm path com.tencent.mm", true).successMsg;& z9 l7 k3 L( _* J7 i
            if (path != null)9 l- l9 v% E5 F! o  A( j' j
            {
    % r+ b$ v: S- w8 Y" [- {3 q            try/ q$ F. I1 F0 X* S7 M9 [
                {% \1 d% K2 J2 u  e3 z- r, m. G1 S" f
                    path = path.substring(path.indexOf('/'), path.lastIndexOf('/'));/ b% y* j% i3 O9 X. v
                } catch (Throwable throwable)
    ' {( U- c6 V! I' N            {. d' d/ n* j. B3 a4 d- T7 _! u8 V
                    path = null;
    2 j/ W- Y! X6 ?6 A# w! y. p            }
    7 S: K1 v, p' @* J) ^$ W' v        }
    $ ?  b; s" @9 d# L
    # f$ ~9 n5 s9 v  ?$ j        if (path == null)
    4 E$ j$ I6 B- H! y        {
    / N' g6 I+ G* k( z3 L            textAppend("未找到微信安装目录,请先安装!\n");
    ) B7 c* y( O) {$ {0 C        } else% o' @" l. q  y* t: r
            {0 x, \" \! B0 r) ?2 ]* C
                textAppend("找到安装目录:" + path + "\n");
    5 Z. X: Z, l! d2 H' W0 |        }
    6 C# A5 Y' s5 w) `  K' M2 V2 E' P7 l4 I: H- c2 `- a
            return path;
    - V  W2 h2 h( \) z( E0 U    }! B3 Z! q9 x! G# l- U' E- L
    $ e. U3 V5 |, H% q; r- p& `
        private boolean isEnpty(String string)
    - Y+ j1 `* C1 x% \% m( ^) Y    {
    / l. e+ v* G9 C) A! H  q        if (string == null || string.length() == 0)
    ) Y" |! a. H. D/ [        {
    + B3 b3 A- L/ N! R# j9 I            return true;4 Z1 W: ^+ K9 h  X
            }+ h( f& D( A$ o3 o
            return false;$ e: o0 G  s5 j/ x8 ~3 K
        }
    0 ?9 W+ |+ O4 G+ O& W" d/ @% ?! x9 c7 a0 X, Y* i' T4 b2 E
        private void putResult(ShellUtils.CommandResult result)
    / D$ d! p9 a2 o# o$ f, @5 u    {6 ]* n* M) M" X, \
            textAppend("返回码:" + result.result + "\n");
    & @8 L& \6 |" r! q( S
    9 j$ ]0 K7 K  J  [4 x5 X        if (!isEnpty(result.successMsg))6 f7 L7 w. R0 B, i
            {
    ! D* v. a0 ^' s7 n            textAppend(result.successMsg + "\n");$ ]- M( ~% }& f! p& N
            } else if (!isEnpty(result.errorMsg))" K+ Q1 b. F  x# ~! }3 v% M% i' }7 X
            {6 ], ^* o: R3 A$ C
                textAppend("错误消息:" + result.errorMsg + "\n");
    0 z' p8 b4 ?5 Y. v! T        }- f3 J/ t4 g- H* K4 X) v
        }
    ) ?. z+ f1 F9 o4 D  A4 U: ], N+ T; P3 o3 s$ ~$ l2 p
        @Override6 l) M/ y: \2 x- Z. U" n5 }
        protected void onCreate(Bundle savedInstanceState)3 Q+ V0 N% r  D; @! n; z' v
        {
    7 O  p8 q: @( _$ Z        super.onCreate(savedInstanceState);; X7 ?% ^% `3 H9 b
            setContentView(R.layout.activity_main);4 w3 k4 e: x6 W
            handler = new Handler();
    1 R8 V  Q- ~5 v4 t; Q# x$ A# C5 J* R# p
            textView = (TextView) findViewById(R.id.textView);
    & |/ M8 d' _7 R& m; K! i        textView.setMovementMethod(ScrollingMovementMethod.getInstance());
    , S7 N! c9 b2 G7 x% X
    ; d$ [- Q% o1 ^' K! {" @/ a        ((Button) findViewById(R.id.button1)).setOnClickListener(new View.OnClickListener()
    ) P  l7 S+ l+ s9 |& V1 ]        {9 i( S( D  i* P; c2 q# _
                @Override
    4 h& \9 g/ F- b; w8 w            public void onClick(View v)4 J( h0 a6 ]" X1 q! m" G' |. R
                {/ T  |& `' @* T8 \* `

    ; `( }7 R5 L# S                new Thread()6 ~8 g( c6 y6 `) q) w
                    {& e# c* T1 ]' V8 ^. `, c3 f0 I
                        @Override
    , ?  ?" a+ V$ P                    public void run(). W2 e9 b& W' Q* d! f
                        {
    " A5 l2 w9 \  I4 P: M+ T$ H                        String path = getPath();7 T" a. ~* \. f
                            if (path == null)" g* ]2 b7 p: H6 K: Z; n" D, |- x* ^
                            {
    6 t4 `8 d0 A; N# n& R                            return;/ {. r4 u' [. z5 p
                            }7 L  p$ @& r- x4 g
                            textAppend("正在保存安装目录!\n");' e8 I/ b' ?0 [' B7 J, |, w
                            ShellUtils.CommandResult result = ShellUtils.execCommand("cp -af " + path + " /data/local/tmp/com.tencent.mm", true);
    3 z: [# K$ e2 p. x3 `' r' R                        putResult(result);; n' B# J& G5 q5 E
                            if (!isEnpty(result.errorMsg))
    * A, P/ O# w% i5 M                        {2 ?, }% f! x  T3 f
                                return;
    / B  c; i7 Z/ R$ v/ Y* ]7 \                        }, q; y! m1 @, e3 d4 D" r

    ( I. Y9 }2 d+ X+ l$ M                        textAppend("正在卸载微信!\n");. I* S5 u. @( h% Y, }0 E
                            result = ShellUtils.execCommand("pm uninstall com.tencent.mm", true);//-k无用
    ) G6 y0 k$ v+ |9 c& {                        putResult(result);: s+ V: `* l6 o
                            if (!isEnpty(result.errorMsg))9 B( L7 g4 J+ }& `, D. O7 k
                            {, M$ h$ k' p+ D3 d  k( r8 Z3 `
                                return;( }3 E4 {9 j+ f2 O7 q1 `/ p
                            }8 l. ~- r# ?$ y3 ~$ y4 v* Q
    - H) e  D9 @) @. _! |' _& Z6 J
                            textAppend("请安装新版微信,并在登录成功后点击【覆盖安装文件并重启】按钮!\n");1 z$ L- a$ Q3 o: m; V( o8 C
                        }/ N( n& t9 `6 t  i4 [
                    }.start();
    1 C* v" v: e6 g4 h, W0 y8 f7 g6 ~/ i8 f, P7 E1 T0 @
                }
      {. }2 {' W2 D! r9 |6 x8 D        });; T: L# h  g. m0 J0 `& [
    7 A9 V2 `- J. H  n9 R$ G+ g3 ?% @, C! ]
    + Q8 M: b8 Y. U. Z' h$ q1 b
            ((Button) findViewById(R.id.button2)).setOnClickListener(new View.OnClickListener()
    % F8 n1 Z- q; {$ X- d& w        {
    0 r+ T0 v% N! Y% ]8 o5 g            @Override# w  N( a( q+ [* @/ V! M
                public void onClick(View v)$ c- ]4 S% C  n; w8 S; i) L/ `3 D
                {8 Q1 g& @8 t. G) S% }- ]
    , q( s5 w; ~/ G5 ~
                    new Thread()1 _/ d  D/ ~. J
                    {
    $ Y3 |  q- R2 D. H                    @Override  w$ T  s; X& x, J  U+ |- x5 E
                        public void run()# b: M: _5 d! I9 u2 m
                        {
    7 ?8 r3 @$ t8 c2 O+ m- A                        String path = getPath();
    ' `# J2 A/ M8 k" e, y                        if (path == null)
    5 Y0 w4 Q  l+ H' D9 Y                        {# M% @, ?& r0 p9 @3 x# c
                                return;2 `) q7 S+ t( x- i$ z2 }6 B
                            }
    ) i5 U/ X* V8 g5 @; S  v7 U( g! [3 ?8 N. p
                            textAppend("正在检查是否有备份的安装文件!\n");
    : s8 Y7 @9 Y7 K                        if (!new File("/data/local/tmp/com.tencent.mm").exists())
    6 c  s  |8 X! F& D& m                        {
    . E) q' L- D0 l+ L9 ]7 _                            textAppend("不存在备份的安装文件,请先安装低版本微信后点击【覆盖安装文件并重启】按钮!\n");" O+ @: ^. L, _$ t6 ^, T/ G1 T5 j2 W
                                return;
    : z4 T, d# h$ \$ u  |9 ?/ q                        }
      @9 e% E, o# j% d- @  ~8 `$ m; Y% i* S6 i
                            textAppend("已有备份的安装文件,正在删除当前的安装目录!\n");- R/ |' _0 n- N8 x+ q
                            ShellUtils.CommandResult result = ShellUtils.execCommand("rm -rf " + path + "/*", true);
    + {0 ]% }5 d; Y; w                        putResult(result);9 E  r' d5 ~7 s) ~. I- f' J/ _
                            if (!isEnpty(result.errorMsg))  B1 e2 D  ?2 b7 q2 i& Z
                            {1 ^; Q0 a0 u" F8 {2 S
                                return;
    1 {3 r. z* ^" i+ O3 P                        }, g! F6 o/ Q1 [- X! m$ ~: h

      s6 z. ?) D) d  ^9 ^6 h" K! d
    0 r+ ~# h) H8 R8 N% f! U                        textAppend("正在覆盖安装目录!\n");1 i- @- v2 o8 g; C. l6 B
                            result = ShellUtils.execCommand("cp -af /data/local/tmp/com.tencent.mm/* " + path, true);& [/ H+ p! g: y  X- p) G: N0 P3 x
                            ShellUtils.execCommand("rm -rf /data/local/tmp/com.tencent.mm", true);
    : K4 M& r8 p; P                        putResult(result);9 o9 K3 a- Q# ~6 I8 n
                            if (!isEnpty(result.errorMsg))7 O' s& R: N" V+ \- Q
                            {
    / [' B2 W5 q9 D+ k/ Z( b                            return;/ h5 h1 t/ x) k& ]8 C
                            }
    7 G* [. W: ~0 G( [" ~  e* r# F% o4 D( e* x
                            textAppend("系统将在10秒后重启!\n");
    6 x0 S0 g. n/ C, l0 n! d# G; {
    1 u0 d2 K' t0 q( n, e) Q
    - Z9 E5 f8 G# L) B                        try9 v7 _1 i# T' A2 M2 G" ]
                            {
    . b# a3 ^! G8 L9 g2 V' K                            sleep(10 * 1000);
    ' l2 [7 f2 t9 i3 u+ p# x                            handler.post(new Runnable()6 r$ b2 m: H% g2 h# j
                                {6 j6 E1 l2 {, V' l
                                    @Override% B! Z9 ^. ~$ e4 p8 }# B
                                    public void run()' K9 O, F3 g) f# U( `' N: b- f
                                    {) t" _- \! U9 f- c) k) g: q
                                        ShellUtils.execCommand("reboot", true);
    7 T# Z$ y7 N# m+ a/ d( A1 W                                }
    & |3 h; ]1 ^# t. L                            });9 ]+ ~! m( @8 W1 Z' U& v
                            } catch (InterruptedException e)/ }6 m& b; m( n# N1 d0 K
                            {
    ; b' M) O( D( f# \                            e.printStackTrace();. d5 M6 b( o$ i  T5 Y* k% a
                            }# ?* d3 {! z% A% n1 ?
                        }: M. r$ b; P" X' s# v
                    }.start();- W4 C' w' M9 B' ]/ n; W4 `4 D

    6 D# q8 U# u' I  z7 o: d) F$ y            }
    - H' n9 v- U' t        });
    + G9 h% ~' m7 m: q% v9 F0 i1 ^3 U; g/ U2 V  k6 u( F
            textView.append("-----------------------------\n");
    4 c" p5 G; C/ t* U' w. Y% ~        textView.append("该应用需要root权限!\n");
    5 r' f) j% S$ |3 i' f; m( V( G        if (ShellUtils.checkRootPermission())* w  o/ S) O" D3 v1 u( c' ~5 v
            {
    " S( ~4 t; Q' D  L% G  F$ @. h            textView.append("获取root权限成功!\n");/ f' R; r, J: _8 r( B
            } else
    : a1 y1 q' T/ `! C        {
    - v) A7 S# P, N) Q% H            textView.append("获取root权限失败,请在设置中授予权限!\n");2 ^! |; [) a7 ?' P# Q
            }
      n4 [5 p4 o  @
    ) z3 N$ S0 Z1 `/ _7 D1 c( w' s9 O9 f3 m. \- Y. |8 i$ g
        }
    ) A2 _+ N- M; d' h! V# X}[url=][/url]
    0 x% D: F2 w& C2 ?) [6 k7 c3 }/ t
    ; V( _/ ?2 c, ^. ^7 C/ G' K$ q

    ; s0 A- I! w7 d+ l& T& {
    运行如下:
    先安装旧版本微信,
    运行该程序,点击左边的【保存安装文件并卸载】按钮,
      安装新版本微信并登录,
      点击右边的【覆盖安装文件并重启】按钮,
      重启后重新输密码登录即可。
    4 ^4 ~" C/ t& Y9 s( b
    完整代码 wxreversion.rar
    安装包在release目录中
    9 q8 H$ i6 d8 \% b& T, Q3 ^
    分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
    收藏收藏 分享分享 顶 踩

    本版积分规则

    关闭

    下沙大学生网推荐上一条 /1 下一条

    快速回复 返回顶部 返回列表