1、确认数据接口: 2、请求参数分析 3、通过多次请求发现,我发现这几个值是变动的:X-B3-Traceid、X-Client-Nonce、X-Client-Sign、X-Client-Time,其中X-Client-Time为时间戳 4、开始逆向,分析代码 4.1通过调用堆栈,我们发现,经过了这个函数后,这几个参数的值都生成了,于是我们点进去看看他到底做了什么 4.2进来后发现函数返回值有个forEach函数,猜想应该是循环赋值,打断点调试 4.3,果然是循环赋值 4.4继续断点调试,找到其中的X-B3-Traceid、X-Client-Nonce的生成位置 4.5代码模拟 4.6 到最后我们发现这里面并没有生成X-Client-Sign的值,于是继续往下看,发现W()函数的回调函数中,包含了我们需要的值,并且具体的加密方法也在里面,那到值与网页核对,一模一样 4.7读了大量的三目运算和各种判断,发现X-Client-Sign的值就是I经过了f.default函数处理后生成的。而F又是通过A经过运算的来的。 A = [L, B, N, D],所以先要组合成A。 4.8. 组建A 的值: A = [L, B, N, D],, 4.8.1L的值,读三木运算,v = P=2的。查看生成的值是32位,猜测可能是MD5摘要算法,参数是nonce,通过测试,确实是MD5摘要算法 4.8.2B的值:w = P=2的。查看生成的值是40位,猜测可能是SHA1加密,参数是timestamp,通过测试,确实是SHA1加密 4.8.3N值得获取,分析发现,是通过X-CLIENT-NONCE**和X-CLIENT-ID产生拼接,然后通过md5加密算法来的! 4.8.4 D值得获取, 4.8.5分析代码后,发现最终的加密函数是h['fromString'], 4.8.6而参数C的值是上面生成,然后处理后再赋值,然后再拿来用的,接下来我们先获取C的值 4.8.7代码模拟C的值:参数对齐后,结果一致,说明逻辑没有问题 4.8.8代码整合,获取sign的值,参数对其后,拿到的值与网页的一致 5、代码整合:成功拿到数据