场景:
最近接到一个需求,在支付宝上自动批量生成二维码,上传到服务器上。由于使用到的技术挺有趣,因此做一下记录。
主要使用到的技术是Xposed,但是Xposed只能运行在root后的手机上。辛亏有位大神提供了VirtualXposed,可以完美的在非root的手机上模拟Xposed环境。
开发思路:
使用Xposed hook到二维码生成界面和设置金额、备注界面的activity和相关的控件,根据任务不断的模拟用户操作,获取二维码。
遇到的问题和解决方案:
Q: 在某些手机上无法正常的使用Xposed log功能
A:换个手机就好
Q:支付宝检测到Xposed模块运行,自动关闭
A:将Xposed模块单独放在一个类内,并对程序进行apk包混淆
Q:如何正确的hook到需要的控件
A:首先通过adb 获取到相关的Activity,然后通过反编译获取到支付宝相关代码。
这些代码都是混淆过的,但是使用混淆过的成员变量名字,依然能够正确的hook这些变量。
需要注意的是,hook的函数,如果是基类声明的,则必须要在子类被重写才能hook到,否则无法正常hook。
Q:正确与XPosed模块通信
A:相关的账号和服务器配置是在我们自己的APP上进行配置的,获取到的支付宝收款二维码是在支付宝APP内,由于安卓相关的安全策略,两个APP是无法直接共享数据的,同时我们无法直接在支付宝调用我们接口。因此需要引入Service。使用Service的Message功能进行任务获取,传递给支付宝。同理,支付宝获取到二维码后,告诉Service,让Service上传相关的二维码。
更新:
由于现在大多数手机厂商都会清理Service,因此使用上述的方法在某些手机中无法保证数据传输的安全性,所以在新的版本中使用广播的方式进行数据传输,但是当发送多次后,广播也有可能无法被接收到,所以每次生成二维码后,并不直接传输,而是等到任务完成后,一次性发送。
程序安装:
最好保证手机环境干净,没有安装安全卫士和太多的其他APP,防止系统资源不足时,引发的异常。
首先将APP和支付宝安装到手机内,然后将两者一同安装到VirtualXposed中,将APP的模块勾选上。重启VirtualXposed,在VirtualXposed中运行APP,点击收钱,当后台有任务后,就会自动运行。
网友评论