下沙论坛

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

QQ登录

QQ登录

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

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

[复制链接]
  • TA的每日心情
    奋斗
    昨天 10:07
  • 签到天数: 2385 天

    [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 p% m& o7 g- d* q
      但是之前做的一些东西都是基于老版本的微信,所以不能安装新版本,必须想办法在老版本登录才行。
    7 e; D) ]3 ?. k
    操作过程尝试1、替换版本号
      最开始的想法是,既然要验证版本,那我就把旧版本的伪装一下,让它变成新版本的试试。
      但是,因为没有时间去仔细分析微信是怎么验证的,于是就抱着侥幸心理,写了个xposed模块替换版本号,
      一般情况下是通过以下代码获取版本号的:
    PackageInfo packageInfo = getPackageManager().getPackageInfo("com.tencent.mm",0);int versionCode = packageInfo.versionCode;String versionName = packageInfo.versionName;
    + [8 l: b! n6 S, N+ A1 q3 P
      所以去hook getPackageInfo方法,将其返回的PackageInfo中的versionCode和versionName替换成新版本的值就行,
      但是,由下图可知PackageManager是一个抽象接口,
      所以不能直接hook它的getPackageInfo方法,要先获取getPackageManager返回的对象的真实类型,先随便创建一个工程,通过以下代码获取真实的PackageManager类型,
    Log.v("test", getPackageManager().getClass().toString());
    $ o5 n3 [1 J/ y" K  \8 M+ S- A9 @, A# K( I8 r
    查看日志,可知真实类型为android.app.ApplicationPackageManager,
      然后通过反编译最新版本的微信,获得versionCode和versionName,
      最后的hook代码如下:
    [url=][/url]6 A8 q8 t3 e4 ^2 u3 _6 _- a0 d
    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]7 U6 @) u/ k/ ]5 e+ B" {4 p
    * ]+ o! w, w( a2 S8 i

    . x# U. y3 v9 s4 J, e0 t+ c) V
      编译安装后重启,一边输入帐号密码,一边祈祷,结果还是提示版本过低,
    2 l6 _( {4 y: L' x8 t0 Y9 _- u! ^7 d
    尝试2、pm uninstall -k 命令
      想着之前旧版本的都能正常使用,说明只要有登录数据,就可以使用旧版本的,所以想着先用新版本的把帐号登录,然后使用 pm uninstall -k 命令,卸载应用但保留数据,然后安装旧版本的。
      先安装一个新版本的微信,
      登录帐号,
    $ r! u2 @- A4 A5 Z" a
      使用pm uninstall -k com.tencent.mm卸载后安装旧版本的微信,
      结果打开还是不行,还是提示版本过低,
    , P# m. O* [! \& L# ]% F
      于是怀疑卸载的时候数据被一起删了,根本就没有保留,再次执行pm uninstall -k com.tencent.mm,查看data目录,微信的目录已经不存在了。
    尝试3、adb install -r 命令
      同样先用新版本的把帐号登录,然后使用 adb install -r 命令强制安装,结果还是不行,不能安装比当前版本低的,,,

    ( S% x1 v. ]4 e尝试4、替换安装目录
      既然用 pm uninstall -k 卸载时保留数据不行,那么就尝试手动替换。
      首先安装低版本的微信,把安装目录复制一份,然后卸载。
      再安装新版本的微信,并登录帐号。
      用之前保存的旧版本安装目录替换新版本的安装目录,然后重启手机。
      重启后提示登录错误,重新输入密码即可,
      不知道为什么,这个手机在我写这篇博文的时候,关于微信的页面还是新版本的版本号,而我之前弄的另一个手机就是真实的旧版本号,
      但是这个手机系统设置中微信的版本号已经变成旧版本的了,也不影响使用。
      另一个手机的,

    2 A$ c$ [& W6 x# F" v6 _自动化程序
      把之前替换的过程写了个自动替换的程序,代码如下,其中使用的ShellUtils在之前的一篇【Android手机插上usb能充电但不能识别的一种解决方法】能找到:
    [url=][/url]: u2 ]7 B! J5 E( O( M- j
    package com.example.wxreversion;! B# C7 s( K3 t  S$ a% _

    . s2 l$ Z& c# N2 Aimport android.os.Handler;
    0 x: V9 R. I2 d$ ~4 K1 R$ kimport android.support.v7.app.AppCompatActivity;
    $ T9 ]: Y/ t6 u$ b' q$ d/ R  k6 Simport android.os.Bundle;
    1 t  x& Q4 I' ]* i, t8 gimport android.text.method.ScrollingMovementMethod;% A2 N  F1 o* [$ ?
    import android.util.Log;
    + ~0 z- O* M' d( ~) S5 Limport android.view.View;
    8 C. H/ m) F* ^% j8 T! j7 gimport android.widget.Button;7 l  T; C0 l. f  m5 q
    import android.widget.TextView;
    ' I( J# }: D. s) J; w# l, b( ?8 H$ c& m4 {7 P
    import java.io.File;
    6 _4 a- W2 J, o# S! G7 m$ O6 V# S+ S$ |4 A1 \; w6 m) B: f) N
    public class MainActivity extends AppCompatActivity* E0 U' N& h1 R( V
    {
    0 T* [2 Z6 i" S8 u    Handler handler;! \3 }- S3 E" G& {
        TextView textView;
    7 Q0 l( o$ ?/ D) d2 z! g+ i* Q6 p& Z9 D8 Y/ t0 l" |
    ) ^8 `. h  z! W9 U! Z
        private void LogV(String s)& a0 g0 o( `. o5 s, K
        {  a7 k/ W4 U! `3 |
            Log.v("test", s);
    ; N( \3 @, l5 x. i8 B    }- i, t8 N/ W7 \# n

    ! ?6 R- {+ N0 M1 l6 a    private void textAppend(final String s)
    ' t( A. d& g: B8 D( W% D* S    {, }/ i: L# }2 I$ Q8 n7 J6 A
            LogV("textAppend:" + s);
    + z4 ^- i5 d1 P+ K% L$ x) S        handler.post(new Runnable()
    * v7 b! {2 h& Q1 c2 j        {  n6 Z1 }5 Z6 b/ D. a$ f1 r( J% T
                @Override9 e1 v( m' a1 F  ^
                public void run(). G7 h& v- e, \9 p2 o8 y9 U
                {7 I' T" E/ v9 b  }+ |6 Q- V
                    LogV("run:" + s);
    3 U; q9 ^4 Y  M
    , k5 W9 P' T7 N4 a, H                textView.setText(textView.getText() + s);% C5 ]2 d! X8 x0 K
                }/ @; L; W# _1 G+ K. y) a
            });/ {% u- Z* v5 C  N$ o
        }7 L9 a$ H+ \; @
    , r: Q, O4 Z  e
        private String getPath()7 N0 L1 X/ c+ w. {/ r
        {
    6 r: `9 R) q5 `5 d3 `" b) H        String path = null;; V8 D- |& v) q$ k7 h* l' g
            textAppend("-----------------------------\n");8 h& K( J6 f' Q2 }: j* r) ?
    ( M" V$ j+ G- r1 u( S

    ) F( [& v: t& p- g$ s# M7 _. |        if (!ShellUtils.checkRootPermission())% ]5 k4 v6 U! V# y5 f
            {
    0 ?4 G: k5 m  o4 y1 C4 o: s            textAppend("获取root权限失败,请在设置中授予权限!\n");2 M. H' T2 t6 u$ U
                return path;
    3 z+ h: A- M3 w% l, d7 N* H8 t        }
    0 k' S# k7 n0 }5 ]0 E
    9 R2 N( i, K5 ^( {! y        path = ShellUtils.execCommand("pm path com.tencent.mm", true).successMsg;2 y" N9 c! [4 G. C  R* B( r# z
            if (path != null)- r$ m' H3 |+ m4 r( e
            {. ^- v$ V/ o% c* q8 V% S1 u
                try
    8 p7 r8 b4 [: ?, W; t            {
    * l2 c( i. B, k9 ^; s) P( Y  s                path = path.substring(path.indexOf('/'), path.lastIndexOf('/'));4 [8 D6 D9 z" |/ ^, z0 Y7 _9 B
                } catch (Throwable throwable). P0 `$ \/ u+ T+ t: ~
                {
    : U  e3 U( P/ J) z0 N8 y! b+ W                path = null;
    1 ]5 f8 L( ~! `- ~: O; T! D            }
    7 G0 L$ e/ a3 I, T8 n" X8 y+ U) m        }3 N' k2 {, t! _

    ; [' Q+ _9 X) d% s$ |        if (path == null)& ?% e* E+ g' t1 b& T6 x8 B% R! d8 t
            {, p$ Z  z' S, o+ B
                textAppend("未找到微信安装目录,请先安装!\n");/ @! k/ X# j, K
            } else" J& X4 Q1 A. Y# c; _( e( B* I
            {
    $ _3 H+ @0 [; ~" L            textAppend("找到安装目录:" + path + "\n");- G' L; U; G3 U2 l
            }
    4 s* o9 ^! y* u
    * Y$ a4 }) S6 {& `7 d4 `( M        return path;" @- E% V" ^: |+ ]" Q
        }
    8 Z* z5 w: b& V& e$ z/ g7 g) F' ~0 W+ w3 `: E, J6 n6 t& R! V
        private boolean isEnpty(String string)3 `/ r! }3 b$ g. `3 d, R7 y$ T1 g: J
        {
    7 Y  [" Q; F+ {  v        if (string == null || string.length() == 0); b1 }2 K- h  a" G# s: j# _2 `& F
            {
    % d3 @6 i+ f6 G% V7 `            return true;
    8 Y% d7 A) d9 `$ ]3 `* p        }; J5 H8 a9 @4 M1 U7 L" i
            return false;
    & A1 Q7 A+ [+ n( `& v/ s: \9 q    }. b& N" D2 T0 _* J6 `2 t! r

    , z2 v. E+ z2 }! I' A    private void putResult(ShellUtils.CommandResult result)
    5 a' v$ |: f5 n( w    {
    * F$ ]" d( L! e5 z& |6 t( j, A9 i4 \        textAppend("返回码:" + result.result + "\n");% A) N! K* _( ?) _9 R

    " `  m, o2 i" K! v        if (!isEnpty(result.successMsg))
    . u4 j1 [+ F; H+ ?" E        {
    - f& v5 A. M" _            textAppend(result.successMsg + "\n");) S2 l" e$ {& |" I
            } else if (!isEnpty(result.errorMsg))
    + V7 N4 X: z( H1 F9 Z        {. q* O% b, k! h0 A% y
                textAppend("错误消息:" + result.errorMsg + "\n");
    " ~% x3 G$ U: ^$ @2 ~( f! O) w        }
    & ^" Q4 G, G8 ~( Y, {+ n! q0 m    }& Y9 q3 a% w( a. B' I8 F

    " i+ }! M/ D, U! d    @Override9 n; h; }+ W( C3 k" S9 w
        protected void onCreate(Bundle savedInstanceState)
    ( m, w; p: f/ K/ C    {
    . X6 j3 @& W* f3 J# \: p7 H( t        super.onCreate(savedInstanceState);
    * e+ g" A, U; \        setContentView(R.layout.activity_main);
    ( m$ ^" q, t. {: l/ w        handler = new Handler();0 p  e1 W: c5 {/ b) {- p
    / r2 f: y- q% T
            textView = (TextView) findViewById(R.id.textView);
    , Q9 a8 d/ [- o7 C% @        textView.setMovementMethod(ScrollingMovementMethod.getInstance());
    ; \' K4 f& Q8 Z+ y# r8 R7 J0 z0 j( I3 A
    . B; B7 P5 E, W5 c        ((Button) findViewById(R.id.button1)).setOnClickListener(new View.OnClickListener(); S4 ^# H2 S& `2 w
            {" p% Q4 U2 p3 u9 m2 Q
                @Override
    " P/ c" O, N  ~            public void onClick(View v)1 W9 T. Y6 h: o% h: M1 `1 M' y
                {1 R0 N6 Z; S! }: x
    % ]0 A5 q  Z9 A/ Y  L1 ^
                    new Thread()
    * J6 h. u" ^) P/ d+ g                {5 P4 F2 b- T6 X" c+ R" V
                        @Override
    0 V1 E# |# u1 U: B$ o                    public void run(). @; S( G4 y3 e: h/ ?5 ~  M
                        {2 d! g6 a+ B" D8 S4 y# D3 S
                            String path = getPath();5 s! w) V" J) ]) q, T5 y7 o
                            if (path == null)" Z, X$ q! U' ?, {, ]. t
                            {3 ~( U' w: Z; H2 E+ O' E
                                return;* S/ `2 T2 W0 ~$ X
                            }, G" h, Y& b9 ^: z4 j8 ^2 I
                            textAppend("正在保存安装目录!\n");7 w7 H- C& {, Z4 u
                            ShellUtils.CommandResult result = ShellUtils.execCommand("cp -af " + path + " /data/local/tmp/com.tencent.mm", true);2 l1 P& l: t* t+ i% H1 p* k% z
                            putResult(result);
    8 R& _0 v1 n3 Z4 E                        if (!isEnpty(result.errorMsg))
    - b1 [) v' O- G. Y+ Y( @                        {9 |0 r" g9 _; j
                                return;) a/ p% t' m  Q+ p
                            }
    2 m4 X( `5 S0 s0 j
    : C$ I5 }% `, y% U+ w6 q                        textAppend("正在卸载微信!\n");7 x7 @2 F3 \/ j7 @
                            result = ShellUtils.execCommand("pm uninstall com.tencent.mm", true);//-k无用0 v3 {) z. S, m* b' z. U
                            putResult(result);( W2 A. u5 c& l+ B- i4 Z8 c- v
                            if (!isEnpty(result.errorMsg))+ c' q, i- X" |& ^
                            {" F: R) x5 l* \7 |
                                return;9 l9 V+ ^+ q# [" [
                            }
    8 D% \' C+ w' l  l# n/ j2 v( U" `+ ?4 _4 k( }+ |6 v0 j! y' r
                            textAppend("请安装新版微信,并在登录成功后点击【覆盖安装文件并重启】按钮!\n");& t& Q4 U6 |- ^0 G% Z
                        }0 {1 k8 z0 Z1 d
                    }.start();
    1 c+ U3 `2 [0 m5 u2 a4 h3 ^; h) K! e! q' @0 F/ }/ ^+ d+ J8 U, y* d
                }8 o1 C0 q" _3 Z. _, \$ K/ |
            });
    9 W; s% P) @7 {7 n, b0 ^; n+ c8 G0 [: ]: l. ]6 L' b7 f
    6 T- o: w0 i4 B% w# w
            ((Button) findViewById(R.id.button2)).setOnClickListener(new View.OnClickListener()
    # e5 X6 H# Q$ K" K% ?1 E        {
    # `: S9 b/ u+ i7 _# ?" [            @Override
    3 p8 W1 O& h; n8 E            public void onClick(View v)
    ; ~, S" a& Z! O            {
    ) F9 @9 v, {# X7 a, K! m6 r# v9 o7 E- O5 I1 n1 A% [0 Z5 V  C9 p
                    new Thread()
    & I7 p, L7 s2 U. n* \  \, P* X3 o                {' ^; F$ [+ {, F2 E: H1 R1 k
                        @Override
    7 X3 y6 Q- q8 @8 Q4 F% F, p- G: r1 t                    public void run()
    3 p7 [. U# C) w8 @2 ?1 ~% _1 s                    {
    % h: `6 K9 @5 u                        String path = getPath();
    3 |; {, o+ x- `6 L+ ^3 V) Y                        if (path == null): s& a$ c- m0 i* H/ l, q
                            {, }  ~" A* j, J1 K' x3 J* a
                                return;% A, U+ X' N( H
                            }
    * T$ R* [0 Z. l3 m5 R0 e- o) _
    ; x) s, o6 M8 G8 A' T  V  `                        textAppend("正在检查是否有备份的安装文件!\n");
    % @  r( A& v6 `3 h" _) S, |                        if (!new File("/data/local/tmp/com.tencent.mm").exists()), `2 N/ y/ ?6 {. T* ?  y9 _
                            {
    * r" s8 a! q/ l1 G3 L3 @                            textAppend("不存在备份的安装文件,请先安装低版本微信后点击【覆盖安装文件并重启】按钮!\n");
    * u6 u7 S! }& [                            return;% ]  r% p/ u7 b( e3 f7 u) c0 X9 X
                            }
    " T' t8 G6 _; c- h7 v- q, S& o' x
    ( t3 ~% p$ [8 `7 |/ T6 ^                        textAppend("已有备份的安装文件,正在删除当前的安装目录!\n");" M$ h% g2 Q3 T9 Q6 O3 J3 J# n9 K$ {
                            ShellUtils.CommandResult result = ShellUtils.execCommand("rm -rf " + path + "/*", true);( h# i7 J/ E0 y) c( Y* ?0 g2 D( t
                            putResult(result);* T( u$ H4 N. {) o
                            if (!isEnpty(result.errorMsg)). N+ G( t; i5 h+ Y
                            {. g3 s+ u( q" F- e6 J
                                return;5 J3 `. U$ v0 l: U9 k; [8 |3 O( i
                            }
    - u" \  Q& O' F. U9 y8 n* X. ?# P6 s7 S# @9 p6 a
    2 m/ P( ]% H) ~( B
                            textAppend("正在覆盖安装目录!\n");) ~% C9 Y( r, o
                            result = ShellUtils.execCommand("cp -af /data/local/tmp/com.tencent.mm/* " + path, true);
    9 L% A# r  n% P; i$ j                        ShellUtils.execCommand("rm -rf /data/local/tmp/com.tencent.mm", true);
    " q0 S7 `/ J* `/ f! y( p! K# P                        putResult(result);2 o8 z3 h+ c5 g; o7 A
                            if (!isEnpty(result.errorMsg))
    7 J7 V; @4 S' }  \                        {. U& q7 J! l/ C$ u' o. c
                                return;# M* q! b2 C9 s+ N" t
                            }) j. {# i' t) F# m( I" x

    / V9 H, x- E) A0 x0 P                        textAppend("系统将在10秒后重启!\n");$ O; ?% U: V4 Z, I* E

    7 s+ y% D* z. T$ [3 G, G( ]& |- }: N0 d
                            try3 ]( q* m% J: S
                            {) o/ B! r( u0 o$ p5 \9 Q; _
                                sleep(10 * 1000);
    , k$ ?- o% m1 E9 O1 ?                            handler.post(new Runnable()
    % v1 g8 S7 ^) h& L$ D                            {
    2 B! {8 ^5 {8 O0 q3 K) w% q                                @Override: _3 W  C8 y6 |" w
                                    public void run()3 j. @' n* x# a  f/ l$ H5 ~5 _& R
                                    {
    / c8 N7 b, q3 Q& p) @8 ~                                    ShellUtils.execCommand("reboot", true);+ }( |6 H1 R7 E; l0 b7 n) w
                                    }
    2 P5 O' q/ K5 u( C+ P                            });
    ; C- ~" n1 t; `  [# X                        } catch (InterruptedException e)
    7 G# e, W5 D0 U+ V  H, u                        {/ X3 Y9 o/ l7 x% O* [! `
                                e.printStackTrace();
    % }  y: O. k- f/ _                        }8 B, D& A4 s; h* L! r
                        }
    ' a" U- q$ G+ Y                }.start();+ {" l- v4 [' _3 U, [' c; m

    9 h. S! T$ _9 \$ }$ ^) R            }& ?% L4 s, s1 a$ A( M4 ^' c- ^5 g
            });) T& b0 E4 [; C

    ' \* b5 {( N" w$ e) a0 |8 w9 v: ]        textView.append("-----------------------------\n");9 o- `( [  o1 M3 `9 \  B- @5 a
            textView.append("该应用需要root权限!\n");
    / t: C9 ?* f; ^/ M3 |: F8 ~        if (ShellUtils.checkRootPermission())
    / d7 F3 o( [( s$ a% H" c        {
    5 B, l& j* z2 e& G4 H            textView.append("获取root权限成功!\n");
    ( `, h. T7 r3 P* f        } else
    # I+ a2 C) {" R        {' L/ {, r0 g+ J/ _
                textView.append("获取root权限失败,请在设置中授予权限!\n");4 E! U$ X2 q- m2 H4 h- P; X
            }  H! p4 q! S+ k$ e2 |' U
    ' V! W) ?6 y6 h, m7 }/ [6 e; Y
    3 K0 s) f5 I8 T; N( u/ Z. p
        }
    ! O7 X8 y- s2 J$ q5 ^: O* G}[url=][/url]! O+ H/ X9 k( C" P3 K$ M
    + U+ j! Y: d5 V  L2 u9 I0 M2 O

    4 g8 S' M1 r8 ]% Y& r8 ^
    运行如下:
    先安装旧版本微信,
    运行该程序,点击左边的【保存安装文件并卸载】按钮,
      安装新版本微信并登录,
      点击右边的【覆盖安装文件并重启】按钮,
      重启后重新输密码登录即可。
    : A4 ]# T, V4 i' ~# K
    完整代码 wxreversion.rar
    安装包在release目录中
    9 n  ]) T' z0 u  g/ Z8 l) Y
    分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
    收藏收藏 分享分享 顶 踩

    本版积分规则

    关闭

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

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