一、前言
前一段时间才偶然看到这个论坛,并且看了一篇@jiangwei212 大神的《Android支付宝蚂蚁森林能量自动收取插件开发原理解析》,这才知道XPosed和VirtualXPosed的存在,觉得这个框架神器非常的有意思,所以继续学习了框架原理和使用方法,我发现有一些做支付宝微信自动收款提醒的网站,有生成二维码的功能,但是我没有找到相关开源的插件,所以就拿支付宝二维码这个功能先练练手,这个插件用来实现自定义备注内容和支付金额,自动生成付款二维码。下面就是我hook支付宝,反编译代码找到关键点的一些思路。

二、寻找突破口
首先需要找到入手点,生成二维码的页面在支付宝首页中的【收款】选项里,点击进入后是一个可以设置金额备注生成二维码的页面,这个页面可以用adb shell dumpsys activity top命令查看到顶层Activity是哪一个,或者更简单一点,在logcat中,搜索ActivityManager,看看对应启动的activity是哪一个,会发现是PayeeQRActivity:

接下来,就需要反编译支付宝的apk,然后看一下这个类的实现,这里会有两个问题:

  1. 我们都知道二维码是把一些信息写入二维码图片中,那么支付二维码都需要写入哪些信息呢?

  2. 知道了写入信息,那接下来便是如何生成一个二维码了。

关于第一个问题,很容易想到,我们要能够设置备注和金额,所以这两个信息也是必须的,其它还需要哪些信息呢?需要我们看一下具体代码,首先就是onCreate方法:

刚一进入onCreate,我们就能看到请求了一个UserInfo类型的数据,根据名称应该知道和用户信息相关,再看下面的this.c,就知道是用来标识用户的唯一ID,还有用户的昵称和头像,应该是用来在页面做显示。继续分析流程:

代码块(1)中看到从preference中读取了一些字符串类型的变量,从key的名称看应该是和生成二维码地址有关的信息,但是前两个变量的默认值是空,也就是你第一次进入这个页面的时候,应该读取出来是空值,之后某些地方会对他们进行赋值。

代码块(2)是创建了一些服务接口类,从名称看第一个最符合生成二维码相关的信息,如果查看这个接口CollectMoneyRpc的声明,会发现猜测是正确的,其中的一些方法就是设置金额,备注等信息。

这些是设置金额和备注相关的Rpc服务接口,之后的代码会用到这些接口方法去设置金额和备注并返回信息。

继续下面的分析,之后onCreate代码就是获取UI组件相关变量,设置点击监听等等,比较重要的肯定是设置金额的按钮:

其中设置金额的点击监听事件是内部类bi,整个onCreate还有一个b()方法比较可疑,如果查看该方法的话,会发现是在主线程中最终调用了一个a(boolean z, ImageView imageView)的方法,该方法可以明显看出是用来真正生成二维码并显示在ImageView上:

至此,onCreate的流程分析完毕,收获不小,几乎所有相关的初始化工作都是在这里进行了,总结一下看到的代码流程:

  1. 获取用户id,有可能会根据id来设置二维码中的信息?

  2. 获取RPC远程调用服务接口。

  3. 设置和金额相关的按钮点击监听。

  4. 调用生成二维码方法生成二维码,这里就是你第一次进入该页面而没有设置任何金额和备注信息是现实的默认支付二维码。

那接下来,我们首先看一下设置金额和备注按钮点击时,会发生什么,方法就是上面提到的内部类bi:

直接看onClick方法,有两个分支,如果PayeeQRActivity.this.j是空值,会启动PayeeQRSetMoneyActivity,这个Activity肯定是设置金额和备注的activity了,至于this.j是什么?先让我们去看一下新的PayeeQRSetMoneyActivity,这个activity启动的方式是startActivityForResult,那么当该activity finish的时候,会回调到PayeeQRActivity的onActivityResult,让我们来看一下这几个流程,先来看一下PayeeQRSetMoneyActivity:

