js逆向实战之智通财经网token参数解密
url:https://www.zhitongcaijing.com/immediately.html
分析过程
-
抓流量包,主要关注如下这条数据包。

响应数据如下。

由于该url中的token参数是经过加密的,所以目的就是找到加密过程。 -
关键字搜索
immediately/content-list.html,只有两条记录,第一处是个html代码,肯定不是,所以只需要看第二处。



-
打断点,刷新界面,触发该断点。

但通过调用栈发现都是在自我调用,并且此处看不到token关键字,放弃,换另一种思路。 -
搜索关键词
token,符合的只有四处。

最下面两处由于url地址都不对可以排除。


第一处由于是个POST方式,跟我们想要的GET方式传参不一致,也排除。

只剩下最后一处了,且是GET传参,符合。

-
打断点,触发。

这个url不对,放过去。滚动一下界面,又触发了断点。

这个url就对了,主要看token是怎么生成的。 -
"token=".concat(Object(i["tokenCrypto"])(u(u({}, e), n))),主要看Object(i["tokenCrypto"])和u(u({}, e), n)是什么。
u(u({}, e), n)的值如下,相当于是一个字典,里面带有时间戳等属性。

Object(i["tokenCrypto"])的定义如下。


打断点,让程序运行到这里。

看call stack,发现是Object(p["a"])(e(t))中调用了e(t)函数。

看到传给e函数的参数如下。

单步向下走,看最后返回的结果是什么。


从结果中就可以得知e函数就是用&将传进去的参数进行了拼接。
再看Object(p["a"])的定义。


看到关键字SHA1了,原来是个sha1算法,加密的数据就是e函数执行完后的数据,所以整个逻辑就非常清楚了。

-
编写python代码获取数据。
import time
import hashlib
import requests
timestamp = int(time.time())
# 需要加密的数据
plaintext = "last_update_time={}&platform=web&roll=gt&type=all".format(timestamp)
# sha1加密
sha1_hash = hashlib.sha1()
sha1_hash.update(plaintext.encode("utf-8"))
# print(sha1_hash.hexdigest()) # 0b87a5231b9b13d77b9042ba660bedf90f92a235
token = sha1_hash.hexdigest()[2:]
url = "https://www.zhitongcaijing.com/immediately/content-list.html?type=all&roll=gt&token={}" \
"&last_update_time={}&platform=web".format(token, timestamp)
resp = requests.get(url, headers={"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, " \
"like Gecko) Chrome/123.0.0.0 Safari/537.36"})
print(resp.text)
运行,成功获取到数据。
