下沙论坛

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

QQ登录

QQ登录

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

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

[复制链接]
  • TA的每日心情
    奋斗
    2 小时前
  • 签到天数: 2401 天

    [LV.Master]伴坛终老

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

    ( W, u0 I& ?( h操作过程尝试1、替换版本号
      最开始的想法是,既然要验证版本,那我就把旧版本的伪装一下,让它变成新版本的试试。
      但是,因为没有时间去仔细分析微信是怎么验证的,于是就抱着侥幸心理,写了个xposed模块替换版本号,
      一般情况下是通过以下代码获取版本号的:
    PackageInfo packageInfo = getPackageManager().getPackageInfo("com.tencent.mm",0);int versionCode = packageInfo.versionCode;String versionName = packageInfo.versionName;9 ]( z0 x$ @1 W  ?) Z
      所以去hook getPackageInfo方法,将其返回的PackageInfo中的versionCode和versionName替换成新版本的值就行,
      但是,由下图可知PackageManager是一个抽象接口,
      所以不能直接hook它的getPackageInfo方法,要先获取getPackageManager返回的对象的真实类型,先随便创建一个工程,通过以下代码获取真实的PackageManager类型,
    Log.v("test", getPackageManager().getClass().toString());, Q) O& D7 u* ]2 m% {# v
    7 S2 S: G, f7 {( Q
    查看日志,可知真实类型为android.app.ApplicationPackageManager,
      然后通过反编译最新版本的微信,获得versionCode和versionName,
      最后的hook代码如下:
    [url=][/url]
    " C4 l2 N/ k# l5 v% Oif (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% S; `" H+ o' L4 v' d
    2 i; c+ T! e9 S. K

      n3 I- i8 u& t5 e9 t0 x+ O
      编译安装后重启,一边输入帐号密码,一边祈祷,结果还是提示版本过低,
    - f+ P4 |7 A# I; V, @
    尝试2、pm uninstall -k 命令
      想着之前旧版本的都能正常使用,说明只要有登录数据,就可以使用旧版本的,所以想着先用新版本的把帐号登录,然后使用 pm uninstall -k 命令,卸载应用但保留数据,然后安装旧版本的。
      先安装一个新版本的微信,
      登录帐号,
      Q! S  X+ v  @1 o% ~2 v1 i  L: b, I
      使用pm uninstall -k com.tencent.mm卸载后安装旧版本的微信,
      结果打开还是不行,还是提示版本过低,
    " X( E7 U" O' x
      于是怀疑卸载的时候数据被一起删了,根本就没有保留,再次执行pm uninstall -k com.tencent.mm,查看data目录,微信的目录已经不存在了。
    尝试3、adb install -r 命令
      同样先用新版本的把帐号登录,然后使用 adb install -r 命令强制安装,结果还是不行,不能安装比当前版本低的,,,
    4 ~+ B0 J7 Q$ g# |) r4 I' a
    尝试4、替换安装目录
      既然用 pm uninstall -k 卸载时保留数据不行,那么就尝试手动替换。
      首先安装低版本的微信,把安装目录复制一份,然后卸载。
      再安装新版本的微信,并登录帐号。
      用之前保存的旧版本安装目录替换新版本的安装目录,然后重启手机。
      重启后提示登录错误,重新输入密码即可,
      不知道为什么,这个手机在我写这篇博文的时候,关于微信的页面还是新版本的版本号,而我之前弄的另一个手机就是真实的旧版本号,
      但是这个手机系统设置中微信的版本号已经变成旧版本的了,也不影响使用。
      另一个手机的,

    8 P; t1 ~9 Y+ q8 u自动化程序
      把之前替换的过程写了个自动替换的程序,代码如下,其中使用的ShellUtils在之前的一篇【Android手机插上usb能充电但不能识别的一种解决方法】能找到:
    [url=][/url]7 M" P) ^* l8 K$ [9 n) S
    package com.example.wxreversion;
    4 e' G7 e; o5 m) x: j* R) E. @# T. @
    import android.os.Handler;
    1 s' N/ w. T9 B: V+ e3 Aimport android.support.v7.app.AppCompatActivity;% i0 r9 y3 j" X3 \" @9 H
    import android.os.Bundle;
    1 K( ^8 @9 d: W& timport android.text.method.ScrollingMovementMethod;
    6 W- c4 F6 E- E# h7 g, kimport android.util.Log;
    ! D. C+ c6 z' ~) Y9 k9 W/ Jimport android.view.View;
    $ y# T: D. S& r1 |import android.widget.Button;
    ( h- }. K5 N8 P# u% pimport android.widget.TextView;
    : B- J; B( o: \% y1 P  v3 Y0 |+ F9 M- n' S; M! V/ f* x
    import java.io.File;
    , j  @* F( l" ]
    , p  U) l2 D" C) ?$ S* c* n  _public class MainActivity extends AppCompatActivity
    4 p5 r# f) q/ ]) f8 s. N{0 z  A7 Q9 @3 E* d9 W) ^# Q* N7 S
        Handler handler;
    + m1 L7 h8 d. N) J# q, p    TextView textView;: p& x  R+ \4 J& v! j5 [* T+ c
    ; D' K- C8 ^8 D6 @9 Q
    2 l$ b( {& E6 Q( t3 a
        private void LogV(String s)2 c2 L) y$ P. w
        {1 v  z. C$ I2 C- D, q5 H1 i3 W' p
            Log.v("test", s);
    % p5 H8 w; J( T6 i    }5 h8 X6 z( [8 Q9 `6 t4 M! {

    4 i2 h8 Q. y7 f, m% a    private void textAppend(final String s)
    + ^& @" \# i) V2 p    {; \3 j0 S9 m6 ?/ H: D& o
            LogV("textAppend:" + s);8 K. b* S# ?- K( m( ]0 q
            handler.post(new Runnable()
    5 w$ n) Y( j/ y+ `4 d& i, c        {
    8 [0 m9 C& w& `2 I- N2 I2 [6 F            @Override
    7 O" Z. P9 w1 W3 D+ L4 b3 B; |: A9 _            public void run()
    7 d0 F( R4 ^5 S0 @0 u            {+ F8 w/ _( ]- C
                    LogV("run:" + s);
    7 W% X( p% Q8 a0 E. [4 R: H2 d3 P
                    textView.setText(textView.getText() + s);
    ) y3 e" R$ C; G3 U0 G: P. m( f            }
    * T8 V& `3 |7 C7 \        });
      q! k2 W( p7 W, M" s    }
    9 ?; Z; [# G2 ^, y& M' T
    7 k- Z/ }# A& e    private String getPath()
    ) Q! l  a4 Z% e* R, A    {
    - S- v1 o4 T. ^0 j: u; Z        String path = null;8 D7 ?: E& Y, i, @1 ~4 i! h
            textAppend("-----------------------------\n");4 t" F( L/ e2 v, T1 _; U
    % G1 [; _" l. X- X' d: X- U

    + P0 |4 f9 V) D& S4 n, z        if (!ShellUtils.checkRootPermission())
    ! |) R, r7 ]2 n. Z2 W2 [        {
    ' a; M3 r) t1 t% W, x            textAppend("获取root权限失败,请在设置中授予权限!\n");# D$ p  w# m* x8 R3 F/ z
                return path;
    & D* C# \% W' G2 J7 F) b        }3 ]0 B6 x' r- A+ i3 Q  r
    1 j1 c- G4 Z% s* [
            path = ShellUtils.execCommand("pm path com.tencent.mm", true).successMsg;
    0 I+ k! D, ]+ P- a- p4 y% s- j        if (path != null)- j- T# ^% t+ `  l* b# ]
            {
    * Y" O5 [$ S: R7 F1 U+ D            try! C8 {; Y  R& {" y0 R- t# u
                {- k& l- Y& b0 w# X8 W" S
                    path = path.substring(path.indexOf('/'), path.lastIndexOf('/'));
    ) ^9 g* F& ^4 z! g$ k8 @            } catch (Throwable throwable)
    " z/ o8 g4 j0 U3 U% [            {
    ; X$ w% _& t9 n. D                path = null;& V0 J. {6 Z' T* j6 n
                }
    7 m8 X& i0 j3 Q, m        }: B* D* }! u* C
    " Z- |' l7 a8 A
            if (path == null)$ U+ q/ R4 k) x. \, ^6 x" V  x
            {
    $ U0 O1 w1 ^: U) g) t            textAppend("未找到微信安装目录,请先安装!\n");
    " K% K5 N3 y7 a) C- D1 u        } else
    / |3 C' z8 b8 K# t. R3 T        {2 A+ P; k, I! m0 y- ]* q, ?
                textAppend("找到安装目录:" + path + "\n");
    8 b0 `" z, M& ^  O* l        }4 [/ w3 n: ]% w/ A7 g

    " d/ E) N2 e: R; ~% J        return path;
    / G7 Y$ X3 L+ i- r; ^    }
    : z' W# ?7 O7 ^
    ) s7 K" e7 @$ W% @    private boolean isEnpty(String string): K# j3 @3 ^4 ~9 a# k
        {
    : I) h8 P1 s8 p5 _4 U7 e        if (string == null || string.length() == 0)
    . Y6 H4 F( Z: N  e6 l        {
    . a. s! _" U9 W. E+ ~            return true;
    ' \( V) }. F' T) [4 }' C        }8 K* k2 S& y0 {8 m, `
            return false;
    ' O( A, ]1 l" b0 b    }
    1 U' T5 p  ~* z. @8 [  Y8 h9 q7 H  h; X
        private void putResult(ShellUtils.CommandResult result)/ Q1 G( B! V$ R( F
        {6 `1 l& V5 U1 S; R" \. D
            textAppend("返回码:" + result.result + "\n");
    4 r8 h  x7 R3 K& f/ k5 c3 _0 R1 e0 _' l4 n/ O$ S8 K4 ]
            if (!isEnpty(result.successMsg))5 z4 C- C4 Q9 S( v* z
            {
    5 K  M, Q; |+ @% ]( Z/ c            textAppend(result.successMsg + "\n");
    0 Q' s2 t1 y. @) G        } else if (!isEnpty(result.errorMsg))5 J$ E8 E6 P# c4 F8 X% e# u
            {
    $ V, x7 q$ z5 M( T5 P/ Q" t            textAppend("错误消息:" + result.errorMsg + "\n");! v3 v9 u( ]/ `
            }
    3 w; Y  R: F! y: c6 j* x    }$ K% M! s0 v, K0 H" J
    , ^/ x  l, K7 Y  A' Z7 X
        @Override
    & D7 f8 h0 _  @6 e) Q3 r    protected void onCreate(Bundle savedInstanceState)
    $ p+ u2 U7 F' ~& h% v& s. B, a    {
    3 h6 |& P+ e! {2 g; [( [        super.onCreate(savedInstanceState);
    $ S: B8 i8 A9 P        setContentView(R.layout.activity_main);
    # {: k) J( E+ b/ J) s        handler = new Handler();
    % S5 V7 Q. e3 h6 H
    - D: @' X' X% W; G        textView = (TextView) findViewById(R.id.textView);% p+ [- u7 z) j7 c% p9 L
            textView.setMovementMethod(ScrollingMovementMethod.getInstance());
    6 ~  y7 B% m$ J! o& U! p, N
    1 k2 j5 Z3 d# e8 F8 K( V        ((Button) findViewById(R.id.button1)).setOnClickListener(new View.OnClickListener()% T4 i- h6 M7 r7 p* _. v& K
            {* @& H3 B7 f6 ]* [" D; M  ^
                @Override& p! Y  \- V& ?. D, i: q& z# b% D
                public void onClick(View v)( J& c0 l: C! _. \: ?1 F
                {7 V! m& U; [# G% v( A

      E$ r9 \; {: Q3 P, U3 n                new Thread()8 k7 h! P% z' T5 t  {& A, |/ F: G
                    {
    & i! e8 J. e( @  ]                    @Override
    : M' r9 x" k3 a! s: X/ }+ e                    public void run()
    * P: E" @6 W, O- x' O                    {" n3 U; B; m! u4 Y
                            String path = getPath();' X' H! ^- m  @) r
                            if (path == null)9 u# Y/ r0 m; G8 y# W7 [
                            {
    1 ^/ m- y4 \9 T  S% Z                            return;  x  T6 }+ e3 x6 t- F9 J) y
                            }# U1 b4 ~# h+ r; g
                            textAppend("正在保存安装目录!\n");7 X0 j2 ?. y' |% l0 {1 X1 A- [
                            ShellUtils.CommandResult result = ShellUtils.execCommand("cp -af " + path + " /data/local/tmp/com.tencent.mm", true);
    . c/ a" F3 Q) v  Z* _& A2 \                        putResult(result);+ c: o) d1 C) v8 F; ?6 T. R; J8 r
                            if (!isEnpty(result.errorMsg)), t; a3 y3 U- g: [) w
                            {4 C9 K/ r0 @+ e! Z+ H7 Y$ Q# l
                                return;
    1 O5 ?. M+ a) l! j                        }
    " ^% S0 @( A0 K, E0 r2 M! G
    - @* I$ s3 R. Z0 f5 h. U' g                        textAppend("正在卸载微信!\n");
    . k* H. ]( C  E/ h                        result = ShellUtils.execCommand("pm uninstall com.tencent.mm", true);//-k无用
    # g- ~8 M( I0 g+ z3 `                        putResult(result);
    / q# t: Y, P6 z3 S                        if (!isEnpty(result.errorMsg))
    , A9 g8 A0 w3 a& _+ P6 U                        {
    & Y' d( {' `: d: h2 c                            return;. K4 s( o4 y* z% ~9 F0 \7 j3 ?
                            }
    ' N$ l& N& G7 e3 a  R; W8 N
    . G$ k+ W# v/ E* j+ _& V! v                        textAppend("请安装新版微信,并在登录成功后点击【覆盖安装文件并重启】按钮!\n");
    - h  F) [; E+ M' q8 D6 a: @' _                    }
    : A0 ~9 B- L' y6 o. g4 c" ~; [& E" _                }.start();
    " R8 j1 O. ?/ Q1 r# W1 G6 e
    . [# V/ v. A6 [* c            }8 W  k4 b+ i7 \0 n/ W; T
            });' L# b2 z4 ]8 h  Q3 u, ^2 o& A' t
    , Z4 E5 a* J- k/ H, g

    - k2 K  W( i( r$ t" `& @" j. M        ((Button) findViewById(R.id.button2)).setOnClickListener(new View.OnClickListener()
    : _' @) m4 @: t8 }# R& }        {
    ! w1 O) ]4 a1 x8 i) Q            @Override( j5 [# A% F' f! a: Y
                public void onClick(View v)
    . a; B9 ^1 o5 x" k9 p+ o            {% S- D+ I0 Y/ D7 R

    9 `, x0 n; F  E/ E- d                new Thread()6 |: H8 ^  H6 F2 q0 a
                    {
    # ^  W+ C9 `! A  K8 u. _" n* E( Y# n                    @Override5 {6 W8 A+ y8 K; E1 h5 z& Y4 S
                        public void run()* @1 T, G1 J5 ]+ T. K& R
                        {
    + Q6 |! ]9 X  N2 l                        String path = getPath();# E) b6 }' C8 U1 E' E
                            if (path == null)
    + U  `- F: m% m' r; ^3 h% k; H- Z                        {
    ) N4 ]; g# v# ]$ w                            return;9 E9 g4 u8 T- a) j2 }. a' P8 p( z
                            }1 j# s( `5 x0 e9 I
    * X2 c" J0 p& o; ^5 r: @  k
                            textAppend("正在检查是否有备份的安装文件!\n");% k' q+ j, N% ^. J6 v) s, E1 k
                            if (!new File("/data/local/tmp/com.tencent.mm").exists())) s0 `$ Y3 v( i. `& e8 q' i
                            {9 X9 O4 s; b8 J+ m# p( W: n+ N: T
                                textAppend("不存在备份的安装文件,请先安装低版本微信后点击【覆盖安装文件并重启】按钮!\n");
    1 X6 I4 G' w1 f% H  E2 y1 g                            return;
    7 s. Y8 ~$ m2 B( E  Z                        }
    % z( W9 d2 A1 w4 B( }) y1 ?9 Z( e; P8 K0 y& t3 h
                            textAppend("已有备份的安装文件,正在删除当前的安装目录!\n");/ z) L3 S! T/ B: `# P# n
                            ShellUtils.CommandResult result = ShellUtils.execCommand("rm -rf " + path + "/*", true);
    , f7 F0 X( y3 }& A* ?                        putResult(result);
    * F/ D+ h7 t3 p, H' |6 q. T1 k) s                        if (!isEnpty(result.errorMsg))
    : F; J1 z/ W0 ^- O2 D                        {0 |& r4 ?& g1 @+ z* l) ~4 m. Z4 e- b8 W
                                return;3 s* f8 Q8 z9 @. _  N7 f
                            }! o0 d0 f+ i2 L  J3 H
    3 p! b- N$ x+ {' z4 ~+ |$ X

    $ J5 c' b: Q& I: W; C) ?                        textAppend("正在覆盖安装目录!\n");
    5 _  j! f6 J) ~$ `# p' w. ]                        result = ShellUtils.execCommand("cp -af /data/local/tmp/com.tencent.mm/* " + path, true);* I- k% t: l$ l( e! [4 p# k( M8 N
                            ShellUtils.execCommand("rm -rf /data/local/tmp/com.tencent.mm", true);
    / c1 R. @, N. N1 J& O/ o                        putResult(result);5 k7 f& q5 g1 H2 K
                            if (!isEnpty(result.errorMsg))
    , b. u9 L: v# W* S3 i8 ~                        {
    4 i- [" C2 K/ H) M/ t! s7 F( M* D                            return;* d, ~' E2 F+ e
                            }
    * {& f! G! C1 Y
    / K. Q9 M3 |: C& z+ P3 l                        textAppend("系统将在10秒后重启!\n");( w; s( f3 t% D+ |

    ( N( p3 r  n% v) J. M; V- z+ l# c2 r" K# F. K7 U( ~3 ?* [
                            try# I3 K5 M( I" ]$ R& I  h, f# |' h& F
                            {/ @5 i: I! q( S$ u- k0 ]
                                sleep(10 * 1000);/ S/ @: a- R, h; M/ F$ W
                                handler.post(new Runnable(). p) ~" |4 g9 I6 U; n
                                {" J- P( C5 ^8 W
                                    @Override( {! u  a( K4 a4 J0 W+ O
                                    public void run()
    + x; U4 ]$ b' H2 ^) l! T4 i0 D' I                                {' s- ~; |8 P4 Q  z; [6 N8 H7 C; d4 \
                                        ShellUtils.execCommand("reboot", true);' I- `- S- v( e
                                    }
    9 v  c' k8 [' P2 A0 f( o  j  E0 l% b                            });
    9 Q+ Q' J' ^+ O, g                        } catch (InterruptedException e)6 f3 e  H, G) {9 z4 y4 Y; Q- z
                            {
    ; c7 n+ G$ C; R6 q                            e.printStackTrace();+ ~, ^) h% |# e4 U, A1 z9 Q
                            }
    ' [  f% o: l4 ?' M  R                    }' G6 H7 H' ^# o! |# C: J9 D  f
                    }.start();
    9 M7 M! \" [& p, j" w" h( H( K  p  f
                }
    * B, X+ ]' d" C! n3 h) O; ?        });
    9 M% Y* L: s+ ^# ^+ b: L
    - ]1 d% H" V* n  c3 s        textView.append("-----------------------------\n");# Y4 \1 A: V2 f: u# b
            textView.append("该应用需要root权限!\n");4 e. a- K9 x: q4 ^1 C" _$ h
            if (ShellUtils.checkRootPermission())
    0 K1 U9 L7 F( G# x        {! w. X# k/ ~* J
                textView.append("获取root权限成功!\n");
    ; K6 n! J' p; S; e4 g        } else
    ! @/ f$ V' D( O9 E4 J4 e        {: Q5 ]5 M+ A5 |) {; F6 Q
                textView.append("获取root权限失败,请在设置中授予权限!\n");
    2 t0 x0 M- M* I! Q( v( w& y$ O        }
    9 U$ Z+ |- k1 S% U
    7 y1 G( Q% W* }4 n4 e
    - J1 F& |( i7 d6 J    }
    + _" O3 q3 o# w, R6 M6 L}[url=][/url]* G& o% f" F* @) d
    : \( c: P8 @4 _( Y6 D
    " J: Z9 D8 q, |+ M
    运行如下:
    先安装旧版本微信,
    运行该程序,点击左边的【保存安装文件并卸载】按钮,
      安装新版本微信并登录,
      点击右边的【覆盖安装文件并重启】按钮,
      重启后重新输密码登录即可。

    # ]# K2 [" D, k9 `, l3 T
    完整代码 wxreversion.rar
    安装包在release目录中
    - b2 l+ s' H1 M4 Z, i
    分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
    收藏收藏 分享分享 顶 踩

    本版积分规则

    关闭

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

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