蚂蚁森林为支付宝内的一个小应用,一年前通过xposed hook的方式实现了静默式的自动偷取好友能量,具体的分析过程此处略去,可见尼古拉斯_赵四的帖子:Android支付宝蚂蚁森林能量自动收取插件开发原理解析。xposed拥有十分强大的功能,但是也有一定的缺点。首先很难24小时运行,由于支付宝不可能一直在前台,而手机会在特定情况下清理或者冻结掉后台应用。每次都得运行支付宝才行,这是一个很头疼的问题。最近趁着周围的人又在疯狂偷能量,于是想着能不能通过爬虫的方式来实现偷能量呢?经过几天的分析,终于实现了功能,对其中的一些坑以及难点进行一下记录。
首先通过前面的分析已经知道,蚂蚁森林的数据发送调用了
com.alipay.mobile.nebulaappproxy.api.rpc.H5RpcUtil.rpcCall(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ZLcom/alibaba/fastjson/JSONObject;Ljava/lang/String;ZLcom/alipay/mobile/h5container/api/H5Page;ILjava/lang/String;ZILjava/lang/String;)Lcom/alipay/mobile/nebulaappproxy/api/rpc/H5Response;
通过xposed hook可以得到rpcCall的参数内容并且自己构造这部分参数来实现自动偷能量。跟踪rpcCall函数有一定难度,于是继续采用DDMS跟踪堆栈以及日志来分析。对H5Log以及LogCatUtil两个日志类进行hook,手机上操作好友列表时进行跟踪方法调用。在方法调用中发现了:
com.alipay.mobile.common.transport.http.HttpWorker.call()Lcom/alipay/mobile/common/transport/Response;
com.alipay.mobile.common.transport.http.HttpWorker.executeHttpClientRequest(Lorg/apache/http/HttpHost;Lorg/apache/http/HttpRequest;Lorg/apache/http/protocol/HttpContext;)Lorg/apache/http/HttpResponse;
这两个可能相关的函数,同时纵览一遍日志,也发现了可能相关的信息(对关键信息进行了删除):
HttpWorker:printHeaderLog. : visibleflag:1, miniwua:{"w":"HHnB_..."}, x-mgs-productversion:8f5..., AppId:Android-container, Version:2, Did:WSv..., Operation-Type:alipay.mobileaix.fetchAppList, Ts:MtfX9ar, Content-Type:application/protobuf, Sign:647..., signType:0, clientVersion:10.1.75.7000, Cookie:ALIPAYJSESSIONID=RZ4...; zone=RZ4..., Accept-Language:zh-Hans, Accept-Encoding:gzip, Connection:Keep-Alive, Retryable2:0,
在附近也发现了url,body,cookie等信息,猜想可能就是关键点:
url:https://mobilegw.alipay.com/mgw.htm
body:[{"ct":"android","av":"5","startPoint":"1","pageSize":20}]
cookie:ALIPAYJSESSIONID=RZ4...; zone=RZ4...
header: