下沙论坛

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

用新浪微博连接

一步搞定

QQ登录

QQ登录

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

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

[复制链接]
  • TA的每日心情
    擦汗
    昨天 17:14
  • 签到天数: 2366 天

    [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 U: V( Q6 U( H
      但是之前做的一些东西都是基于老版本的微信,所以不能安装新版本,必须想办法在老版本登录才行。

    : T0 K" e4 v) ?1 W( b* \操作过程尝试1、替换版本号
      最开始的想法是,既然要验证版本,那我就把旧版本的伪装一下,让它变成新版本的试试。
      但是,因为没有时间去仔细分析微信是怎么验证的,于是就抱着侥幸心理,写了个xposed模块替换版本号,
      一般情况下是通过以下代码获取版本号的:
    PackageInfo packageInfo = getPackageManager().getPackageInfo("com.tencent.mm",0);int versionCode = packageInfo.versionCode;String versionName = packageInfo.versionName;) g! F* V* v9 ^% ?
      所以去hook getPackageInfo方法,将其返回的PackageInfo中的versionCode和versionName替换成新版本的值就行,
      但是,由下图可知PackageManager是一个抽象接口,
      所以不能直接hook它的getPackageInfo方法,要先获取getPackageManager返回的对象的真实类型,先随便创建一个工程,通过以下代码获取真实的PackageManager类型,
    Log.v("test", getPackageManager().getClass().toString());
    # k  n4 R8 g4 ~9 t7 T/ ]5 t3 Q$ H% n
    5 o: g+ U7 \+ I1 M# I# V查看日志,可知真实类型为android.app.ApplicationPackageManager,
      然后通过反编译最新版本的微信,获得versionCode和versionName,
      最后的hook代码如下:
    [url=][/url], Q' \( l6 w7 b4 {7 h9 r+ R' C
    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]& F4 e( w% x% ~9 a
    # D+ k5 R( r1 T

    0 m! S4 T1 R- F. t
      编译安装后重启,一边输入帐号密码,一边祈祷,结果还是提示版本过低,

    & r7 O, G6 S& F9 P2 {5 y0 x. H1 |尝试2、pm uninstall -k 命令
      想着之前旧版本的都能正常使用,说明只要有登录数据,就可以使用旧版本的,所以想着先用新版本的把帐号登录,然后使用 pm uninstall -k 命令,卸载应用但保留数据,然后安装旧版本的。
      先安装一个新版本的微信,
      登录帐号,
    ! q$ `6 v$ D( h/ ]8 C* D) u4 h! z9 S
      使用pm uninstall -k com.tencent.mm卸载后安装旧版本的微信,
      结果打开还是不行,还是提示版本过低,

    ' s2 c2 l6 r$ J9 [6 i
      于是怀疑卸载的时候数据被一起删了,根本就没有保留,再次执行pm uninstall -k com.tencent.mm,查看data目录,微信的目录已经不存在了。
    尝试3、adb install -r 命令
      同样先用新版本的把帐号登录,然后使用 adb install -r 命令强制安装,结果还是不行,不能安装比当前版本低的,,,
    - n' z8 N' a9 e( ]
    尝试4、替换安装目录
      既然用 pm uninstall -k 卸载时保留数据不行,那么就尝试手动替换。
      首先安装低版本的微信,把安装目录复制一份,然后卸载。
      再安装新版本的微信,并登录帐号。
      用之前保存的旧版本安装目录替换新版本的安装目录,然后重启手机。
      重启后提示登录错误,重新输入密码即可,
      不知道为什么,这个手机在我写这篇博文的时候,关于微信的页面还是新版本的版本号,而我之前弄的另一个手机就是真实的旧版本号,
      但是这个手机系统设置中微信的版本号已经变成旧版本的了,也不影响使用。
      另一个手机的,
    / z9 ^4 ?4 G* f
    自动化程序
      把之前替换的过程写了个自动替换的程序,代码如下,其中使用的ShellUtils在之前的一篇【Android手机插上usb能充电但不能识别的一种解决方法】能找到:
    [url=][/url]
    + L- m, ^' x) D- F5 V' F& o$ }" b* L. Dpackage com.example.wxreversion;
    : a/ y5 M3 B( l  O
    7 W9 _8 G9 Y3 Oimport android.os.Handler;
    ) r( y# N: R/ x! @import android.support.v7.app.AppCompatActivity;) f6 H' a) ^, [# w9 L! D
    import android.os.Bundle;4 B2 n9 F" E- Z
    import android.text.method.ScrollingMovementMethod;
    . ?* {2 o2 Y* z% {3 s& W& C6 Bimport android.util.Log;* n6 m4 g% i3 U/ G% _% A: J7 h) }
    import android.view.View;
    , _( e7 n! N2 m5 ^$ f( Bimport android.widget.Button;. T& k5 h* N; z$ E9 Y3 L1 {
    import android.widget.TextView;" q% h8 R- K& b' l: U/ g

    * V5 T# b- M/ n: N/ Iimport java.io.File;: [7 P; o# {& E$ F2 U" {) @

    - @- l4 L, X2 b# @, Gpublic class MainActivity extends AppCompatActivity# p( u" r  p+ w9 T7 q3 [# f; Z
    {
    & k/ S) F) y6 d3 T) `    Handler handler;" n5 c8 u6 J$ d+ N, A5 q
        TextView textView;
    ' q4 C+ ]2 K  f2 r+ G3 _2 q3 ~3 r0 w" @0 v6 w
    5 T9 b9 c6 ]  u( i( I  ^0 k1 ^
        private void LogV(String s): p1 j* \' P* P5 O% E1 v+ Q
        {
    # Z4 {+ }* h6 b# G8 c. f; L        Log.v("test", s);
    3 }  M( B) X) _% r) V    }2 Q5 I0 c* }9 ?; `9 ]8 m( I1 p

    1 b) ?2 W2 _& I7 X6 y, J. o# W    private void textAppend(final String s)
    " G1 W  v) m3 g8 Z: o1 O/ X    {
    ; D/ j: e/ T0 \9 y' Y3 v        LogV("textAppend:" + s);+ L* S% T+ M% a2 Y* F
            handler.post(new Runnable()
    9 n7 s6 O+ R) U# A        {
    % ?- D) ]( j* u% {, U5 p            @Override( o5 D) Z: m/ a! R  p6 c: Z
                public void run()
    : e( q, W7 R0 m0 K* t            {
    6 t: l. b; O& c3 Q% ?                LogV("run:" + s);
    9 J  b5 h3 o0 y
    + ]' t. ?6 i5 t, }7 w/ O                textView.setText(textView.getText() + s);
    % k7 Y7 o& X) W' p, O1 B            }
    3 V5 u$ \) \9 y- k4 ]7 e        });  `5 x' ~; h1 h* W# ^# f& w- \
        }
    % _) m7 E) P) B- Z
    & ?) i+ {, t# k) I    private String getPath()" p! S3 a& _9 d4 Y  i5 O  e
        {
    + N9 j1 p6 `7 w2 J" g2 A        String path = null;/ c* ?- `- ]' n7 K# Y1 I7 V$ x. g# n
            textAppend("-----------------------------\n");
    3 e6 X8 h8 H5 G/ V( `) Z; K
    6 P' B6 h0 U3 D/ m9 R% ?4 f; B8 L  P, w' s( |6 b6 Y4 Y3 A+ S
            if (!ShellUtils.checkRootPermission())
      k. I  P$ x  K) ~8 H$ \        {
    0 g# {) r7 @: G% w( G+ T            textAppend("获取root权限失败,请在设置中授予权限!\n");
    6 F) }7 R# J+ h) C8 E            return path;& f0 u" D5 A. Q6 o% P$ C; b; `
            }
    2 K7 N! l8 \! Y2 K. o9 i9 j; X* e$ i4 d8 J& [$ |2 z: x$ r
            path = ShellUtils.execCommand("pm path com.tencent.mm", true).successMsg;
    7 J) X* O: l* {) M        if (path != null)+ I' M9 L1 F% w3 `8 X7 g
            {$ P2 \. N, F' i# ^2 [
                try  n% s/ ]+ x% _) G
                {0 z& h: k9 A: n( J6 A) P. N
                    path = path.substring(path.indexOf('/'), path.lastIndexOf('/'));
    ' m/ B6 D% t8 T) K5 U: V/ N3 Q            } catch (Throwable throwable)
    # V; X) X: y6 C5 k            {
    . |; }- y5 W, H                path = null;3 O4 ~2 x+ W4 F3 J6 t+ q
                }
    ( L8 W- c* C: Z& B* k  b7 i        }
    - y  U7 U/ r  I7 v. i0 k3 b+ ]" ]7 o" K
            if (path == null)  H% O% V( X( x* E8 p- p
            {; G! m3 t: a$ [/ Y; I6 {
                textAppend("未找到微信安装目录,请先安装!\n");
    & j7 ]/ F, Z! j, J2 ~        } else
    ( n) d3 c8 A  c& I& ~2 |9 V/ |, A        {
    8 j2 E' ~4 r) c5 x. S- l( E            textAppend("找到安装目录:" + path + "\n");: p; n* q2 G1 D: r5 r, `8 x: `
            }8 V6 p1 f  J$ E, K7 M+ U2 k* e

    , _+ W7 j" D- P, W6 q% D5 a5 s        return path;
    0 Q) x/ D# D- ^8 Z; b    }
    - p% y5 p& B4 f; j6 q; c, Q
    $ s2 Q" e% C9 H" }    private boolean isEnpty(String string)/ W/ j/ [$ `2 T9 w
        {
    1 Z" M& \+ s5 f! N' n0 E        if (string == null || string.length() == 0)/ C4 H! \+ a, H2 b1 Q
            {
    $ m0 V4 r  A! E7 J* h+ M            return true;
    8 i$ \, ~& {* _' K; r        }! w  k. b$ {8 u1 |; P
            return false;
    ! c1 k$ P3 z9 F- [4 I! x3 ^( @    }3 S* |+ ^" q1 c7 h) a4 X

    * `) Q# ?& b) u    private void putResult(ShellUtils.CommandResult result)
    . b% y/ j. z* _  o( X. b3 N    {1 l0 j: L# y4 |- [& j; ~/ Q
            textAppend("返回码:" + result.result + "\n");6 P" H) z8 D8 s* E4 ?

    8 \! m" R- `# H        if (!isEnpty(result.successMsg))2 l# V/ l/ z  ~+ V. @
            {5 v! w: S; ?* R/ v% Z6 {
                textAppend(result.successMsg + "\n");
    4 k: L1 j1 M# E( q. P; b        } else if (!isEnpty(result.errorMsg))5 i/ [1 O' B- Y& i
            {
    8 u3 |3 E9 X, A. x* ?            textAppend("错误消息:" + result.errorMsg + "\n");) \6 p* z6 e* X0 I& q; ~- J. k  b
            }
    ; y2 Y5 U, w. R3 a    }
    - O, M$ g1 Q# g4 N5 p) D5 Q2 s* c, R4 A# O
        @Override
    ( \: V7 @) R/ ?) B    protected void onCreate(Bundle savedInstanceState)6 r: _1 p% e) b1 R1 E/ K
        {2 H! U# D5 y# ^+ ]- @1 O
            super.onCreate(savedInstanceState);
    ; ]6 Y$ C, q! V/ v        setContentView(R.layout.activity_main);
    7 B7 ?% s" d" g1 X7 ~& c4 K        handler = new Handler();
    ( ~5 X8 Y1 C4 K9 S  k$ }% D. |- J% I& }/ N" S% y
            textView = (TextView) findViewById(R.id.textView);
    3 ]( N2 \1 Y9 C! a        textView.setMovementMethod(ScrollingMovementMethod.getInstance());' v  s1 ?+ J" D5 T1 y1 X% t
    # Y3 |* E/ w8 _; U" ~
            ((Button) findViewById(R.id.button1)).setOnClickListener(new View.OnClickListener()5 p7 U" S; Q* i+ k$ Z
            {2 h6 u, s, f+ O9 s) B
                @Override
    9 q% H9 R2 A0 @& ~% x            public void onClick(View v)1 h; E' h7 d1 O$ V
                {
    / L% Y- c9 Y9 }- s4 x' M- ^' Y3 m  X  b
                    new Thread(): @, g; l9 R2 T; x6 X
                    {% M8 |- @1 m$ d" r* U% s
                        @Override' X5 ?/ h7 l4 G9 {8 m. U! s$ y
                        public void run()
    5 v, E8 O7 }9 c                    {+ o& Q* U; M4 d5 V$ Q) b
                            String path = getPath();+ L* |9 @) O4 L% [/ Q/ {
                            if (path == null)' f: j, I7 }- i1 K, }
                            {  r; Y1 h8 Z- t/ Z* u
                                return;+ T) ^6 ]+ a# M
                            }
    0 @% X) e: {& a9 k+ v; w                        textAppend("正在保存安装目录!\n");/ t+ O$ r7 c. W# h: Z
                            ShellUtils.CommandResult result = ShellUtils.execCommand("cp -af " + path + " /data/local/tmp/com.tencent.mm", true);" n; ]' g1 R  _$ b5 W
                            putResult(result);% R5 t6 W+ o& X- y3 T  E
                            if (!isEnpty(result.errorMsg))- P& X- Z: {. s+ W3 H
                            {6 I5 U9 f$ t1 Z, y
                                return;0 a! W! |2 I7 x
                            }. b8 ]+ C* E5 S/ C+ A

    8 M) k# h5 v( z                        textAppend("正在卸载微信!\n");
    7 w, P9 P. F5 @( ]% j6 |                        result = ShellUtils.execCommand("pm uninstall com.tencent.mm", true);//-k无用
    4 H  M) U6 B% {6 R7 R                        putResult(result);
    , _* _8 [% i  X2 s2 n3 l* t                        if (!isEnpty(result.errorMsg))
      l2 ?" L: a4 O  n                        {
    " ?. O% Q; Y  b. [+ `, {3 z5 u" Q: q. W                            return;
    2 S) Z- t9 y5 J6 f, q9 N0 c5 C+ X9 s                        }/ G4 c, b& ]  D0 g4 `& w
    8 w2 l3 O* d* F! K( w8 G. w0 y3 n
                            textAppend("请安装新版微信,并在登录成功后点击【覆盖安装文件并重启】按钮!\n");
    4 d$ }8 s; w& ?4 k* x/ ^$ z                    }0 G' t& @( P0 t6 l4 @8 J& \
                    }.start();
    3 L2 f, \# P0 |5 X4 K# x6 w$ p! s
    + L) d) f, T) j. U7 w* d, N            }
    8 U  u8 l" Y: U( [0 m; u        });- A) p0 w/ Y4 a0 \; G0 w; M

    - l2 t/ ^  I$ {- n+ z* g! J* E. q  F( n3 G
            ((Button) findViewById(R.id.button2)).setOnClickListener(new View.OnClickListener()
    + r; f6 b/ U6 s        {
    ( E* E5 t7 w% m            @Override
    , V" H# A8 u9 z& d7 @            public void onClick(View v)9 Q+ |, A9 n/ g
                {% U1 b. p% P# x2 z! o# a' k$ c
    + d# c; @! e* s, k. D* P% h
                    new Thread(); x# Y' Z( O7 c. _5 B& o4 T
                    {' L* E! e# U( H* f+ e6 Y
                        @Override' x* Z9 d" n3 s( k0 W1 v
                        public void run()
    : v0 J4 F+ q0 ~                    {
    ! F" V0 B) h0 k3 f5 ?& R2 b                        String path = getPath();
    + Z- @' `/ N; @* B. i* o                        if (path == null)/ L' ?$ H) g2 V" Q) P
                            {; F4 z; v. S1 E- L( l
                                return;' d2 f* W( l4 r4 N& }' J! ]
                            }; Z7 b: A. S" C4 n/ g
    , T. u/ W  c( u$ x0 a1 j
                            textAppend("正在检查是否有备份的安装文件!\n");: T8 l" w4 m- Z, \/ s1 V/ U
                            if (!new File("/data/local/tmp/com.tencent.mm").exists())
    - M) J& d$ b& d; }* S# R) M                        {
    4 K5 |) j% D! }6 Q8 a) J* i: ?9 K                            textAppend("不存在备份的安装文件,请先安装低版本微信后点击【覆盖安装文件并重启】按钮!\n");
    8 m. [3 t5 O' m; b8 R, ~                            return;3 o+ A3 @9 I: p8 b; G1 `
                            }9 \, J* `: g3 j5 u* s7 T1 w

    + Y5 }, y9 s. o' R7 Z                        textAppend("已有备份的安装文件,正在删除当前的安装目录!\n");
    6 A% b/ Q- {$ L' D' a% B                        ShellUtils.CommandResult result = ShellUtils.execCommand("rm -rf " + path + "/*", true);* G$ r8 t; L) R# D+ d9 o& ]
                            putResult(result);# U3 t/ y- ]# x9 x
                            if (!isEnpty(result.errorMsg))
    9 B9 p5 w0 u: _: k( G                        {2 [7 l& n9 \7 Q: @8 O  N
                                return;
    , O+ J& `- w; w  q) h5 V9 L                        }
    5 ]; Z& R* M; c2 d+ p! n5 F1 j: m6 R, H; l+ R/ p

    % e+ |0 n! L4 a) |( k. Q% g7 e                        textAppend("正在覆盖安装目录!\n");. c, Z. Q# O; t; E
                            result = ShellUtils.execCommand("cp -af /data/local/tmp/com.tencent.mm/* " + path, true);2 C+ S3 g3 o2 t6 u  ?- g! e$ V  M
                            ShellUtils.execCommand("rm -rf /data/local/tmp/com.tencent.mm", true);
    / t, J  x  S& n. x( y4 }4 N. z5 `                        putResult(result);. U; \) a: k5 Y$ ~$ ?6 P6 |
                            if (!isEnpty(result.errorMsg))8 z/ p. N: l! j% u( R+ |
                            {
    * b3 F% N0 j3 q- E, m                            return;& H& |& }" h' `. x7 Y
                            }
    , i1 `6 P* _2 S3 w9 ]* m# h% I- V4 k( X
                            textAppend("系统将在10秒后重启!\n");
    ) C/ j. M* M2 D1 T8 F
    7 Y0 w- Q4 w5 g2 w
    6 O  G) {) A" i) t2 N                        try& O* _; W5 y" B( \
                            {+ g) C* r( [5 W8 ~
                                sleep(10 * 1000);
    - {6 S  A4 b4 f, @                            handler.post(new Runnable()
    / T' ?# @# R' v                            {
    . w2 i* t0 \1 W3 ^" \& r                                @Override! u4 {: v( O8 y1 @- O
                                    public void run()
    ; h5 u$ Y. D5 I/ y6 [! J4 D                                {: i2 m6 L) M& [
                                        ShellUtils.execCommand("reboot", true);0 l1 m) }; w- {6 z
                                    }
    / `7 Y7 R5 Y4 X# G  N& R4 [                            });
    : A9 K0 @, R. Q8 e8 z" o/ D                        } catch (InterruptedException e)
    ) x! R, H: h( `                        {" E1 |: Y9 ^3 B3 u2 d& O& U" L' G$ ]
                                e.printStackTrace();
    1 Y  s2 N; L4 o6 ^9 u' w                        }
    6 ~" v8 [+ A: f- B                    }# F$ G2 y- u7 \# |% C
                    }.start();
    " d2 k& w! y! \! e2 d8 `
    $ V! @/ w  E+ p0 X! a- L2 S            }# p- g$ I. f& E
            });
    ( T1 t, X2 T" [2 Y8 ?/ z6 }" F2 |
    ) c" V# T9 T: \& w1 Z+ R! F+ }4 _        textView.append("-----------------------------\n");7 n( t8 D  U% o5 u4 P* ]
            textView.append("该应用需要root权限!\n");9 s6 }# D0 ~+ a9 ^( m
            if (ShellUtils.checkRootPermission())" O% f% c; X/ b! o5 e6 v' f, I4 U+ K
            {
    6 \" J. _8 N  n6 b! Y: v( W: Q            textView.append("获取root权限成功!\n");
    7 [! A( z. o% Q1 X/ C; o        } else5 B) A  b, z- T% l; l- t
            {
    0 ]8 i/ l7 c2 J4 b            textView.append("获取root权限失败,请在设置中授予权限!\n");
    1 b- f# T( R5 x        }
    8 D, k- I- V9 L5 R) y8 S
    : y5 _# K/ ?9 t3 I1 i" z/ _
    " w$ _9 M* J1 _% d  q0 q    }
    9 g: a# c! V4 `+ X}[url=][/url]! K" f9 F" y/ X* n; O3 i
    . A# d. ]' E! @9 }1 D; n
    + z* H0 K$ T& ^$ Q
    运行如下:
    先安装旧版本微信,
    运行该程序,点击左边的【保存安装文件并卸载】按钮,
      安装新版本微信并登录,
      点击右边的【覆盖安装文件并重启】按钮,
      重启后重新输密码登录即可。

    * @; K; Z9 b: _* h5 n
    完整代码 wxreversion.rar
    安装包在release目录中
    1 X' p5 G. j' o2 r
    分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
    收藏收藏 分享分享 顶 踩 转发到微博

    本版积分规则

    关闭

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

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