首先依旧会请求一个CollectMoneyRpc服务接口,看来是要在这里实际设置金额,然后会有个一sessionId,这个sessionId具体是什么值我没有找到,但是不影响继续分析,然后根据支付宝设置金额页面UI来看,最终会点击【确认】按钮完成设置,也就是图中的this.e和监听回调ct,ct最终的处理方法是该类的a方法:

一个真正使用rpc接口进行异步调用的函数,RpcRunner的两个参数第一个是异步调用接口,第二个是处理返回结果,都非常简单,下面那个带参数的a方法,就是回调结果调用的处理方法,他把处理post到主线程,执行cv方法,cv方法很重要,因为他是真正调用成功后返回结果的地方:

已经可以看到,结果中包含这些项:codeId,qr_money,beiZhu,qrCodeUrl,qrCodeUrlOffline,从名称就都可以知道是什么作用,然后通过调用setResult和finish把结果返回给PayeeQRActivity,而在PayeeQRActivity中的onActivityResult,无非就是去读取这些结果然后生成二维码,还记得生成二维码的方法吗?就是那个b()函数(最终调用的是a(boolean z, ImageView imageView)这个方法)。所以最好再来看一下生成二维码的方法,需要用到什么东西:

方法逻辑很清晰,用到哪些类,传入哪些参数,都很清楚了,最后使用ZXingHelper的genCodeImageView方法生成二维码并更新到ImageView上显示,具体逻辑就不贴图展示和分析了,以上就是代码层面上的分析,那么做一下总结:

  1. 关于之前说的第一个问题,生成二维码用到哪些信息并且怎样生成,现在很清楚的知道,至少需要金额和备注,然后使用的是Rpc服务接口CollectMoneyRpc去生成二维码信息。

  2. 关于之前的第二个问题,怎样生成二维码图像,这个也很清晰了,就是使用上面的a(boolean z, ImageView imageView)这个方法了。

那么接下来就是根据这些分析结果来构造hook的条件了

一、先来看如何构造1提到的条件:

我们从前面分析的代码知道需要一个CollectMoneyRpc接口,他是通过下面的调用来生成的:

关键点是这个mMicroApplicationContext是怎么来的,这个需要追溯到基类BaseActivity中,有个ActivityHelper辅助类,其中又再次使用LauncherApplicationAgent来获取这个值,这个值是在LauncherApplicaitonAgent构造函数中来构造的,LauncherApplicationAgent又是一个单例类,他有个init方法,一看就是用来做初始化的,我们去hook这个init方法,然后反射拿到成员变量mMicroApplicationContext,直接给出代码:


拿到这个CollectMoneyRpc后,我们就可以根据设置金额以及备注参数进行调用了,反射从调用结果中拿到上面分析的哪些codeId,url,等等:

二、最后构造之前的2提到的条件:

已经说过真正生成二维码是在哪个a(boolean, ImageView)方法中进行的,只要去按照这个方法中的参数构造,然后在反射使用ZXingHelper这个辅助类去写二维码图片就可以实现了,直接给出代码:

三、总结

使用XPosed开发插件还是新手,需要学习的东西还有很多,这次分析支付宝代码,使用的是旧版本的支付宝,最新版支付宝,jadx即使分包加载,我的电脑还是会卡死。。。支付宝代码反编译后,还是很清晰的,混淆的不是很严重,但是从中也能看到支付宝的复杂性以及架构上的合理性,研究他的代码也能学到很多的东西,估计这个工作我还会持续进行。已经把整个工程上传到github,文末是地址,如果这个东西不小心触犯了谁的利益或者影响了软件安全,可以联系我删除,再次声明,仅仅是个人学习目的使用,请勿他用,谢谢!!

AlipayQRHook开源地址:https://github.com/wayu002/AlipayQRHook

