某东抢购sk算法剖析

sk是什么

sk是某东抢购提交订单时,必要的一个参数,是防止自动化提交订单的一种手段,靠一段加密js动态生成。

sk是如何计算出的

根据抓包分析过程,发现sk是一段加密js生成的,具体如何抓包,可以查阅我之前写的文章

加密js接口

https://tak.jd.com/a/tr.js?_t=2685900

用浏览器打开返回是这样的

PythonAPP抢茅台 javascript抢茅台_PythonAPP抢茅台

一般人,越到这种情况,就望而却步了,但是为了抢到茅台,还是稍微看了下格式化后的代码,发现一个关键性的一点,如下图中b函数的推导过程

PythonAPP抢茅台 javascript抢茅台_字符串_02

加密的主要逻辑
  1. js代码中很多字符串,是以a b c 等数组下标替换了
  2. 仔细观察发现所有的数组名称,a1, a2…等等,其实都等于b
  3. b已经可以上图标红函数推导出和a的关系,其实b表示的字符串,就是a表示的字符串数字下标减去一个数字
js还原逻辑

根据上面的关系,其实就可以写代码还原js了,我这里用了正则表达式

  1. 获取a数组的值
  2. 替换文件中所有的a1,a2…替换为b
  3. 根据b和a的关系,替换掉b数组下标为字符串

我还原后的js大体样子是这样的

PythonAPP抢茅台 javascript抢茅台_PythonAPP抢茅台_03

是不是比之前好看了很多,虽然还是比较乱,但是可以看出大概的模样了,根据这个代码,就可以分析出sk的具体生成逻辑了,其实其中添加了大量的无效代码,只是为了看起来比较乱,最后看完代码,就可以分析出主要加密逻辑

最终sk生成算法逻辑

用户访问过程,先访问了

https://tak.jd.com/t/2D06E?_t=1611540055108
t是时间戳
这个2D06E根据自己抓包看看,据说隔一段时间会有变化
这个抓包自己分析下

会返回一个奇怪的json串,其实sk就是这个返回的json串中内容拼接成的

PythonAPP抢茅台 javascript抢茅台_抓包_04

其中具体用哪些拼接而成,是根据@t这个变量来的,分为cca、cb、xa、ch、cbc、by、cza、ab 八种情况,每种都有不同的拼接方法

举个例子

返回值为

{
    "code": "000000",
    "message": "success",
    "data": {
    "@t": "xa",
        "cNK": "voSrW8MUQ63MORUhYvua",
        "W": "RZMK001CWc2ooIp1t09O",
        "v": "K9PtpzoFhsOqSQtALVgm",
        "Is": "QDA7QTqGAauhnvEu2AKl",
        "XQw": "x0IljCbG561XC16U3tfR"
    }
}

根据以上返回结合js中sk的算法

如果@t为xa时
取的是data中 第二个元素的下标为1~16位  + 第六个元素下标4~10位,注意下标从0开始
也就"voSrW8MUQ63MORUhYvua"的下标1~16 位 加上"x0IljCbG561XC16U3tfR"的4~10位组成如下
oSrW8MUQ63MORUhjCbG56
以上组成的值,就是提交订单生成的sk值的算法