本文只作学习研究使用.禁止用于非法用途.(知乎首发)
咳咳… 因为感觉别的也没有可以写的了
这个是一个支付的包,这个包可以探测出支付宝目前的状态,主要就是这个功能.也就是我们今天要分析的.
首先还是抓包:
json_ua是支付宝全系列产品都使用的一个加密参数,使用了自家写的混淆器,通过压扁控制流和混淆变量的方式对关键代码做了混淆.目前市面上没有看到开源的混淆工具实现javascript代码压扁控制流的功能.处理后的代码,可读性非常差,要还原代码的话,几乎很难实现.但是作为实现爬虫功能,没有必要进行完整的还原.
混淆后的代码以switch case 实现了将源代码打散,建立了多个分支代码,扰乱逆向者的分析思路.相比于传统意义上的变量混淆,分析难度更大.
早先的时候,分析了一次json_ua的生成,参考这里
但是,后面参数效验失败了,因此借助以前的分析思路,对更新后的代码做一下简单的逆向分析
首先,对于简单的函数,将switch case语句还原成代码块,这一部分是手动完成的:
难度最大的也是S函数,但是,借助于chrome的强大分析功能,还是可以大概的了解到核心的算法的:
S的传参根据arguments的长度,进行了以下的计算:
0: 计算json_ua
1:捕捉事件后的处理
2:事件加密处理后,组合
3:变量的解密函数
4:初始化,建立事件监听
事件的监听:
监听了mousemove, mousedown ,focus,blur,scroll,keydown,readystatechange
监听的事件不是很多,但是基本涉及到用户操作的都有捕捉.所以如果不模拟这有部分几乎是很难通过后台的检测的.
如何处理监听到的事件:
然后就是将每次的处理后的事件进行push到一个全局的list中,并做拼接处理:
知道了所有的事件处理方法,模拟就很简单了.
首先:document.readyState = "complete"进行初始化.触发S(0,1,0,1),然后模拟键盘,鼠标,和其他的几个事件:
运行后:
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会返回一个验证码,正确的请求返回账号的状态:
舒服!