XPosed插件自动生成支付宝收款二维码相关推荐

  1. 微信支付宝收款二维码还能用吗?权威解读

    自央行发布<中国人民银行关于加强支付受理终端及相关业务管理的通知(银发[2021]259号)>以来,引起网友的热烈讨论,同时我们也陆续收到很多客户的咨询. 所以今天我们收集了各个渠道的官方 ...

  2. 如何制作支付宝收款二维码照片

    如何制作支付宝收款二维码照片. 随着信息时代的不断进步,虚拟支付已经越来越普及,年轻人很多都不带钱包,开始享受一个手机走天下的美好生活了.为了顺应时代的进步,我们更应该学会更上年轻人的步伐,这样才能不 ...

  3. 如何创建自己的支付宝收款二维码

    最近,支付宝正式宣布推出"支付宝收款".简单来说,它可以用最简单的方法,帮助小商家们接入支付宝,方便大家买番薯.糖葫芦.煎饼等等时,都能用支付宝扫码付款. 值得注意的是,与此前打印 ...

  4. 如何在生成微信收款二维码?

    微信收款已与为众多商家或个体户的首选.怎么样才能制作自已的收款二维码呢?可以通过以下几步完成? 第一步打开手机微信,点击我的页面,进入微信我的页面,点击我的钱包. 第二步:输入钱包密码后,点击左上角收 ...

  5. pc端生成支付宝支付二维码

    验签类RSA.php <?php namespace App\Library; class RSA{     /**      * RSA签名      * @param $data 待签名数据 ...

  6. Android应用识别支付宝收款二维码直接跳转支付宝转账界面

    我们知道应用可以通过scheme跳转应用,支付宝的scheme private static final String URL_FORMAT ="intent://platformapi/s ...

  7. 如何让pbootcms模板自动生成当前页面二维码-教程

    二维码生成标签 {pboot:qrcode string=***} 使用说明: 用于生成对应文本的二维码图片,可用于产品列表页或详情页为每个产品生成二维码 :{pboot:qrcode string= ...

  8. PHP版单文件index.php直接生成QQ微信支付宝三合一收款二维码完整源码

    打开EditPlus 5类似的工具新建一个utf-8格式的php页面,将下面的源码复制进去,然后修改前十二行对应的信息即可,下面的两千多行代码为全自动生成内容无需修改,改好后保存名为index.php ...

  9. 微信QQ支付宝三合一收款二维码实现原理

    大家可以先看看我网站的效果: 收款吧 - 三合一收款码在线生成 收款码三合一大致原理如下: 第一步.解析用户上传的微信支付.QQ钱包.支付宝收款二维码,获取收款链接地址. 第二步.用自己的网站程序生成 ...

最新文章

  1. 【Perl】二维数组
  2. Java注释(Annotation)详解
  3. Objective-C Runtime
  4. Entity Framework Core介绍(1)
  5. LeetCode OJ 113. Path Sum II
  6. 磁共振线圈分类_收藏:磁共振检查序列及临床应用总结
  7. MyBatis 事务源码分析
  8. att汇编教程 linux,ATT 汇编语法
  9. System学习笔记006---Windows退出telnet 命令的正确姿势
  10. grdraw用法 lisp_AutoCAD 2000 Visual LISP开发
  11. 20191207每日一句
  12. shell while循环
  13. 昆仑通态MCGS与3台欧姆龙E5*C温控器通讯程序功能:通过昆仑通态触摸屏
  14. Python3抓取糗百、不得姐
  15. linux tc工具,Linux TC软件系统损坏自助恢复的工具.TC刷机,TC修复,TCPUP,TCP-UP
  16. Docker直接删除elasticsearch报错:Failed to obtain node locks
  17. 小学计算机编程学什么,小学生编程都学什么
  18. 子集构造法NFA转换成DFA
  19. iphone用什么蓝牙耳机好?和iphone适配的蓝牙耳机推荐
  20. 东方财富:资金流向表爬虫

热门文章

  1. 【单片机毕业设计】【mcuclub-cl-007】基于单片机的RFID高速收费的设计
  2. CTF-Web基础题
  3. 如何快速有效的提高新站权重
  4. DIY便携式显示器板卡推介与定制
  5. uni-app App打包
  6. 轻量级实时语义分割:ICNet BiSeNet
  7. 借助第八代智能英特尔® 酷睿™ i7 处理器和 Unreal Swarm* 的强大性能快速构建光照
  8. arduino实现简易计算器
  9. CPU、GPU、NPU的区别
  10. QOpenGL入门教程(二)—— 第一个QOpenGLWidget程序