前言

由于工作需要,要抓取tb上某个接口的文案资源,用来分析借鉴。

本来想着,无非就是验证一下当前用户信息之类的,但在研究过后,发现并没那么简单。

1,查看请求相关参数

比如下图,发现请求中携带的参数不少,然后其中随时变化的就有t、sign、data,

很明显,这就是tb判断请求是否合法的参数,其中但凡修改一点,就会提示非法请求。

关于逆向破解tb某个请求的加密算法

2,开始查找处理加密的代码

既然大概猜到这些是加密参数,那就开始在js文件中查找sign,果不其然,找到这么一段,

很明显可以看出,sign参数就是由四个已有参数组成的字符串放入h()加密函数中生成的,

在断点查找后确认,d.token是存在 tb cookies中的某段标识,i 是实时生成的字符戳,g 就不必多说,

最后data中的一大段参数就得复制原有格式,再动态修改某些变量,比如分类id等等。

关于逆向破解tb某个请求的加密算法

3,尝试生成加密参数模拟请求

经过上面的研究,基本理清了这个加密参数的逻辑,至于加密函数h(),看不懂也没所谓,直接复制后拿来用,

根据原有代码照着找齐四个参数,然后送入加密函数,就能得到返回的sign参数,

拿齐参数后,就能开始模拟请求,拼凑url啦,除了上面看得见的参数,还有当前tb用户的cokies也要一并随着请求发出,

不然就会验证为非法请求哦,这里我用js实现了大概的逻辑代码,

另外还用上了获取token啊、生成某段字符、加密的函数,太长了我就不贴了。

let temp = (new Date).getTime()
    , appKey = '12574478'
    , token = this.getCookie("_m_h5_tk").split("_")[0]
    , e = "v1-" + d() + "-" + String(Date.now() - 9)
    ,
    data = '{"curPageUrl":"https%3A%2F%2Fweb.m.taobao.com%2Fapp%2Ftb-windmill-app%2Fyouhaohuo%2Fhome%3Fbs%3D13","appId":"6696424","tab":' + this.value + ',"topic":"selected_crowd","tabId":' + this.value + ',"type":"selected_crowd","userId":"-1","params":"{\\"v\\":\\"new\\",\\"resId\\":\\"6696424\\",\\"bizId\\":\\"2020\\",\\"pageNo\\":1,\\"type\\":\\"selected_crowd\\",\\"pageSize\\":20,\\"contentIds\\":\\"\\",\\"home_clickItemId\\":\\"\\",\\"tab\\":' + this.value + ',\\"tabId\\":\\"' + this.value + '\\",\\"clickedIds\\":\\"\\",\\"bizCode\\":\\"steins.goodItem\\",\\"src\\":\\"phone\\",\\"showAllCrowd\\":true,\\"preExposeItems\\":\\"\\"}","resId":"6696424","backupParams":"tabId,type,userId","pvuuid":"' + e + '","__pvuuid":"' + e + '","_pvuuid":"' + e + '"}'
if (this.value != '0') {
    data = '{"curPageUrl":"https%3A%2F%2Fweb.m.taobao.com%2Fapp%2Ftb-windmill-app%2Fyouhaohuo%2Fhome","appId":"6696424","tab":"' + this.value + '","topic":"selected_crowd","tabId":"' + this.value + '","crowdId":"' + this.value + '","type":"selected_crowd","userId":"-1","params":"{\\"v\\":\\"new\\",\\"resId\\":\\"6696424\\",\\"bizId\\":\\"2020\\",\\"pageNo\\":1,\\"type\\":\\"selected_crowd\\",\\"pageSize\\":20,\\"contentIds\\":\\"296620907314\\",\\"home_clickItemId\\":\\"\\",\\"tab\\":\\"' + this.value + '\\",\\"tabId\\":\\"0\\",\\"clickedIds\\":\\"\\",\\"bizCode\\":\\"steins.goodItem\\",\\"src\\":\\"phone\\",\\"showAllCrowd\\":true,\\"preExposeItems\\":\\"\\",\\"crowdId\\":\\"' + this.value + '\\"}","resId":"6696424","backupParams":"tabId,type,crowdId,userId","pvuuid":"' + e + '","__pvuuid":"' + e + '","_pvuuid":"' + e + '"}'
}
let j = h(token + "&" + temp + "&" + appKey + "&" + data)
data = encodeURIComponent(data)
let page_url = 'https://h5api.m.taobao.com/h5/mtop.tmall.kangaroo.core.service.route.aldlampservicefixedres/1.0/?jsv=2.6.2&appKey=' + appKey + '&t=' + temp + '&sign=' + j + '&timeout=6000&api=mtop.tmall.kangaroo.core.service.route.AldLampServiceFixedRes&type=jsonp&params=%5Bobject%20Object%5D&dataType=jsonp&v=1.0&preventFallback=true&callback=mtopjsonp1&data=' + data
axios.get(page_url)
    .then(response => {
        console.log(response)
    })

总结

其实很多时候在遇到这种问题时,缺的只是一个思路,当思路打开后会发现,原来这加密参数也没多难啊?

发表回复