新支付宝json_ua分析

本文只作学习研究使用.禁止用于非法用途.(知乎首发)

新支付宝json_ua分析_第1张图片
又来分析支付宝…

咳咳… 因为感觉别的也没有可以写的了

这个是一个支付的包,这个包可以探测出支付宝目前的状态,主要就是这个功能.也就是我们今天要分析的.

首先还是抓包:

新支付宝json_ua分析_第2张图片
json_ua是支付宝全系列产品都使用的一个加密参数,使用了自家写的混淆器,通过压扁控制流和混淆变量的方式对关键代码做了混淆.目前市面上没有看到开源的混淆工具实现javascript代码压扁控制流的功能.处理后的代码,可读性非常差,要还原代码的话,几乎很难实现.但是作为实现爬虫功能,没有必要进行完整的还原.

混淆后的代码以switch case 实现了将源代码打散,建立了多个分支代码,扰乱逆向者的分析思路.相比于传统意义上的变量混淆,分析难度更大.
新支付宝json_ua分析_第3张图片
早先的时候,分析了一次json_ua的生成,参考这里

但是,后面参数效验失败了,因此借助以前的分析思路,对更新后的代码做一下简单的逆向分析

首先,对于简单的函数,将switch case语句还原成代码块,这一部分是手动完成的:

新支付宝json_ua分析_第4张图片
y函数还原后的代码:

新支付宝json_ua分析_第5张图片
新支付宝json_ua分析_第6张图片
b函数还原后:

新支付宝json_ua分析_第7张图片
难度最大的也是S函数,但是,借助于chrome的强大分析功能,还是可以大概的了解到核心的算法的:

S的传参根据arguments的长度,进行了以下的计算:

0: 计算json_ua

1:捕捉事件后的处理

2:事件加密处理后,组合

3:变量的解密函数

4:初始化,建立事件监听

事件的监听:
新支付宝json_ua分析_第8张图片
监听了mousemove, mousedown ,focus,blur,scroll,keydown,readystatechange

监听的事件不是很多,但是基本涉及到用户操作的都有捕捉.所以如果不模拟这有部分几乎是很难通过后台的检测的.

如何处理监听到的事件:

源代码的话是这样的:
新支付宝json_ua分析_第9张图片
改写后:

新支付宝json_ua分析_第10张图片
其实也是很基础的处理方法,算法就不公开了,处理后:

新支付宝json_ua分析_第11张图片
新支付宝json_ua分析_第12张图片
然后就是将每次的处理后的事件进行push到一个全局的list中,并做拼接处理:

新支付宝json_ua分析_第13张图片
最终计算:

新支付宝json_ua分析_第14张图片
拼接转换后得到json_ua:

在这里插入图片描述
到这里json_ua的处理就结束了.

知道了所有的事件处理方法,模拟就很简单了.

首先:document.readyState = "complete"进行初始化.触发S(0,1,0,1),然后模拟键盘,鼠标,和其他的几个事件:
新支付宝json_ua分析_第15张图片
运行后:

新支付宝json_ua分析_第16张图片
得到了一串:

206YlF/THtOfk9+SHlMfEp4Qh0=|YVF/JgZHLV0wXzgYNhYjFTUbO24FaQ9iF2ZGGUY=|YFF/JhQ6CCYdJhQ6ADYCLBopGjQOPg8hFyQXOQMzAl0C|Z1RnSRAwWixaKFlhTGEGfB1+D2UOaRk1VjhTIUI5FXQZdlsqXD9TNVYmQG0OeQ9lSSNVOgd1Fm0gUDZRIWoMMwc1ATIHY1Q3U2dVMwU0BTUOPAltXz8LPAppDjkCYQI2GiASMhw8ViBWJFVtQG0MawdxFmZKKUk+RTJechN+ETwcQxw=|ZlVlS2szRw84cxhvAHQjEmgBbSx2LX4pUyAUWg9aMnIUVxRMLw9Q|ZV9xUTZMLU4/VT5ZKXQEYhNOLVosRhsrGSoRIxMjGSkYLx4vG0Z0RX5Md1cI|ZF9xCChZMl0qQS1JJAQ8RWUQexc3Dz4NPxExVzpbe0NyXHwdbB09BTYMIgJiEn8KexxsTHQtDUIvVzxSPF9/UXE9WixdPF8tSmpEZERqHGwbfFIkVCNEakofdBgpGTkXNxc5GTkXN1AqSyhZM1g/T2MAbgV3FG9DIk8gAC4OLgAgAC4OLgAgAC4YKxg2DDwNIxMlCz0OPRMpGSgGNBood1l5CGMMLBRNKUokVTIceBt1BGNNKUokVTJtEjwcbA9jBWgHJx8uHigSJwkpSD5TOl0xESkJUwlTCVMJUwlTCVNzDFM=|a11zKgoqBDQAMR8oHSsFNgE2DFMM|al1zKgoqBF1tWWhGcURyLQMxHz8fMQExCztkOw==|aVxyKwsrBTYYKBIjFEsU|aFxyKwsrBTYDLR8xADQEMG8w|b1t1LAwsAjEEKhg2ADMCOWY5|blp0LQ0tAzAFKxk3ATQFP2A/|bVl3Lg4uADoOIBI8Cz8LMW4x|bF9xQG5bdUZ1T2FSZFZ4T3Rab1h2TWNQZUt9T2FRZUt7TGJSZEp6SxQ=

本来以为这样就可以直接去直接请求了,还是太年轻,这中间还有一个坑-----跨域加密请求.这个问题研究了2天才发现的,有机会在详细介绍.

使用python模拟请求

错误的json_ua会返回一个验证码,正确的请求返回账号的状态:

舒服!

你可能感兴趣的:(爬虫)