下沙论坛

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

QQ登录

QQ登录

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

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

[复制链接]
  • TA的每日心情
    奋斗
    前天 09:20
  • 签到天数: 2383 天

    [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' K$ i; u2 d! L2 V
      但是之前做的一些东西都是基于老版本的微信,所以不能安装新版本,必须想办法在老版本登录才行。
    * ?. h2 l4 B& x% I- a
    操作过程尝试1、替换版本号
      最开始的想法是,既然要验证版本,那我就把旧版本的伪装一下,让它变成新版本的试试。
      但是,因为没有时间去仔细分析微信是怎么验证的,于是就抱着侥幸心理,写了个xposed模块替换版本号,
      一般情况下是通过以下代码获取版本号的:
    PackageInfo packageInfo = getPackageManager().getPackageInfo("com.tencent.mm",0);int versionCode = packageInfo.versionCode;String versionName = packageInfo.versionName;8 u$ K( p! a# B: |3 b$ |
      所以去hook getPackageInfo方法,将其返回的PackageInfo中的versionCode和versionName替换成新版本的值就行,
      但是,由下图可知PackageManager是一个抽象接口,
      所以不能直接hook它的getPackageInfo方法,要先获取getPackageManager返回的对象的真实类型,先随便创建一个工程,通过以下代码获取真实的PackageManager类型,
    Log.v("test", getPackageManager().getClass().toString());, m) v% h" q9 m1 A2 N

    1 N+ ~1 z$ \6 x查看日志,可知真实类型为android.app.ApplicationPackageManager,
      然后通过反编译最新版本的微信,获得versionCode和versionName,
      最后的hook代码如下:
    [url=][/url]& d' v7 ^  @% Q4 V' u2 X8 U
    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;                    }                }            });}[url=][/url]
    " P( b+ C6 L' o! D& k

    7 o* C# i4 ~# @7 {
    $ E) g" a1 Q: `1 N
      编译安装后重启,一边输入帐号密码,一边祈祷,结果还是提示版本过低,

    ' E* ^2 C0 j" P尝试2、pm uninstall -k 命令
      想着之前旧版本的都能正常使用,说明只要有登录数据,就可以使用旧版本的,所以想着先用新版本的把帐号登录,然后使用 pm uninstall -k 命令,卸载应用但保留数据,然后安装旧版本的。
      先安装一个新版本的微信,
      登录帐号,

    2 B- [% V1 [% w5 B" U4 B/ [
      使用pm uninstall -k com.tencent.mm卸载后安装旧版本的微信,
      结果打开还是不行,还是提示版本过低,
    1 O# k6 z. _6 T" K5 N7 i! ]
      于是怀疑卸载的时候数据被一起删了,根本就没有保留,再次执行pm uninstall -k com.tencent.mm,查看data目录,微信的目录已经不存在了。
    尝试3、adb install -r 命令
      同样先用新版本的把帐号登录,然后使用 adb install -r 命令强制安装,结果还是不行,不能安装比当前版本低的,,,

    ' r+ U! c" x# F4 f$ U3 X尝试4、替换安装目录
      既然用 pm uninstall -k 卸载时保留数据不行,那么就尝试手动替换。
      首先安装低版本的微信,把安装目录复制一份,然后卸载。
      再安装新版本的微信,并登录帐号。
      用之前保存的旧版本安装目录替换新版本的安装目录,然后重启手机。
      重启后提示登录错误,重新输入密码即可,
      不知道为什么,这个手机在我写这篇博文的时候,关于微信的页面还是新版本的版本号,而我之前弄的另一个手机就是真实的旧版本号,
      但是这个手机系统设置中微信的版本号已经变成旧版本的了,也不影响使用。
      另一个手机的,
    5 `" O3 E7 l2 ?8 {7 q6 b4 {
    自动化程序
      把之前替换的过程写了个自动替换的程序,代码如下,其中使用的ShellUtils在之前的一篇【Android手机插上usb能充电但不能识别的一种解决方法】能找到:
    [url=][/url]! v' {" {, \, ?8 M$ t1 a2 m2 d/ k
    package com.example.wxreversion;" N+ p/ m8 R9 F; a, r9 Q3 c
    : F# n  d# w/ \
    import android.os.Handler;" l0 H+ X# K& Z
    import android.support.v7.app.AppCompatActivity;9 j. v0 A, r9 V! m( o
    import android.os.Bundle;( B2 l% S% R. Y2 O: K
    import android.text.method.ScrollingMovementMethod;* k2 ^- ?" j' e
    import android.util.Log;
    2 _7 T$ o' g0 A( zimport android.view.View;
    ) v, L, J- O# x) P/ Fimport android.widget.Button;
    - b  @; b( G7 s. G, {# n& o$ oimport android.widget.TextView;2 C9 T) z5 L" }  L( E

    $ F9 p1 D* w* _4 A% Pimport java.io.File;0 F$ }* M5 T; v! S' f4 d

    / F5 }7 _! L1 L5 ppublic class MainActivity extends AppCompatActivity
    ' k7 T9 q' h3 f7 K& Y/ a{
    , o% S* x/ z  g% C2 e$ `7 a3 o9 H7 h7 ]    Handler handler;
    : ?* N8 r' e1 l    TextView textView;  {" |0 U' U' R7 p( B

    0 g& Q( L5 e$ h5 ~- \0 b9 r1 y, b( w/ i3 z' {& o3 h
        private void LogV(String s)
    6 c! P: X' \3 G    {9 d8 U- m. S( Q' ~
            Log.v("test", s);
    . c2 o) m/ P6 f  S    }4 X- Z" B5 X3 @% R6 B
    - `+ \( ^. R% m9 i% ?" o
        private void textAppend(final String s)
      @( R! E" ]" F" b( ^, f# G6 {    {
    9 z$ F, N: r1 k% G# r        LogV("textAppend:" + s);
    / K3 l% `  y* s: n        handler.post(new Runnable()9 h2 u8 o6 S7 H; r1 }
            {4 H; g0 l0 Q6 A1 r' _
                @Override% Z; c" _$ I7 T% w
                public void run()
    0 s/ T0 V5 @1 g- e, z& T* I% Z            {
    1 ]) O9 ]8 w* c% F+ N( J                LogV("run:" + s);
    ! h# V6 g( F! C! t: Y/ K  q- I% B1 @2 ?* h2 `
                    textView.setText(textView.getText() + s);
    ; i6 N0 ]0 Q6 P' i7 E! ?1 H            }+ B6 M% x) v8 O( h- I  F
            });
    ! [- |0 G2 D; m6 R% j    }0 K! b' |9 x5 c$ v

    / N/ a7 O3 F' V& T    private String getPath()8 H* H2 A! J$ Q) m5 P
        {7 o: V# n; R2 d/ A& H
            String path = null;
    ! D& _) T6 I) U7 l4 A        textAppend("-----------------------------\n");
    2 T  Y, q7 G" @$ N
    # q, G& `% @) p2 {2 ~/ S
    ) z/ M7 s- Z! ~& Z7 F        if (!ShellUtils.checkRootPermission())
    ; a4 ]+ z% U. Y& U2 o* p) u& T        {
    ; Y7 H3 ~' [; M            textAppend("获取root权限失败,请在设置中授予权限!\n");& {5 A9 P" V" H. ?
                return path;( O4 X$ R4 G& l% x* O( q& J7 T, ^- i- s
            }
    1 Z, `+ x4 Q5 e% ^7 w  \
    + o+ K8 Z, R7 m5 S1 B; t8 e& t" ?        path = ShellUtils.execCommand("pm path com.tencent.mm", true).successMsg;$ K( Z1 I# O, i
            if (path != null)
    5 v. Z6 l* Z: j- v; Z0 [; K        {5 ~5 t' _& F5 x6 d
                try
    + d/ O7 Y5 f  W4 A5 Y$ c            {9 v+ ^1 o3 @2 s: T3 I; o
                    path = path.substring(path.indexOf('/'), path.lastIndexOf('/'));8 j( j) t5 b! y" f+ v; c8 P
                } catch (Throwable throwable)
    . j. Q, [2 E0 R2 [$ ]            {- n+ E; q9 H) v" z9 a
                    path = null;) P: g0 W! Y3 T" k
                }
    6 I0 Y- n5 m( p1 s" y" x        }
    ) `3 T) }4 P. x' _% `' Z4 a, C$ ?: W  B; O8 a6 E! }/ e' K6 k
            if (path == null)
    8 F; a" E8 V% B$ {: h+ q2 Y$ d1 Z        {4 t- ~0 i9 \3 s1 \
                textAppend("未找到微信安装目录,请先安装!\n");
    3 b  K$ s3 v: [% W5 S        } else8 x1 Y$ Y% U) B, b5 p0 h
            {
    & u% B( k0 Q: y            textAppend("找到安装目录:" + path + "\n");: G  v' I/ z. t
            }
    * o1 R7 f2 }* H6 g/ t9 ?5 Z8 p) Z2 ?  k' O; J4 S  M* J: y3 |, m
            return path;
    % X! \2 e" T- x' {    }
    8 ]2 Z* K9 T5 a$ b! n( C4 x
    ' \- j% Q. @! `0 q* y  m    private boolean isEnpty(String string)6 W0 k/ ]2 d/ a6 V
        {! `/ x9 Y: ^* ]: X2 V  w0 U4 U
            if (string == null || string.length() == 0), S7 n' ^" w" Q! T& q4 C
            {
    ( Y! R% i( H1 s* x& C1 _            return true;$ l# {8 T7 s4 T( O7 v4 z
            }+ }- i4 Y3 u1 A0 f4 n
            return false;
    ( E. c+ t) d, n" H    }) `. j0 [' t7 L5 x
    , x9 b* b( Y8 H5 M
        private void putResult(ShellUtils.CommandResult result)
    $ ~) O! v7 _7 n1 D, g) X    {
    ) h1 \1 ~! y- [; m        textAppend("返回码:" + result.result + "\n");9 X  t: a) E) z2 W7 ]
    4 G0 w+ q$ u% [' d! j, i
            if (!isEnpty(result.successMsg))/ s2 x) w: I2 w
            {
    $ o5 j, L9 K6 [( T0 I" m            textAppend(result.successMsg + "\n");1 `0 k( t- d- ^
            } else if (!isEnpty(result.errorMsg))
    / b/ P6 X0 K8 o) @        {
    . {5 j" E3 w+ e            textAppend("错误消息:" + result.errorMsg + "\n");% H1 d% |! e  V- w, B
            }3 n0 R0 `% o, B  x$ i
        }' Q% C! W4 J" k9 {; }2 V5 M8 A
    3 \' S% b4 A2 d( v+ a+ A0 l
        @Override- ^2 l# V2 e' q- X8 t
        protected void onCreate(Bundle savedInstanceState)& {' L9 ~; Z& m1 K8 j$ F
        {
    ' d+ }. S' T2 z& Q        super.onCreate(savedInstanceState);
    4 Y+ r5 E) g2 y        setContentView(R.layout.activity_main);
    1 ]& D8 p2 q) g: s3 |        handler = new Handler();8 _' M" W# \7 |! I% i7 Z$ d: P

    ' U% K; p7 O1 b: ]5 e8 J        textView = (TextView) findViewById(R.id.textView);) \9 c  n% j& e  t" n
            textView.setMovementMethod(ScrollingMovementMethod.getInstance());
    , D0 g9 R$ Z# S' v
    $ P' c! Z8 U3 c! L% ^  h        ((Button) findViewById(R.id.button1)).setOnClickListener(new View.OnClickListener()
    2 k5 U# C: E. Q2 M/ A- n4 h; d! W        {
    ; P1 y% d" e/ x/ H; Y7 z( G            @Override! h9 ^7 c2 f' T  ]! n4 s
                public void onClick(View v)3 `6 C+ c' R( O# E
                {
    ) j; Y5 X* s, y. K8 H, K" v* I4 P7 |
                    new Thread()2 ?  H- [( Q2 }* S
                    {
    4 I( q. Y, A2 T7 J; k% V                    @Override
    7 k) B1 K1 c1 O" _# S1 r1 B                    public void run()8 _2 i$ }9 [9 M
                        {8 w# i9 Y8 y5 F& Z# p
                            String path = getPath();
    8 u5 Z! M8 k, R                        if (path == null)1 }2 X9 E" C, c
                            {9 t* R3 A* F' ]3 N! ~
                                return;- }% q8 c- ^& `3 \- e$ c/ a" w
                            }) Z7 |: \' P3 W6 l$ P
                            textAppend("正在保存安装目录!\n");
    3 E$ ~3 y+ `( n" b                        ShellUtils.CommandResult result = ShellUtils.execCommand("cp -af " + path + " /data/local/tmp/com.tencent.mm", true);
    ; ^4 w- ]; `. e2 Z6 b                        putResult(result);
    + s* O: \2 T% F, J% m) @                        if (!isEnpty(result.errorMsg))7 c# p5 @3 N+ a# r0 ?4 z# F
                            {
    " y+ {, A* w  d9 W3 H                            return;# S; {) ^- }# p0 F+ h8 l
                            }
    ' g4 h" t# R7 H; O- z4 U
    % }0 N- u. v: B                        textAppend("正在卸载微信!\n");+ @' E3 G" `, |0 m6 T+ r% t4 U& f. c3 y
                            result = ShellUtils.execCommand("pm uninstall com.tencent.mm", true);//-k无用
    5 L- X9 n, H/ n* s+ G- w% }                        putResult(result);
    2 d% F3 S& p  }& @0 k. N  n0 m                        if (!isEnpty(result.errorMsg))! Y" Y0 R/ s( U8 x% }8 O* s
                            {
      Z: h1 a) ~- F" }* m' v2 ?6 N                            return;& _8 b5 l# H3 G% K- o) G
                            }
    , [- Q" R; Y) v0 [* N7 L2 W5 c. C
    5 o4 P" y- V3 u                        textAppend("请安装新版微信,并在登录成功后点击【覆盖安装文件并重启】按钮!\n");7 c' E4 S! M1 q1 j* }
                        }" S$ [6 z$ @& V
                    }.start();2 {8 E; c7 c+ O
    * ~$ n7 W; y5 r; k1 O% y4 X  s
                }$ \/ E$ c: P! X( O5 J
            });
    * Z0 U/ X' l( ?
    . e8 S* _( P' x
    4 F) m0 y  `! K        ((Button) findViewById(R.id.button2)).setOnClickListener(new View.OnClickListener()
    : P& R- v6 w; Z; U7 X        {" d5 B% Q4 _% i+ v* E( W" D+ ?
                @Override
    2 j) d+ [6 n( ~2 i            public void onClick(View v)
    ( ?8 c' b) f+ [            {
    ) M' i: u- J% ?1 j3 T, ~! n5 O7 h4 o* O9 K1 p( ]2 |2 F
                    new Thread()
    % ]2 I% e; B0 L6 P$ g8 @; B) t; k9 l                {& C  j& g' I: h1 X$ N! K# U  p
                        @Override
    ) E9 X" I( u% q; A& r/ m. z                    public void run()
    1 ?" q) X0 O. C/ C- \( W8 e) u                    {$ ]* }5 S9 E% g9 ?  p0 [) P
                            String path = getPath();
    ; o: d6 }2 x! @3 L                        if (path == null)
    8 q4 f  G1 `) n" Y, |! W. N7 k                        {
    ( N# |4 G1 K3 K4 l2 Q3 w8 T                            return;5 v: q" y' V# s/ I9 N4 O- p/ O
                            }
    ( G! W2 z1 ?2 K+ X# k' V, H1 S8 J2 I$ Q# V" s2 h7 ?
                            textAppend("正在检查是否有备份的安装文件!\n");$ c5 O4 v) P' M  l) [) A
                            if (!new File("/data/local/tmp/com.tencent.mm").exists())1 x, A4 [% N* R" X9 `& [0 K) Q8 O
                            {& o, J5 D9 I% h( w# X, X6 J
                                textAppend("不存在备份的安装文件,请先安装低版本微信后点击【覆盖安装文件并重启】按钮!\n");' g8 L8 c7 _$ J9 p
                                return;8 u2 d, z3 k, K: |3 N
                            }$ b: X3 i+ I5 Z( r- i
      R. r* k& e5 d. r& }* a
                            textAppend("已有备份的安装文件,正在删除当前的安装目录!\n");
    ; V: y1 @5 B  p8 g                        ShellUtils.CommandResult result = ShellUtils.execCommand("rm -rf " + path + "/*", true);" e; t, v1 f+ O/ @, H
                            putResult(result);
    ( Z6 e/ m/ E: o( F                        if (!isEnpty(result.errorMsg))
    / k% e& p$ E1 `+ ?2 [                        {, n' g# w" q; i; K8 J0 ~
                                return;  g2 ]) [) [: R* W, [+ w: T
                            }  j9 N# ^1 k4 V

    4 k: n# c$ H. i; c4 f" n& G* }+ O, s8 |( J( B0 D3 i
                            textAppend("正在覆盖安装目录!\n");5 q* `8 ?0 [  b) a# @$ P
                            result = ShellUtils.execCommand("cp -af /data/local/tmp/com.tencent.mm/* " + path, true);" [3 c2 J, R# j  U0 y
                            ShellUtils.execCommand("rm -rf /data/local/tmp/com.tencent.mm", true);
    8 J' }; F1 n& y' k" r( P/ ~3 Y                        putResult(result);
    3 r/ R+ Q+ @( g% L                        if (!isEnpty(result.errorMsg))7 h' Z1 ?: C- W7 \9 h" h
                            {+ F# m& R6 w. B' ]# b
                                return;
    - D4 p/ O& {/ ~# B( y- K                        }
    1 z2 [+ y- X5 l3 n8 J# E) ~" C  b6 K; _# Q0 w
                            textAppend("系统将在10秒后重启!\n");1 F' y1 x7 z' U  u! V* c5 ^, W, \

    " s0 W: G' b/ h* V, N9 ^
    5 h$ `) T! b$ I2 X6 o: p  s                        try
    ; q' i* V+ X( K% s                        {
    8 H7 X1 F5 r' d( c5 [                            sleep(10 * 1000);3 m  ]+ Q# T' {; u$ J0 {* r
                                handler.post(new Runnable()5 l7 {8 {  h5 [+ q3 V8 ?8 M
                                {
    , s% \9 L1 n; a+ [! u* t/ I                                @Override
    2 C5 w! `3 g! G* y9 g; j                                public void run()" F  U4 W) l. A1 c( S' Z
                                    {# T8 {, ~9 ~( U
                                        ShellUtils.execCommand("reboot", true);) _/ w; a( q( i+ M; n
                                    }) V7 S2 h2 u+ @* X
                                });
    7 L) |2 t& h) ~6 K! B' F  h" z: m                        } catch (InterruptedException e)2 _8 J* L8 H7 h6 ], _& ^0 f( r) Q
                            {
    / W& d3 h1 h4 ?) [  }  u                            e.printStackTrace();% U* p0 H9 V2 c
                            }
    5 ]2 k2 q* {" j& V8 h                    }
    . {  `" ?& a# j6 f( P( Y                }.start();; R+ ~8 i# H; q: k: E5 U! T! |
      l3 y* a: l! r7 A) N1 k
                }
    9 r* @3 U2 ]1 V4 W, m* X! T+ {        });
    # w1 h/ D$ K! u5 @- M  f! H' M' |& p# l; F$ T* V9 J8 {8 c5 n
            textView.append("-----------------------------\n");
    ' H, @2 [* I- `. L) D        textView.append("该应用需要root权限!\n");9 W0 p8 J" ?, A( \
            if (ShellUtils.checkRootPermission())
    & h; ^( j; y+ U% v6 ~        {# s6 L7 R# f! ^8 D; m- w: l% j
                textView.append("获取root权限成功!\n");
    + O  Z$ L& V! p        } else
    ! D- T# p9 p6 C" W  {& P: F$ j        {
    $ e! Q7 i7 n, U- Q( g6 Q            textView.append("获取root权限失败,请在设置中授予权限!\n");
    # l4 ?( [: M9 E        }+ s" @' ^9 A: I; r6 E

    / W! j$ R  s9 A; L3 O: |+ \* w5 a( p$ y# {8 H9 m
        }
    $ l" j& g8 ?& G/ L9 f}[url=][/url]
    * B& n2 B7 K/ c! k# G
    6 C- q  K1 ~4 [1 I  S! J
    " x8 G) C- [  L6 O- l& U# ^
    运行如下:
    先安装旧版本微信,
    运行该程序,点击左边的【保存安装文件并卸载】按钮,
      安装新版本微信并登录,
      点击右边的【覆盖安装文件并重启】按钮,
      重启后重新输密码登录即可。
    # l; M% j# b1 S! |  f4 C( x
    完整代码 wxreversion.rar
    安装包在release目录中
    ! J( k+ x: U( f8 K1 q7 M0 V2 }
    分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
    收藏收藏 分享分享 顶 踩

    本版积分规则

    关闭

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

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