js逆向实战之莫莫铺子sign参数解密
url: http://mmpz.ttzhuijuba.com/?r=/l&cids=1&site=classify&sort=0
分析过程
-
抓取流量包。

主要关注图中框起来这条流量包,因为这条流量包返回的是当前页面数据。

该流量包的url地址有个加密的参数sign,目的就是找到sign参数的加密过程。 -
按照常规思路会去搜索url中的关键词,但找到对应的地方不能很好的定位到
sign参数,所以需要换一种思路。

-
我们直接搜索
sign关键字,有很多条记录,需要稍微筛选一下。

-
只有两条数据符合我们的要求。先试
sign: n("7bc9"),打断点。

输出一下n("7bc9")。

发现输出是个原生代码,所以此处不是我们要的,可以排除。 -
找到另一条符合要求的记录,打断点。

-
刷新界面,触发该断点,查看每一个处的值。
makeSign是个函数。

s和this.config.appSecret都是变量。


-
先搞清楚两个变量的来源。

s = p(p({}, {
version: this.config.version,
appKey: this.config.appKey
}), r)
s也涉及到了this.config变量,那就先确定this.config变量是什么。在该文件中搜索this.config,定义处如下。

this.config的初始化涉及到传参e,看哪里调用的该函数(看call stack找)。

e是个固定值,Object.assign函数是一个用于复制的函数,故this.config也是一个定值,this.config.appSecret的值就显而易见了。

再回去看s变量的定义。p函数定义如下。

都是一些原生代码,看不懂也没关系,直接运行一下即可。

相当于就是给version和appKey赋值。
makeSign函数的定义如下。

看到有md5摘要算法了,那么只要搞清楚要加密的数据就可以了。
n的值如下。

e就是传过来的this.config.appSecret,接下来就简单了,将两个值进行拼接即可。

整个解析步骤结束了。那么可以通过直接编写python代码来爬取数据了。
import requests
import hashlib
md_hash = hashlib.md5()
data = "appKey=612bcfe884763&version=v1.0.2&key=5dd20b08158402032845b45f5b67a349"
md_hash.update(data.encode("utf-8"))
sign = md_hash.hexdigest()
pageId = input("请输入你要查第几页:")
url = "https://openapi.dataoke.com/api/goods/get-goods-list?version=v1.2.4&appKey=612bcfe884763&pageId={}" \
"&pageSize=100&sort=0&cids=1&tmall=1&commissionRateLowerLimit=3&hasCoupon=1&keyWords=&sign={}".format(pageId, sign)
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)
运行结果如下:
