下沙论坛

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

用新浪微博连接

一步搞定

QQ登录

QQ登录

下沙大学生网群8 QQ群号:6490324 ,验证:下沙大学生网。 欢迎各高校发布社会实践活动,请尽量直接发布,怎么发帖请点击...
用手机发布本地信息严禁群发,各种宣传贴请发表在下沙信息版块有问必答,欢迎提问 提升会员等级,助你宣传
新会员必读 大学生的论坛下沙新生必读下沙币获得方法及使用
查看: 1172|回复: 0

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

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

    [LV.10]以坛为家III

    发表于 2019-12-17 09:43:25 | 显示全部楼层 |阅读模式
    设备要求
      已root的Android手机。
      注:下面使用的两个微信安装包,com.tencent.mm.apk为旧版本6.5.16,weixin_new.apk为新版本6.7.3
    背景
      最近在弄一些关于微信的东西,测试过程中,本来打算强行停止后重新启动微信,结果手残点到卸载了。当我重新安装后出现了尴尬的情况,登录的时候,提示微信版本过低,需要安装最新版才能登录。
      

    4 \4 `. Y* c$ H: c, B+ R
      但是之前做的一些东西都是基于老版本的微信,所以不能安装新版本,必须想办法在老版本登录才行。
    4 \+ V2 \9 v& O: r. F& I6 ~; Q
    操作过程尝试1、替换版本号
      最开始的想法是,既然要验证版本,那我就把旧版本的伪装一下,让它变成新版本的试试。
      但是,因为没有时间去仔细分析微信是怎么验证的,于是就抱着侥幸心理,写了个xposed模块替换版本号,
      一般情况下是通过以下代码获取版本号的:
    PackageInfo packageInfo = getPackageManager().getPackageInfo("com.tencent.mm",0);int versionCode = packageInfo.versionCode;String versionName = packageInfo.versionName;
    ! j7 c, G* R4 Y2 D9 q) T1 t: y
      所以去hook getPackageInfo方法,将其返回的PackageInfo中的versionCode和versionName替换成新版本的值就行,
      但是,由下图可知PackageManager是一个抽象接口,
      所以不能直接hook它的getPackageInfo方法,要先获取getPackageManager返回的对象的真实类型,先随便创建一个工程,通过以下代码获取真实的PackageManager类型,
    Log.v("test", getPackageManager().getClass().toString());! m7 |, Y3 n" ~5 A" N! c

    9 Z) e/ z0 i  I% A4 |查看日志,可知真实类型为android.app.ApplicationPackageManager,
      然后通过反编译最新版本的微信,获得versionCode和versionName,
      最后的hook代码如下:
    [url=][/url]
    9 F5 M" R! M# _* r+ h& nif (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]+ U; D, x7 b# E6 K' ^$ K, Z

    3 X9 D% O, Y1 e! Q, Y  [# z. H. }& H/ \! i# Z" ~
      编译安装后重启,一边输入帐号密码,一边祈祷,结果还是提示版本过低,

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

    9 x% g) j0 q) n: f
      使用pm uninstall -k com.tencent.mm卸载后安装旧版本的微信,
      结果打开还是不行,还是提示版本过低,
    6 M/ }; F5 }( b/ ^7 c9 v8 R
      于是怀疑卸载的时候数据被一起删了,根本就没有保留,再次执行pm uninstall -k com.tencent.mm,查看data目录,微信的目录已经不存在了。
    尝试3、adb install -r 命令
      同样先用新版本的把帐号登录,然后使用 adb install -r 命令强制安装,结果还是不行,不能安装比当前版本低的,,,
    2 b; s$ P" r" d
    尝试4、替换安装目录
      既然用 pm uninstall -k 卸载时保留数据不行,那么就尝试手动替换。
      首先安装低版本的微信,把安装目录复制一份,然后卸载。
      再安装新版本的微信,并登录帐号。
      用之前保存的旧版本安装目录替换新版本的安装目录,然后重启手机。
      重启后提示登录错误,重新输入密码即可,
      不知道为什么,这个手机在我写这篇博文的时候,关于微信的页面还是新版本的版本号,而我之前弄的另一个手机就是真实的旧版本号,
      但是这个手机系统设置中微信的版本号已经变成旧版本的了,也不影响使用。
      另一个手机的,
    " ~, F, H8 \0 ^# p3 T( h1 A& V
    自动化程序
      把之前替换的过程写了个自动替换的程序,代码如下,其中使用的ShellUtils在之前的一篇【Android手机插上usb能充电但不能识别的一种解决方法】能找到:
    [url=][/url]
    0 v$ {5 M, B! \% jpackage com.example.wxreversion;
    5 l4 c# B/ a! z1 V8 c  O7 P% U* C2 ^" y- ~6 Z
    import android.os.Handler;
    % |' P, J$ d4 T& Y! Bimport android.support.v7.app.AppCompatActivity;
    ( t; a8 ~0 Z$ Y1 I6 C! kimport android.os.Bundle;1 c( h7 N1 e4 U- Z
    import android.text.method.ScrollingMovementMethod;% C* ~( ]$ I* S3 L; _
    import android.util.Log;4 w" S+ ]+ t' S8 w; c
    import android.view.View;
    + C' C! x; B# \% wimport android.widget.Button;9 R7 j* M6 ^+ c- W. f
    import android.widget.TextView;0 J) }9 m' J7 [6 X- r2 `8 Q* [
    ! [( L1 T3 @9 t: C. V4 m7 _9 I, t7 t/ ~
    import java.io.File;
    ! y4 v/ P2 g5 q) Y: o+ ?
    ) P* U! l+ T: bpublic class MainActivity extends AppCompatActivity# e% `9 U& l* p
    {! @# @  T: D! h3 o& X5 z
        Handler handler;
    2 f) G4 Y" P( g0 V! u% X) l    TextView textView;: E2 G; `& A* g8 [3 j' n5 u( d* V

    , T$ M6 A" M2 ~5 X  m
    1 T' l, Y7 A2 M5 P    private void LogV(String s). n, |& u$ z$ i* g& M8 m
        {% U- }1 ~: v0 U& N) f' F) C
            Log.v("test", s);
    7 P* d" M5 Y# z    }- G- w( E' N1 m* C. y! _* Q3 o

    : ]/ v- K4 ~, j# H& K  S; m    private void textAppend(final String s)
    % X* f7 e- q  c+ Q, y; I    {8 {* h3 X; ]$ Z" {2 Y! G
            LogV("textAppend:" + s);
    4 I/ G. t4 x- I$ Y        handler.post(new Runnable()
    " v4 @" S: ]1 |% @: c4 E        {
    8 k; V- Q  J' z! H9 c9 Q            @Override
    8 H6 ?5 G/ v8 K- B1 }1 q2 N5 ~) _            public void run()
    7 P7 Y% w2 t  E- a" R            {
    $ L. Y7 c- e6 R4 b; g4 Y7 B                LogV("run:" + s);" T: o0 O1 }, q% X& g6 R

    8 K$ p6 C1 {3 D8 V- f! A                textView.setText(textView.getText() + s);
    . L# B2 G# p0 J, r& b, D$ C3 K/ c            }: c9 c  S% [. u7 g; U
            });& F" K2 U, ]& }% L1 n! ?
        }- k' B% P* j" ~
    " c( s7 H, B) r* |# Q" ^
        private String getPath()
    9 q0 [( j- m( R& l: m5 \    {
    . d9 Y) z7 }: b2 L4 M" m# A        String path = null;
    0 x; G$ V$ |" n/ o, j        textAppend("-----------------------------\n");
    ! E0 R( m9 H0 f3 H. O- h
    $ ~3 @* ]  [, o# i0 r
    , f) [: f+ e  p* }        if (!ShellUtils.checkRootPermission())
    4 ?0 @4 ~7 D- Q2 W6 Z1 U6 _        {% j$ f/ T; `3 ]8 a. y5 q; y+ Y
                textAppend("获取root权限失败,请在设置中授予权限!\n");
    1 j$ h# t. s2 e* K) p& y            return path;
    ) Z5 q, `. q7 L& z- C9 J5 L        }: f" P( y7 |9 C0 {
    9 I. q/ t0 K4 h  L
            path = ShellUtils.execCommand("pm path com.tencent.mm", true).successMsg;
    $ y3 d  R1 T. `5 ~( W2 W5 S        if (path != null), t% U9 p0 y! D: H0 M% q
            {) w, Z2 x& V, F
                try4 r) |9 M, `! r; u
                {
    + O! z2 ~  H5 N7 i" n  ?2 F5 k, v                path = path.substring(path.indexOf('/'), path.lastIndexOf('/'));1 E, u8 o; D4 G, C8 F' ^, B
                } catch (Throwable throwable)
    ! t# M, s0 }- ^. n  q: n            {
    : J0 V4 ?% H+ T% P0 K' m                path = null;
    $ @! N6 `) f0 S( K            }6 B6 O+ A+ b' E
            }
    - |4 ]! C: _1 f7 d( Z% ~
    4 U  L! Z; _+ F6 r/ b  M# o        if (path == null)
    : w: P/ s. g5 n: t( L        {
    4 i( n* m# i! `0 B' H. b( }            textAppend("未找到微信安装目录,请先安装!\n");, C% E' s( X1 V4 ~, y; y
            } else7 h/ H. i: [' c9 ^" _( l' U% ~
            {
    / s. ?& @; m- O- r: c            textAppend("找到安装目录:" + path + "\n");& V- ~. w! \6 E) |: u
            }
    ; n# m( z0 O6 V, N
    % y0 ^4 |6 E6 C/ |! j  g4 y- I" q        return path;
    + B) _: B' g* a    }
    ' l, J0 u6 X" S* w4 ?
      m+ f+ y7 I, ~$ c, m3 f    private boolean isEnpty(String string)
    7 U2 n7 O" U* O    {
    & v0 o4 n3 O, R( b4 k, y3 s- P" `1 f        if (string == null || string.length() == 0)6 _! j3 N: A# _- t$ P  b+ S
            {
    0 k8 [5 O6 {. V3 Y( h            return true;
    : i: R% f1 j* C. J  o& N( f8 n        }3 `/ f0 H, e4 `
            return false;
    " k5 J6 b$ ]( X" H    }
    , W/ \/ c! s+ V& o$ T8 z% Q0 _- A$ Q% r4 D% q$ C! ?
        private void putResult(ShellUtils.CommandResult result)% i0 K  U* T2 N. L+ o
        {
    $ o; a  M1 f. P/ F, p        textAppend("返回码:" + result.result + "\n");2 q3 b/ s1 y0 i, q7 G! K2 ~9 a) I

    % i) A# d. K/ o2 P        if (!isEnpty(result.successMsg))3 ~6 A) W1 T( M5 c- h4 A
            {
    4 b- Z. L' g0 C3 q- _1 Y' i) }            textAppend(result.successMsg + "\n");' i/ X% j0 A& v- }
            } else if (!isEnpty(result.errorMsg))
    ( _6 I- q$ P( P$ L% {        {
    1 k( J5 M- A- g" f8 A            textAppend("错误消息:" + result.errorMsg + "\n");
    1 v5 p& v6 X+ M% v        }
    : X( |  w0 m: @$ r; X5 l    }0 y  I6 D* e3 T/ }  m! h( G# u
    # S0 c! l" K! j& W& j5 L% c
        @Override& A9 F$ B( Y& N0 g* S' S3 f
        protected void onCreate(Bundle savedInstanceState)
    # g0 u, J; C/ B" W1 L    {- Z' r/ z0 p6 u; f
            super.onCreate(savedInstanceState);/ l* q3 B% W# {9 S
            setContentView(R.layout.activity_main);% x; k( L; y8 F! ?
            handler = new Handler();6 Z5 W0 @. f! H' N

    * h! c3 }0 {; g: F0 B2 F4 H        textView = (TextView) findViewById(R.id.textView);+ h7 z" t2 i& J1 Y% U7 A8 P
            textView.setMovementMethod(ScrollingMovementMethod.getInstance());
    ; [, ]9 D$ f; X' o
    % y" e5 _# A$ Y  ^& e5 F6 i        ((Button) findViewById(R.id.button1)).setOnClickListener(new View.OnClickListener()- U' ?& G1 |) N$ M" K/ H, R
            {
    # [, J3 J, C5 f            @Override
    8 C" L, B9 z1 Q$ Z* e& v            public void onClick(View v)- i9 z; D& Z) g+ ^# z7 e
                {. c% A3 I; ?' Y* F% |3 I" K3 b
    7 v1 q( ?" {$ u* _0 h1 V
                    new Thread(): L5 z: g0 A0 o
                    {
    . _3 f" m& a8 A$ ^7 a                    @Override2 V: S# O% P: l. \
                        public void run()
    . N6 U1 C. _5 _/ N" z                    {9 n) \0 j# [9 h! s1 G( b: y
                            String path = getPath();; ?- @5 A( I( `2 X' D* q
                            if (path == null)
    / o" |4 ^/ W  R" j; U0 {7 F5 I                        {6 Y5 |/ T' y+ o2 _
                                return;9 f# r! J" I5 e9 N
                            }
    9 s) _: d) }: G                        textAppend("正在保存安装目录!\n");! D0 s: [! ]5 E& `9 H
                            ShellUtils.CommandResult result = ShellUtils.execCommand("cp -af " + path + " /data/local/tmp/com.tencent.mm", true);
    ! `, V/ [/ {: u9 v                        putResult(result);
    " M0 c2 X, u+ X: L: A                        if (!isEnpty(result.errorMsg))
    9 C+ n+ \' \5 h# F+ m                        {
    ) P! }) ~% i; k$ M1 e1 l                            return;
    ( Z; y  z* @" c- P+ L* f                        }
    5 f/ f; k4 n4 f
    : A+ }4 Y7 f; R: ?                        textAppend("正在卸载微信!\n");
    2 b! U0 `" [8 F7 L2 \4 }# b* ]                        result = ShellUtils.execCommand("pm uninstall com.tencent.mm", true);//-k无用$ D8 k/ ?7 b( m$ e
                            putResult(result);' _% S1 C: x1 l( m8 U
                            if (!isEnpty(result.errorMsg))
    ( z" `" E% w9 P6 G2 G7 [: }                        {
    5 j7 z% A, d2 G) C4 t9 ]/ r8 c5 {; j                            return;
    8 y$ F; {* M* U) ?' |' _1 n: Y! F                        }  f8 ]& q9 t4 v# ?

    * i0 m, J4 k5 A) T( F                        textAppend("请安装新版微信,并在登录成功后点击【覆盖安装文件并重启】按钮!\n");5 H# @! B2 u6 b- T6 R( c
                        }
    ( |; s- }- p! ~) j  E9 G                }.start();" ?. O; N% L7 V" Z# }

    " _; X" C; m  E& V( c( q! e  y            }1 Z0 ~/ Q" z% J8 u( n
            });
    4 j$ x+ p  c1 a
    7 l% O% P% a: k6 x; v; G+ Y, a- Y* f, B) z* Y. X/ v+ \
            ((Button) findViewById(R.id.button2)).setOnClickListener(new View.OnClickListener()
    2 G1 d/ p- N- |- }9 e# S        {
    $ Q4 M% `- S0 y& f* {, Q            @Override
    6 j  _! y+ P3 G: L1 U9 ^  e6 M6 a            public void onClick(View v)2 H; z- P' U" ?* O4 S+ M3 _) G- X
                {
    - U2 n. Q% {; S
    1 V+ p6 ~( f& X& R- _1 I                new Thread()
      |6 H( x4 S9 h: r) W3 [                {$ o0 H1 y3 @$ q
                        @Override
    9 M' n) j6 N" y3 o$ o* W                    public void run()4 P& P1 k5 |, }3 H; L2 c8 ~- h
                        {" l0 G1 ]3 p9 w5 Q6 e. M
                            String path = getPath();, g3 n, Q! f; b1 R* ~5 t
                            if (path == null)5 r* x! A0 m6 `& A7 I. L5 ]# [
                            {
    $ l( k) t8 t  e: V  G                            return;2 C7 j% E1 c8 |# e/ D; |) q9 z
                            }3 E8 p# N5 H0 }. I( s& i

    * _% `: V* H# ~5 |1 x0 z7 H" j                        textAppend("正在检查是否有备份的安装文件!\n");
    2 \+ _7 \# I; |" _6 Z0 u                        if (!new File("/data/local/tmp/com.tencent.mm").exists())
    ! i! j$ d& F$ m! t$ r7 M5 @                        {9 p( @! \  E4 ^
                                textAppend("不存在备份的安装文件,请先安装低版本微信后点击【覆盖安装文件并重启】按钮!\n");' E& b- t: q- a8 U7 `4 \7 [
                                return;
    9 P, C2 v+ T+ k" W                        }
    7 F  Y7 E( Y. M6 Q- I1 a) b2 q, R4 n! w' \3 |
                            textAppend("已有备份的安装文件,正在删除当前的安装目录!\n");5 y0 k. |- |4 e# x) _
                            ShellUtils.CommandResult result = ShellUtils.execCommand("rm -rf " + path + "/*", true);
    4 V/ ~) F+ a- V. v                        putResult(result);0 Q7 d/ e- O# t  _. F
                            if (!isEnpty(result.errorMsg))
    $ c5 u/ n1 `  `                        {2 K4 [6 P% e+ T3 k$ T% l
                                return;
    , a& x' e8 H$ ?5 o) u                        }
    - H3 k# g# G% e; b- w$ U
    " R7 y+ S& m( d8 ~+ c/ w' Q2 q  ?  f3 ~9 `! ]! _" [* D+ L
                            textAppend("正在覆盖安装目录!\n");
    . |+ ]1 ?+ g1 G! u2 D' \9 d$ ^                        result = ShellUtils.execCommand("cp -af /data/local/tmp/com.tencent.mm/* " + path, true);
    5 h3 y; [$ w: H  m4 A, h; r                        ShellUtils.execCommand("rm -rf /data/local/tmp/com.tencent.mm", true);- y6 m0 \' d0 h$ x3 _  }
                            putResult(result);; y: k" K" u# W' n6 O
                            if (!isEnpty(result.errorMsg))8 Q' B5 U1 F8 I  R7 k9 D7 L' K6 y8 k
                            {
    / C8 y3 F7 h8 H0 P% P                            return;+ |0 Z2 e2 b( B' ]# _5 J
                            }
    ; I* h/ K- L, e- w) V0 n7 V. C
    1 h- t! L" p- R: `/ `' B                        textAppend("系统将在10秒后重启!\n");" a2 ^, o/ @+ Z) O+ P# I

    , ~$ X2 C: A' K2 i7 y- j) Y& v0 ]- p) A
    1 [5 F5 K0 m2 l0 b                        try: ?: d+ G1 ?& g1 @6 Y7 B& v5 G
                            {( M8 ]  ~8 L5 n+ O+ F. s/ I; m
                                sleep(10 * 1000);( j3 I8 U* N) }8 D: F& h5 x8 ~- }! H8 `
                                handler.post(new Runnable()2 z' [! s7 P4 Q$ M0 I) O! n* y- B
                                {' x' q: J, x+ o+ T
                                    @Override  r' r) u! B' e! y0 ?* ~& t# W
                                    public void run()8 W) _+ y; l/ C
                                    {
    % u6 j# ^' {  o: X; ^                                    ShellUtils.execCommand("reboot", true);' I0 K& f  Z3 [+ C
                                    }; Z' q$ `0 J4 _0 R6 `9 l5 j/ G! g
                                });' [& y" ?  g- E# H" ]# c
                            } catch (InterruptedException e)- U; g. H0 X! p$ ~- C
                            {
    + l* J- Z9 b8 H3 q5 N6 t' g                            e.printStackTrace();+ U  z) Y+ v( m' \7 C5 x4 L! d0 ~
                            }
    . V% O3 ^0 c: V$ J                    }; n" d" A, P  g( [
                    }.start();4 u1 W: V5 ?' L9 G: N

    + E7 j- s% K& v$ k( O            }
    . ^) t; w& O* I0 F        });
    # ]) R; W3 Y7 i4 B, }7 v
    7 f3 a: E: ?" l) |& Z        textView.append("-----------------------------\n");
    : D/ W/ }1 u$ p# L; W2 X# P        textView.append("该应用需要root权限!\n");* R# }$ \$ M" k5 y' u( p4 f. T
            if (ShellUtils.checkRootPermission())0 k- }% n! l' I! `8 Z7 m1 i
            {9 z# d  l* b0 o5 b4 O/ {
                textView.append("获取root权限成功!\n");' ~7 g3 S7 k# E) {0 W# H
            } else
    5 @7 ?" w0 [9 |, Z* s0 A9 G+ Y. \        {
    & T( S5 W" u9 ?, ^9 a) j, \            textView.append("获取root权限失败,请在设置中授予权限!\n");+ W6 t# d5 _7 A5 F
            }8 r7 Y- L* H5 I0 o) [
    ) B" g" F: u6 R  a# J7 i

    ( n% Y$ ^# q* z! D5 ~- p4 \    }8 H$ @3 k) A3 F, t& F7 v
    }[url=][/url]) X# ]5 n- V9 t/ s& M* V
    % e# W1 a( l& X
    ; G7 v9 h* l( s: ~( o4 w- ~- L
    运行如下:
    先安装旧版本微信,
    运行该程序,点击左边的【保存安装文件并卸载】按钮,
      安装新版本微信并登录,
      点击右边的【覆盖安装文件并重启】按钮,
    62.png
      重启后重新输密码登录即可。

    3 s( D( k0 a$ d7 _/ }
    完整代码 wxreversion.rar
    安装包在release目录中
    + j$ ?- @! D; {

    本版积分规则

    关闭

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

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