美文网首页Android开发Android技术知识Android开发经验谈
装X指南之用Xposed把支付宝资产改成100w

装X指南之用Xposed把支付宝资产改成100w

作者: 幕后眼光 | 来源:发表于2019-01-13 20:29 被阅读26次
    我用Xposed把支付宝资产改成100万

    一、前言

    2018 年眨眼就结束,2019 年即将新年,在外工作拼搏一年,看着身边的朋友一个个升职加薪,买房买车,你是不是很羡慕!今天看我如何一步一步改掉我的支付宝账户余额的,进阶成为「百万富翁」

    虽然不是真的账户余额,但是看着这个数字还是很感人的~

    0.00 100w

    二、寻找 Hook 入口

    1、结合 Top-Activity 获取到当前首页的 Activity 名称,可以看到截图支付宝首页的界面的 Activity 名称是 com.eg.android.AlipayGphone.AlipayLogin,然后我们打开 Jadx-gui , 并打开下载好的 alipay_wap_main.apk,反编译出源码

    首页

    2、首页这样的排版,能想到这是常见的布局形式:TabHost + Fragment。那重点去找【财富】对应的 Tab 下的 Fragment 类,打开 AlipayLogin 源码,它是继承 LauncherActivity ,不出意外的话,应该可以在这个类找到下面四个 Tab 各自对应的 Fragment。

    AlipayLogin

    不过尴尬的是,这里面我反复找了下,没能找到 Fragment 相关信息

    LauncherActivity

    3、通过 Monitor 去跟踪一下里面的方法的调用流程,看看是怎么个执行顺序

    在点击【财富】按钮前,马上点击 Monitor 里的 Start Method Profiling ,等到页面完切过去【财富页】,并且加载数据完毕,点下停止即可,这样就能跟踪到这个进程的方法调用信息了。

    Start Method Profiling

    在 trace 里面,重点关注包名为 com.alipay.xxx 开头的类的方法,可以找到几个可疑的方法调用,里面有 TabHost、TabLauncherFragment、FortureWidgetGroup、FortureHomeView,最主要是 Fortune 这个单词是财富的意思

    基本可以肯定最里面的是 FortureHomeView 这个作为界面视图,下个步骤就是怎么在 FortureHomeView 找到我们需要改的【总资产】这个布局,还有这个布局赋值的地方

    trace

    继续跟踪,找到 FortureHomeView.updateFortureHead() 方法,由方法名可知更新头部,展开这个方法,看看里面调用了什么

    FortureHomeView

    点击 AssetCardV2View.renderData() 方法名大概知道是 View 处理数据地方

    AssetCardV2View.renderData()

    越来越清晰了,继续找下去。看到里面的 AssetHeaderV2View.setData() 知道是头部的设置数据

    AssetHeaderV2View

    展开里面的 AssetHeaderV2View.setData() 看到有调用 TextView 的 setText() 方法,还有一个 NumRunningTextView 的 setRunningText() ,这里结合我们平时看到的界面效果,这是个自定义的带动画效果的View,可以猜测是【昨日收益】的 TextView,因为受益为了更好地用户体验,会带滚动效果,平时有留意就知道了。

    昨日收益

    知道具体是 AssetHeaderV2View,在设置界面的值,现在去看看它的源码是咋回事。

    4、第一个框框里面,有个 string 的命名是 hide_status_text,我觉得就是我们隐藏资产的那个【*】符号

    然后再看看条件 else if(assetsCardModel != null) 后面执行的代码,在第二个框里面,发现 setRunningText() 这个方法,而且方法有个参数是:totalYesterdayProfitView ,意思是昨天总收益,那这里应该就是【昨日收益】设值的地方

    那就是说前一个setText() 方法,如果没有错误的话,就是设值【总资产】的地方,设值变量为 latestTotalView

    AssetHeaderV2View.setData()

    为了确保没有错误,跟一下变量 a 和变量 b 具体是什么类型,可以看到一个是 AUAutoResizeTextView 另一个 NumRunningTextView,这应该是自定义的控件,为啥总资产要定义为自动调整大小的View呢?想一下如果写死宽度的话或者字体大小的,就兼容不了每个人的资产数目,如:1000000 和 1 长度的区别。

    a和b变量

    AssetsCardModel 应该是存储用户资产信息的 Model 类,框框里面的变量,就是存储着最新的【总资产】信息

    AssetsCardModel

    好的,到这里分析完了,总结一下具体是怎么个流程:

    LauncherActivity -> TabHost -> TabLauncherFragment -> FortureHomeView.updateFortureHead() -> AssetCardV2View.renderData() -> AssetHeaderV2View.setData() -> AUAutoResizeTextView.setText()

    流程图

    三、Hook 代码

    现在只需要对 AssetHeaderV2View.setData() 加工处理,在调用这个方法之前,对参数进行更改,通过反射把里面的 latestTotalView,改成你想要的金额。

    /**
     * @author zhicheng.chen
     * @date 2018/11/26
     */
    public class AlipayHook implements IXposedHookLoadPackage {
        @Override
        public void handleLoadPackage(XC_LoadPackage.LoadPackageParam lpparam) throws Throwable {
            if (lpparam.packageName.equals("com.eg.android.AlipayGphone")) {
    
                XposedBridge.log("load alipay");
                ClassLoader classLoader = lpparam.classLoader;
                Class<?> aClass = classLoader.loadClass("com.alipay.android.render.engine.viewbiz.AssetsHeaderV2View");
                Class<?> aClass2 = classLoader.loadClass("com.alipay.android.render.engine.model.AssetsCardModel");
                if (aClass != null) {
                    XposedHelpers.findAndHookMethod(aClass, "setData", aClass2, boolean.class, boolean.class, boolean.class, new XC_MethodHook() {
                        @Override
                        protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
                            super.beforeHookedMethod(param);
                            Object arg = param.args[0];
                            try {
                                Log.w("czc", arg.getClass().getField("latestTotalView").get(arg).toString());
                                arg.getClass().getField("latestTotalView").set(arg,"1000000.00");
                            } catch (IllegalAccessException e) {
                                e.printStackTrace();
                            } catch (IllegalArgumentException e) {
                                e.printStackTrace();
                            } catch (NoSuchFieldException e) {
                                e.printStackTrace();
                            }
                        }
    
                        @Override
                        protected void afterHookedMethod(MethodHookParam param) throws Throwable {
                            super.afterHookedMethod(param);
                        }
                    });
                }
    
            }
        }
    }
    

    相关阅读:

    更多技术分享,请加微信公众号——码农茅草屋:

    码农茅草屋

    相关文章

      网友评论

        本文标题:装X指南之用Xposed把支付宝资产改成100w

        本文链接:https://www.haomeiwen.com/subject/lsildqtx.html