下沙论坛

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

QQ登录

QQ登录

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

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

[复制链接]
  • TA的每日心情
    擦汗
    5 天前
  • 签到天数: 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
    背景
      最近在弄一些关于微信的东西,测试过程中,本来打算强行停止后重新启动微信,结果手残点到卸载了。当我重新安装后出现了尴尬的情况,登录的时候,提示微信版本过低,需要安装最新版才能登录。
      

    ! e0 F9 {9 }* b9 }% E0 U
      但是之前做的一些东西都是基于老版本的微信,所以不能安装新版本,必须想办法在老版本登录才行。

    : ?+ i# L" [* B4 q操作过程尝试1、替换版本号
      最开始的想法是,既然要验证版本,那我就把旧版本的伪装一下,让它变成新版本的试试。
      但是,因为没有时间去仔细分析微信是怎么验证的,于是就抱着侥幸心理,写了个xposed模块替换版本号,
      一般情况下是通过以下代码获取版本号的:
    PackageInfo packageInfo = getPackageManager().getPackageInfo("com.tencent.mm",0);int versionCode = packageInfo.versionCode;String versionName = packageInfo.versionName;" c; Q. D8 r+ j- g  t0 V8 F
      所以去hook getPackageInfo方法,将其返回的PackageInfo中的versionCode和versionName替换成新版本的值就行,
      但是,由下图可知PackageManager是一个抽象接口,
      所以不能直接hook它的getPackageInfo方法,要先获取getPackageManager返回的对象的真实类型,先随便创建一个工程,通过以下代码获取真实的PackageManager类型,
    Log.v("test", getPackageManager().getClass().toString());* B5 L( w5 c% m" z- L. B: d; l. ~

    # @5 b1 Z' \3 \4 D# H查看日志,可知真实类型为android.app.ApplicationPackageManager,
      然后通过反编译最新版本的微信,获得versionCode和versionName,
      最后的hook代码如下:
    [url=][/url]5 F  M4 A$ Q% N4 Y4 O# K
    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]
    # N" H- [. [! \# j; @

    & x0 X) L7 {+ h& T+ n1 D. a( [. k5 }; E% E
      编译安装后重启,一边输入帐号密码,一边祈祷,结果还是提示版本过低,

    - N1 x/ ?$ \3 {4 M尝试2、pm uninstall -k 命令
      想着之前旧版本的都能正常使用,说明只要有登录数据,就可以使用旧版本的,所以想着先用新版本的把帐号登录,然后使用 pm uninstall -k 命令,卸载应用但保留数据,然后安装旧版本的。
      先安装一个新版本的微信,
      登录帐号,

    ) Y0 k7 z% I6 r# u- V& R9 C
      使用pm uninstall -k com.tencent.mm卸载后安装旧版本的微信,
      结果打开还是不行,还是提示版本过低,

    : j0 @) s* K+ P) g
      于是怀疑卸载的时候数据被一起删了,根本就没有保留,再次执行pm uninstall -k com.tencent.mm,查看data目录,微信的目录已经不存在了。
    尝试3、adb install -r 命令
      同样先用新版本的把帐号登录,然后使用 adb install -r 命令强制安装,结果还是不行,不能安装比当前版本低的,,,
    * ^0 I4 _' X( R7 t6 n! n4 p
    尝试4、替换安装目录
      既然用 pm uninstall -k 卸载时保留数据不行,那么就尝试手动替换。
      首先安装低版本的微信,把安装目录复制一份,然后卸载。
      再安装新版本的微信,并登录帐号。
      用之前保存的旧版本安装目录替换新版本的安装目录,然后重启手机。
      重启后提示登录错误,重新输入密码即可,
      不知道为什么,这个手机在我写这篇博文的时候,关于微信的页面还是新版本的版本号,而我之前弄的另一个手机就是真实的旧版本号,
      但是这个手机系统设置中微信的版本号已经变成旧版本的了,也不影响使用。
      另一个手机的,

    - p1 L% G+ ]$ W* c6 y自动化程序
      把之前替换的过程写了个自动替换的程序,代码如下,其中使用的ShellUtils在之前的一篇【Android手机插上usb能充电但不能识别的一种解决方法】能找到:
    [url=][/url]+ y6 u! P* J( q4 o. [
    package com.example.wxreversion;1 D; D% h3 C1 B' v0 _! H# S( m

    , N( o4 y! z3 \& X5 ~. Z6 }import android.os.Handler;
    " ^$ s/ [2 z7 V7 d  ]1 [import android.support.v7.app.AppCompatActivity;
    . f1 m+ y  l- N: V) cimport android.os.Bundle;
    9 v; v3 g# a$ W0 c4 B6 v& uimport android.text.method.ScrollingMovementMethod;
    ( P0 Y% k1 g5 m6 p- P7 d5 ?import android.util.Log;4 z) a6 r& z1 b7 K
    import android.view.View;! Q4 e8 Z# T, K/ @. X5 L
    import android.widget.Button;
    ' @- A" U* m  H8 z, d7 Eimport android.widget.TextView;
    # f/ i5 {4 x/ z4 \  J
    . O  w; A" J. {. U( ^8 v, qimport java.io.File;) v9 g9 r+ x! L& [

    : a7 t6 `1 N* ~# wpublic class MainActivity extends AppCompatActivity/ k" C9 s( L. R
    {& ?  K3 L. v3 F  T- U
        Handler handler;; p- {6 ?! E5 h7 W
        TextView textView;
    * Z2 t  o9 F  E8 D( d: W
    * {3 [1 P) h; P
    - z; D4 X6 p5 Z6 E! X! F    private void LogV(String s)
    ; N; E5 N7 |7 w1 t    {9 q1 Z. i( s- o& L0 Z" \
            Log.v("test", s);
    5 O. h7 [+ E8 t* Z* X8 q9 P" f    }
    + v% @; I" C9 Q$ r3 I' s% U$ ~3 s9 C" y7 U- x* H4 K
        private void textAppend(final String s)# }+ @) b: m) S: ]9 W
        {
    8 ~3 e4 x( [8 D5 X0 N  j. }8 D/ B+ g. z        LogV("textAppend:" + s);
    ! J6 f1 ~. q) u# f        handler.post(new Runnable()2 l$ L& Z7 q4 a, F7 |
            {& c: A" s* G) F7 L2 O9 A0 h- {; ]
                @Override
    # n# u7 z  Q* l; F+ h/ p& F            public void run()8 g$ ?3 w+ n! ?! t
                {( i, t( t0 g) ?5 `
                    LogV("run:" + s);
    $ v( G8 Z2 }* {7 {8 X
    0 @9 Z' k5 g( Y                textView.setText(textView.getText() + s);
    ; e2 M( g5 U5 K6 I6 C9 C3 _* Z5 I            }
    & H2 c4 Y1 |5 k5 b5 y- _        });
    : g4 r6 H! g3 d# p* ?4 @    }/ K# e; X2 M9 ~" ]; q! O

    6 b( s7 Y: R( b3 f1 C, n; k, X    private String getPath()
    ! V" E  m! X5 n6 e9 t3 z: Z- F- v    {
    * t8 ^, n8 b9 L0 T- m  \1 {3 M        String path = null;" D& e- f: X  }7 a
            textAppend("-----------------------------\n");8 o" o6 [1 s8 d7 B9 H* W' J* D

    % X0 M4 V7 @" i$ {+ D7 K( X
    9 J6 C( T* q8 m3 m% f& |6 }        if (!ShellUtils.checkRootPermission())$ U2 A& P1 r3 d( G" P* x
            {
    1 {; B) ?* O1 |2 F% P            textAppend("获取root权限失败,请在设置中授予权限!\n");: `2 O( q" n, Q4 v; l5 K' m
                return path;
    . b- T- M/ p3 R$ o1 r4 P; @7 X        }0 Q$ I2 N& I  o# f. \6 V; }
    4 v8 Z  @- l$ Z# a
            path = ShellUtils.execCommand("pm path com.tencent.mm", true).successMsg;$ b, c* S/ Q5 a6 O  q
            if (path != null)3 O, |6 \, ?% P4 z+ b
            {
    ' I' Z* D5 b) A: H, O            try
    ; Q& ?, Z3 X$ V1 x- S6 g8 h5 T            {/ q% C' M- T, X6 y
                    path = path.substring(path.indexOf('/'), path.lastIndexOf('/'));
    7 [5 s$ f3 r. z9 R4 V" B3 L            } catch (Throwable throwable); s. P9 f% i1 q+ N
                {
    & }. k2 I+ J% T8 r' T! f& B                path = null;
    1 [* G8 T5 g- ~5 h- v            }3 _) f! r1 z. l$ f/ H: j
            }0 r3 R& V  A5 J, J$ ?1 \  v/ W

    / H' w1 ^& M" A! X        if (path == null)
    , @. d8 u1 a+ I2 [7 K9 [        {! L. Y2 `6 N4 y1 Z
                textAppend("未找到微信安装目录,请先安装!\n");6 F- y6 \- c( o8 I
            } else
    5 B; l# k' c) O- O5 e& j3 _        {
    ) c$ l3 k5 f+ `; z% n            textAppend("找到安装目录:" + path + "\n");
    / _8 b. l9 S6 F5 P% W0 u        }$ e* H+ l* u3 u3 l

    + N, c. p  B2 B0 L5 e        return path;
    4 C6 |  n5 _8 t- ~% s7 q, }    }5 z; j- l7 g# ^8 h( D& a8 X* ^
    ) |" w2 r- |0 t  l9 ~0 |
        private boolean isEnpty(String string)# z: z7 l5 v$ T# [
        {
    9 F# J, z! T8 L4 b        if (string == null || string.length() == 0), p( f& b/ \( I' q0 [
            {
    , g" {3 }5 q; \# m/ h' ^            return true;
    " x7 y8 a7 i2 u/ ]& h* a        }3 @+ W1 P2 w8 A
            return false;
    ! i! m: G$ B9 l! I" d, C    }6 A# {# R: j* w9 F7 o
    ! r+ |4 B" H, Q0 C5 d& Q% A
        private void putResult(ShellUtils.CommandResult result)
    . u3 Y5 C! c: P! B+ C* s: h    {
      a+ k, U5 Z: w% Y! i2 O5 C        textAppend("返回码:" + result.result + "\n");, G7 u# X$ D: O" M( M5 F

    $ R% U2 c* d; S$ S        if (!isEnpty(result.successMsg))" ?1 y, c) h$ [2 m! O
            {  m0 B2 _- _! \7 V- b' u1 E( ?7 i
                textAppend(result.successMsg + "\n");, t: p2 I3 ~  S  ]
            } else if (!isEnpty(result.errorMsg))' r" N# d5 G( r" L% o; B4 A- Q% c
            {$ W3 d. H6 D3 t/ @" k, W/ B
                textAppend("错误消息:" + result.errorMsg + "\n");
    # Z/ K: U: k$ j        }% r* q7 G& L0 s1 w
        }+ H* q9 N; I% @- ^

    ; v- U8 e/ I  C4 ~0 ^! V4 ~5 X    @Override' B  I% D( a6 i& [% \  ~) b1 A$ _; c
        protected void onCreate(Bundle savedInstanceState)
      @# @% a/ n& X9 e/ V5 L1 ^    {
    6 o5 @: Z6 C% ]: o" x6 {! N        super.onCreate(savedInstanceState);
    ' K, F, v" r7 k5 b- c) e        setContentView(R.layout.activity_main);
    8 H$ V+ W$ l. Q0 f. W        handler = new Handler();
    1 A! n: I) H1 c/ n" v/ z/ V' g- \1 F9 u  |, n/ A: ^* a
            textView = (TextView) findViewById(R.id.textView);" \8 \8 J1 Q3 j+ i
            textView.setMovementMethod(ScrollingMovementMethod.getInstance());% d, `# c: d2 `" N* n; T6 \+ t5 x

    , C* M9 r$ L5 N5 y3 y        ((Button) findViewById(R.id.button1)).setOnClickListener(new View.OnClickListener(): c* E/ H7 C& Z: b
            {
    * W) Z) X3 d3 \6 j            @Override
    2 C2 w( `: N; O8 a            public void onClick(View v)
    " Q" {/ Z9 {4 Z' L5 c. v. F9 S9 ~            {
    ' C& J( i" R0 y9 i7 Q9 z& ~6 y. i5 z3 J) e2 q- h7 }5 H" x8 L
                    new Thread()0 o2 \0 E) p4 q2 ~* q9 W2 _
                    {
    3 I3 z$ `4 N' O3 A                    @Override
    9 y; f, v3 V6 Y% Z- Z                    public void run()
    2 X- M9 k; y* C. F4 B                    {
    0 O6 c+ {5 s9 m) C- W0 e* j                        String path = getPath();
    / H1 z7 ]  {  Q! g- W& k                        if (path == null)2 A9 ~8 A" r' }' n0 \( E) n- v+ k5 O
                            {
    # a* r( z; f7 h: B/ w- r% @- r                            return;3 [" k9 M2 E+ C' _5 @: Z' u; C- A( x& Z3 J
                            }/ J' L  f3 e1 J. G# R" i! _* A
                            textAppend("正在保存安装目录!\n");! D" g' C. d6 K
                            ShellUtils.CommandResult result = ShellUtils.execCommand("cp -af " + path + " /data/local/tmp/com.tencent.mm", true);- G0 H5 j4 x5 n, `1 p
                            putResult(result);" H3 ?7 Z( E  ?0 L& p5 \: v
                            if (!isEnpty(result.errorMsg))4 z/ k/ i) |$ E( T, o$ c
                            {
    ' h, x# V- Q4 p( p                            return;
    + ~) o% `2 V2 o( S3 C3 ]                        }& ]4 S1 u6 H8 {* B' c6 b0 l, c

    - v: [. O; n* e$ r5 ]4 _& v                        textAppend("正在卸载微信!\n");
    3 u; @3 h0 r3 G* {) q                        result = ShellUtils.execCommand("pm uninstall com.tencent.mm", true);//-k无用
    # i2 ]7 R7 B  p9 b3 e% u# k" N                        putResult(result);
    , ?  \# t* v, C; B                        if (!isEnpty(result.errorMsg))
      u/ K+ k( f; w                        {
    : U, D8 H6 a7 ?. Z0 @$ U2 `                            return;* z( V) p* e" c
                            }8 q: c$ ^7 ]% I' Z+ w5 s7 Q

    9 p: }: n" B' S. u                        textAppend("请安装新版微信,并在登录成功后点击【覆盖安装文件并重启】按钮!\n");" W: }- }$ \. ^" R9 [$ w, v. J8 E. B
                        }! A. Q& L) v% i" ~
                    }.start();7 _8 k7 x8 O6 J+ d

    + i% }8 v! |! `2 H            }! D+ K% V8 d  G1 w! e
            });6 W' a5 O. y* O
    $ r+ m4 n' @: f2 O0 W! @5 z# s
    ) v( [2 `3 m7 }& X7 ]5 \
            ((Button) findViewById(R.id.button2)).setOnClickListener(new View.OnClickListener()6 p, s: M5 ]' q
            {
    " J0 l% i! b/ `; r9 P2 k, R( v            @Override
    . d# b4 p; @0 b  \            public void onClick(View v)
    . [8 P) {0 {& Q, p3 P. q            {
      D5 a: ~; o1 |8 G2 Z+ A
    " N; S: G% b/ K2 X' N& e/ |8 \                new Thread()
    0 U9 D- y7 v* C! A4 b8 o                {
    ) Y# @' e, a1 c$ {" U7 U, p                    @Override
    & _5 Q! l( w" u  X# w$ c                    public void run()
    2 {3 B' N) z/ F                    {$ p9 h/ b9 Z- |/ T
                            String path = getPath();
    5 T* O: ~9 @) g                        if (path == null)* o, p/ N  i( d0 }' R
                            {+ k+ B/ @/ R! V
                                return;% P) t. n: J0 a) D
                            }+ X) S! ]2 k9 M  A4 S) ~+ a$ s' N

    9 y! F! S: M7 x' F! c                        textAppend("正在检查是否有备份的安装文件!\n");1 N5 {/ S- f% S
                            if (!new File("/data/local/tmp/com.tencent.mm").exists())+ s7 U9 S4 ?: K4 V( c& q
                            {% m5 S1 d' E6 y# a4 n! k
                                textAppend("不存在备份的安装文件,请先安装低版本微信后点击【覆盖安装文件并重启】按钮!\n");
    2 S. _2 `; X+ ]! i- G' @) T) }                            return;
    3 L8 A& C! {( X+ @+ ?  q+ ]+ f                        }, ~6 l3 Q" x8 A* r$ L- Y, J$ Z
    6 d/ s* Y  M. s. e' I7 n! f' H
                            textAppend("已有备份的安装文件,正在删除当前的安装目录!\n");; k/ r; f3 V0 R  J: d. L: x
                            ShellUtils.CommandResult result = ShellUtils.execCommand("rm -rf " + path + "/*", true);
    9 @# x  B! M+ L- v7 U                        putResult(result);
    - ?8 t- ^( a' S% \3 ]8 b                        if (!isEnpty(result.errorMsg))! r) a$ n* `$ n9 Q6 s
                            {
    6 g, @. k* ?, c4 s- Q2 Y" i                            return;
    0 u4 @( R. X; K+ J6 f                        }
    7 Y/ {& b" Q) X3 ~( i9 K
      M6 @3 Z; T' I  K& m5 w
    $ L8 G0 y& N7 }8 p: ]. d2 R                        textAppend("正在覆盖安装目录!\n");
    ' b- V  _  x  g& v* i. w                        result = ShellUtils.execCommand("cp -af /data/local/tmp/com.tencent.mm/* " + path, true);3 h8 U: p0 L- M
                            ShellUtils.execCommand("rm -rf /data/local/tmp/com.tencent.mm", true);
    ( I8 s0 D0 y" _! P3 n: b) q                        putResult(result);' E. u, q2 s. A
                            if (!isEnpty(result.errorMsg))0 C( f0 q" H1 w) ?7 A9 I
                            {
    2 |, u) X) w3 P2 \$ a& }                            return;; f( G& g4 ?/ G" b- ?* C  r
                            }& a8 u1 s% l5 y, i2 I5 y/ X  S% M- S% N

    8 q+ D3 W0 m. @0 f) j6 k1 t: y                        textAppend("系统将在10秒后重启!\n");; }% E" @: j* N* `

    ' O7 @# _9 i+ S8 j. a9 Y8 e- x. N- }# o/ w
                            try2 h' `2 F/ S4 L0 c
                            {
    $ X5 o# W0 B; P! [/ B6 L                            sleep(10 * 1000);
    - Q1 P7 b4 n, P* L9 u6 b                            handler.post(new Runnable(): v: k  V$ z1 z, L
                                {
    8 w1 q, U$ s4 Q: |! i9 j                                @Override4 ~  _$ R( [% U6 U" U
                                    public void run()
    * L& u; S' E1 o7 |. N' x0 U5 Y: c                                {
    4 b3 P' x2 ^' e% O- [                                    ShellUtils.execCommand("reboot", true);
    2 m) m# T/ V( q2 A% m* l                                }/ G: n/ t! z* K$ R2 ?
                                });
    0 O& ]" [, N$ K2 {0 T; |1 k' B5 N                        } catch (InterruptedException e)
    * c& J; l1 ~0 r% o7 \6 p                        {5 u5 y9 Q% J3 }$ e$ c) n+ x. ^
                                e.printStackTrace();
    ' x& z% @9 l, y                        }* r5 X7 E/ ~* H1 L3 ]+ S+ a
                        }; J* a: W8 L+ p" M0 t: b2 v
                    }.start();
    ! B4 k' s8 M5 y7 K
    ( K2 ^4 n, }3 z. L4 |1 `  e            }2 T# `* ]. h, M! H" u3 |
            });4 m2 {9 C- A! d4 J& m

    8 b! r; U* G3 F        textView.append("-----------------------------\n");; W" f0 K6 S2 C+ r
            textView.append("该应用需要root权限!\n");6 [2 ~# Z' q# y3 O- a( Q
            if (ShellUtils.checkRootPermission())1 Y& [6 z) D, @
            {: K0 ]- E3 T. N# W4 b
                textView.append("获取root权限成功!\n");
    1 N& R2 ~$ p% z$ ^        } else
    6 Q% M. a3 Q: s4 M( V) S" U$ A        {3 V. l  A' `: u
                textView.append("获取root权限失败,请在设置中授予权限!\n");
    ( k1 ?6 Z/ T' v* V* ^        }
    0 D& y" V$ J5 `7 T$ h2 J8 ]% G' s( q/ `

    % r0 b6 ^: \6 z3 m3 J    }% P8 K- N3 C) u+ u( l5 F* I
    }[url=][/url]6 A& ?/ d8 H2 k$ Q" ~
      c( p; |& ^, i
    0 t' Q8 N0 R$ `
    运行如下:
    先安装旧版本微信,
    运行该程序,点击左边的【保存安装文件并卸载】按钮,
      安装新版本微信并登录,
      点击右边的【覆盖安装文件并重启】按钮,
      重启后重新输密码登录即可。

    - y; c. |% ~0 Y" f& o! }
    完整代码 wxreversion.rar
    安装包在release目录中
    2 ~: N! w1 [+ q0 i$ n4 V. [) H, E
    分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
    收藏收藏 分享分享 顶 踩

    本版积分规则

    关闭

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

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