Android”挂逼”修炼之行

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MiLcdeAA-1651119910671)(https://user-gold-cdn.xitu.io/2018/9/14/165d7704b4a02956?imageView2/0/w/1280/h/960/ignore-error/1)]

到这里我们会发现一个点就是支付宝内部有一个打印日志的类H5Log,他应该封装了系统打印日志的,我们先不管他内部怎么实现的,直接hook这个类的这个方法,通过一些日志来快速分析行为和得到我们想要的:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rSbrjgaK-1651119910673)(https://user-gold-cdn.xitu.io/2018/9 《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》无偿开源 徽信搜索公众号【编程进阶路】 /14/165d7704b62e41e0?imageView2/0/w/1280/h/960/ignore-error/1)]

然后然后我们通过打印日志看看效果,因为这里会很多日志信息,所以通过它的tag作为过滤条件,这里的tag是H5RpcUtil:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Dqyzo5k9-1651119910674)(https://user-gold-cdn.xitu.io/2018/9/14/165d7704d91c0e94?imageView2/0/w/1280/h/960/ignore-error/1)]

这里又发现adb logcat 命令还是那么好用,Windows中用findstr进行过滤即可,在打印信息中会发现一些特殊信息,比如每次执行完成之后的response是一个json数据:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lIzjpIac-1651119910675)(https://user-gold-cdn.xitu.io/2018/9/14/165d7704d9f7d06e?imageView2/0/w/1280/h/960/ignore-error/1)]

而且发现了一个重要的信息就是我们肉眼在页面看到的好友排行榜信息,先不管把这些信息json格式化一下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gq6KJ5UD-1651119910675)(https://user-gold-cdn.xitu.io/2018/9/14/165d7704ddbd2787?imageView2/0/w/1280/h/960/ignore-error/1)]

到这里感觉特别激动,通过信息发现正是好友列表信息,而且有一个关键字段canCollectEnergy表示这个用户是否有能量可以收取的,所以到这里我们发现仅仅通过日志信息就可以找到突破口了,还找到了关键信息。所以对于一个线上的应用每家公司应该在最后的发包阶段对应用中所有的日志代码全部删除,这里是全部删除而不是仅仅加上一些开关来控制。只有删除才是最安全的,现在有些安全公司就是这么做的,内部有一个发包审核和自动删除应用所有打印日志代码,从这里看如果没有日志我们还是需要去分析这个方法的:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JYAqaTrt-1651119910676)(https://user-gold-cdn.xitu.io/2018/9/14/165d7704e7560990?imageView2/0/w/1280/h/960/ignore-error/1)]

这个方法最后是返回了一个H5Response类。那么到这里我们已经找到返回结果了,那么这个返回结果执行前是有什么信息呢?比如参数等,而且这里看到好友列表默认是分页,每页是20个用户信息,所以后面我们肯定得获取所有的好友信息,应该有个参数来进行操作,所以为了更加直观看数据,直接hook这个H5RpcUtil.rpcCall方法,这个方法有十几个参数,其中有一个坑就是JSONObject格式的,其实他是阿里的fastjson包的对象,导致操作过程中始终没hook成功:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UnE0qgAv-1651119910676)(https://user-gold-cdn.xitu.io/2018/9/14/165d7705032b422e?imageView2/0/w/1280/h/960/ignore-error/1)]

所以这里如果有的同学在使用Xposed进行hook一个方法,但是没有hook成功,最快找到原因就是把这个hook的代码外面加一个try…catch,然后catch到异常信息打印出来即可。如果有错误直接就可以看到原因了,不然很费劲去找hook失败的原因。然后我们在运行看看结果:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bTFkq3Xq-1651119910676)(https://user-gold-cdn.xitu.io/2018/9/14/165d77052600975f?imageView2/0/w/1280/h/960/ignore-error/1)]

我们进行下拉获取更多好友列表信息发现打印的参数信息,里面的第二个参数的确是携带了分页信息,每页是20条,又每页的起始点,而且第一个参数其实是命令类型,后面还会有获取用户所有可以收取的能量以及收取能量的命令。那么到这里我们已经成功的获取到所有好友信息,并且可以通过解析response的json数据获取哪些用户可以有能量收取,那么怎么获取到这个用户所有的可以收取的能量信息呢?因为有的同学可以有很多能量收取的,这个直接点击这个用户进入他的蚂蚁森林页面即可,这时候依然是通过观察日志信息,首先还是入口参数信息:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BcDXLM25-1651119910677)(https://user-gold-cdn.xitu.io/2018/9/14/165d770590f21b16?imageView2/0/w/1280/h/960/ignore-error/1)]

这里看到每次进入一个用户的能量页面,都会执行这四条命令,而且其中有三条命令会携带当前用户id,那么用户的id信息我们在之前列表返回的json中可以拿到了。再看看能量返回的json数据:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-J4kXglj8-1651119910677)(https://user-gold-cdn.xitu.io/2018/9/14/165d7705af425378?imageView2/0/w/1280/h/960/ignore-error/1)]

还是进行json格式化:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0jfD0vFa-1651119910677)(https://user-gold-cdn.xitu.io/2018/9/14/165d7705b64c3181?imageView2/0/w/1280/h/960/ignore-error/1)]

果不其然返回的json中会表示这个用户所有的能量信息,其中的collectStatus字段表示这个能量是否可以收取,那么我们把这个json进行解析保存可以收取的能量id信息,接下来有了这些id信息,那么就开始收取了,我们在手动的收取一个能量看看打印的参数信息和返回结果信息:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jMxEv0iF-1651119910678)(https://user-gold-cdn.xitu.io/2018/9/14/165d7705b63041e7?imageView2/0/w/1280/h/960/ignore-error/1)]

入口参数中的确包含了当前收取的能量id和当前用户信息,而这两个参数我们现在已经都能获取到了,看看收取之后的返回信息:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FxQj5V2o-1651119910678)(https://user-gold-cdn.xitu.io/2018/9/14/165d7705c17468f2?imageView2/0/w/1280/h/960/ignore-error/1)]

依然去json格式化:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MJ0MIHzj-1651119910678)(https://user-gold-cdn.xitu.io/2018/9/14/165d7705d2ecd407?imageView2/0/w/1280/h/960/ignore-error/1)]

返回信息中有是否成功的字段和成功收取的能量数值,这个我们可以解析来标识此次收取是否成功了。

好了到上面我们已经全部分析完了能量获取流程,我们写的插件大致操作流程也很简单,第一次进入蚂蚁森林页面就会获取第一页的好友信息,然后我们通过修改页数起始点进行分页获取所有好友信息,然后解析字段获取有能量收取的用户id信息进行保存,然后在依次通过用户id信息获取每个用户可以收取的能量id信息进行保存,最后在利用之前的用户id和能量id信息进行收取能量即可。整个过程全部通过调用上面的那个关键方法:H5RpcUtil.rpcCall,因为这个方法是static的,所以调用它很简单,只要构造具体参数信息即可,而在上面的三个操作中获取好友列表信息、获取指定用户的可收取能量信息、收取能量;这三个步骤打印的参数来看,现在唯一需要搞定的是那个自定义类型的H5PageImpl类:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7e564xb8-1651119910678)(https://user-gold-cdn.xitu.io/2018/9/14/165d7705de9eda12?imageView2/0/w/1280/h/960/ignore-error/1)]

我们看看怎么才能获取到这个对象实例,而且我们也发现这个对象实例在每次进入一个新的页面都是不一样的,全局搜这个类:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7iE4e7xG-1651119910679)(https://user-gold-cdn.xitu.io/2018/9/14/165d7705e554e27a?imageView2/0/w/1280/h/960/ignore-error/1)]

这里发现了很多地方调用,但是有一个H5Fragment最值得怀疑,为什么呢?因为我们可以看到只有Activity和Fragment可以展示页面的载体。我们现在看到的是蚂蚁森林页面,又在H5Fragment中搜到他了,当然最值得怀疑和查看了,点击去查看即可:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NxwpjYzz-1651119910679)(https://user-gold-cdn.xitu.io/2018/9/14/165d7705fb639630?imageView2/0/w/1280/h/960/ignore-error/1)]

到这里我们就要有点应用开发技巧了,Android中的Fragment是无法单独展示的,一般的用法都是一个Activity中的FragmentManager进行管理展示的,因为可能会有多个Fragment的,所以我们可以先看看当前activity是啥,直接用命令 adb shell dumpsys activity top:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BqTlZZR7-1651119910679)(https://user-gold-cdn.xitu.io/2018/9/14/165d770623a809be?imageView2/0/w/1280/h/960/ignore-error/1)]

这个Activity是H5Activity,可以看到他的当前Fragment的构造参数信息,我们去查看这个activity信息:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pZSSiSDA-1651119910680)(https://user-gold-cdn.xitu.io/2018/9/14/165d77063d8d9fff?imageView2/0/w/1280/h/960/ignore-error/1)]

果不其然有一个类似于FragmentManager的类,点进去进行查看:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cDC2Nxlv-1651119910680)(https://user-gold-cdn.xitu.io/2018/9/14/165d770640d76138?imageView2/0/w/1280/h/960/ignore-error/1)]

这里是每次添加新的H5Fragment类的方法,我们直接hook然后把当前的H5Fragment打印出来看看:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uyeWJUwc-1651119910680)(https://user-gold-cdn.xitu.io/2018/9/14/165d7706604078bf?imageView2/0/w/1280/h/960/ignore-error/1)]

通过打印日志发现每次进入一个页面这个H5Fragment都是一个新对象,那么我们知道上面调用rpcCall方法的参数H5PageImpl可以在H5Fragment中获取到,所以这里我们就需要这么做了,就是拦截这个pushFragment方法,然后保存当前最顶端的页面H5Fragment,然后用反射获取对应的H5PageImpl对象,最后在调用rpcCall方法执行命令即可,具体这几个类的关系是什么样的,继续看一下代码:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-b1JtZhvm-1651119910680)(https://user-gold-cdn.xitu.io/2018/9/14/165d770661b96170?imageView2/0/w/1280/h/960/ignore-error/1)]

首先是H5Fragment类中有一个变量是H5ViewHolder类型的变量a:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EFcaw7Fz-1651119910681)(https://user-gold-cdn.xitu.io/2018/9/14/165d77066ada52db?imageView2/0/w/1280/h/960/ignore-error/1)]

然后是H5ViewHolder类中的有个变量h是保存当前的H5PageImpl类型:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0CGAUIAb-1651119910681)(https://user-gold-cdn.xitu.io/2018/9/14/165d77067dbfa227?imageView2/0/w/1280/h/960/ignore-error/1)]

而H5PageImpl内部有一个H5WebView类型变量f:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fcMIe2fF-1651119910681)(https://user-gold-cdn.xitu.io/2018/9/14/165d7706888f1cea?imageView2/0/w/1280/h/960/ignore-error/1)]

看到这里设置了很多WebView的回调接口信息,所以到这里就大致清楚蚂蚁森林或者说支付宝其他H5页面的层级关系是:H5Activity.fragmentManager->H5Fragment->H5ViewHolder->H5PageImpl->H5WebView;然后利用webview进行本地交互操作了。

[](()四、编写Hook代码

有了上面的分析,这里绘制了一张图片,全世界唯独一份的,以后大家分析支付宝H5页面都可以按照这个流程来即可:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0V0jHxcc-1651119910682)(https://user-gold-cdn.xitu.io/2018/9/14/165d7706fa699f76?imageView2/0/w/1280/h/960/ignore-error/1)]

有了这张图我们对于写插件那就很简单了,下面就简单来分析一下代码吧,首先我们第一次进入会有两个返回信息,一个是当前第一页的好友信息,还有一个是自己的能量信息,所以需要解析两个,而对于自己的能量直接收取即可,我们可以hook上面的rcpCall方法来获取每次页面返回的response信息:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sjTGIAXq-1651119910682)(https://user-gold-cdn.xitu.io/2018/9/14/165d7706fee93560?imageView2/0/w/1280/h/960/ignore-error/1)]

然后自动获取所有的好友列表信息进行保存:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nOGndXme-1651119910682)(https://user-gold-cdn.xitu.io/2018/9/14/165d770700fd3b3e?imageView2/0/w/1280/h/960/ignore-error/1)]

这里需要分页请求到所有的好友信息保存,请求完成了然后在遍历所有用户获取可以收取的能量信息,发送获取分页好友信息的命令也很简单:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xoCQk2w1-1651119910682)(https://user-gold-cdn.xitu.io/2018/9/14/165d770729b3a29b?imageView2/0/w/1280/h/960/ignore-error/1)]

查看指定给用户可以收取能量的命令:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GLi2xITQ-1651119910683)(https://user-gold-cdn.xitu.io/2018/9/14/165d77072c07f9fd?imageView2/0/w/1280/h/960/ignore-error/1)]

开始自动收取能量的命令:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nx9U8eVv-1651119910683)(https://user-gold-cdn.xitu.io/2018/9/14/165d77072c591bfb?imageView2/0/w/1280/h/960/ignore-error/1)]

我们利用之前分析的那几个类关系,保存当前的H5Fragment:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-utEiWDAN-1651119910683)(https://user-gold-cdn.xitu.io/2018/9/14/165d77073c4b0b5e?imageView2/0/w/1280/h/960/ignore-error/1)]

然后利用反射获取对应的H5PageImpl对象,最后调用rpcCall方法发送命令请求:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-quRxvg2L-1651119910683)(https://user-gold-cdn.xitu.io/2018/9/14/165d77074f704538?imageView2/0/w/1280/h/960/ignore-error/1)]

还有部分代码这里不在详解了,整个流程贯通之后接下来就是见证奇迹的时刻:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cRTpNSGc-1651119910684)(https://user-gold-cdn.xitu.io/2018/9/14/165d770755344478?imageslim)]

看到了只需要几秒钟就可以把所有好友的所有能量一偷殆尽,不给自己留下一丝丝的遗憾:
1651119910683)]

还有部分代码这里不在详解了,整个流程贯通之后接下来就是见证奇迹的时刻:

[外链图片转存中…(img-cRTpNSGc-1651119910684)]

看到了只需要几秒钟就可以把所有好友的所有能量一偷殆尽,不给自己留下一丝丝的遗憾:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值