独家首发-支付宝吱口令的秘密
更新日期:
扣吧先给大家拜年了!祝大家猴年大吉,身体健康,万事如意!
OK,正文开始。以下内容仅做学习和交流,请勿转载,请勿做其他用途
春节前的一阵子是不是被吱口令搞烦了?
如下图:
吱口令如下:
1 | #吱,口,令#复制这条消息,打开你的支付寳即可添加我为朋友WcvLnp650c |
我们来分析一下吱口令的逻辑,在com.alipay.android.phone.wallet.sharetoken下有后台服务ShareTokenService,是吱口令的核心逻辑。
这个后台服务对外提供4个API,分别是:
1 | public abstract void checkToken(); |
其中checkToken用于检测token,而shareToken用于分享token。我们分别对其进行分析。
检测token的逻辑
当页面状态变化时,会拉起ShareTokenCheckReceiver,这个Receiver会调用ShareTokenService的checkToken(),执行以下逻辑:
1)从系统剪切板中读取内容
2)从内容中提取token,用的是CRC32算法
3)检测当前MD5(UserId)是否和xml中的一致
4)把token和客户端数据组装成JSON串,发送到服务器端做校验
5)拉取数据,启动ToeknDecodeActivity页面
第二步中的从内容中提取token,token的长度默认是8位,判断逻辑是这样的:1
如果字符串最后2位等于字符串前8位的CRC32,则前8位就是token,后2位是校验位
所以,无论吱口令的【token+校验位】前面或者后面添加多少奇葩字符,都不会影响吱口令的识别,除非支付宝升级客户端把checkToken的逻辑换掉
举个例子:扌考贝这个 xiao xi,打開知-fu&宝,
送我富强福7ptkyKacrmv794M,
算出来token=Kacrmv79,校验位=4M
有兴趣的同学可以写个APP读取剪切板数据,提取token,精准识别吱口令:)
分享token的逻辑
入口A,用于添加好友:
在GenerateZhiCodeActivity会通过RpcService调用ZhiCodeRpc.getZhiCode()到服务器端获取token,随后调用ShareTokenService的shareToken,携带参数启动SendSharedTokenActivity页面
入口B,用于邀请朋友赐福:
ShareFactoryPresenter会调用blessingRpcService.genCode到服务器端获取token,随后调用ShareTokenService的shareToken,携带参数启动SendSharedTokenActivity页面
另外,支付宝传输协议使用的是protobuf,把远程调用封装了一层proxy,叫RpcService,客户端通过以下方式,可以便捷的调用服务器端CGI。1
(RpcService)context.getRpcProxy(xxxRpc.class).xxxmethod(arg)
吱口令的分析到此为止,欢迎留言交流。有空再更一篇“支付宝咻一咻的秘密”:)