时隔半年重返CSDN,在此期间收获很多。接下来的文章将以案例解析为主,内容仅限学术交流用途(叠甲)!
1. 找入口 
可以看到,所有的数据都存在这个请求中,所以我们的第一步算是完成了,简单吧。
2.分析加密参数

可以看到有6个参数,那么懂行的都知道(引用付航的脱口秀哈哈),第一个参数ts,十有八九就是时间戳了,也就是timestamp缩写,当然也不全是,目前我还没遇到过。最后三个参数也很简单,字面意思。那就剩两个参数了,rs,signature。经过测试呢,两个都加密,这里我就不具体说怎么测试了,控制变量法哈哈哈。
3.找加密位置
定位加密位置一般就是搜关键词,或者跟栈,我们这里就直接采用关键词搜索。
因为考虑到signature可能特殊一些,所以我们搜signature关键词


可以看到,这里不就是我们要找的参数吗,都在一堆了,巧了嘛不是。
这样,我们就找到加密位置了,还算比较简单吧。
4.分析加密
根据上面的图片我们可以看到 ts = d,rs = h,signature = t
所以我们的问题是不是就转化为找到d,h,t 是如何生成的呢,是吧

打上断点,轻松加愉快。
d 就不用分析了,就是一个时间戳,那我们ts是不是就破解了呢
接着我们分析h:当我们断点h的时候,发现不兑!不走这里,这是为啥捏。
现在我们去分析请求:

很难不发现,一直向下滚动,所有的请求都是共用的一个 rs,这说明了什么,说明rs只生成一次,也就是说h只生成一次,那也就是说,h对应的函数只生成一次,那这一次是什么时候呢,好难猜哦
那必须就是我们第一次请求这个网站的时候啦,所以我们现在要做的,就是把断点打在h 上,然后刷新网页,就可以断在这里。

看着稍稍有一点点复杂对吧。好,那我们继续看
(!1,16),关键的来了,也就是说,这个是我们传入的参数,多想一下,那不是 r 不就没传?那就删了删了。
!1不就是false吗,那e不就是false吗,t不就是16吗,那我们代码不就很简单了
h = function() {
var n = ""
, i = 16
, a = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"];
for (var o = 0; o < i; o++) {
n += a[Math.round(Math.random() * (a.length - 1))]
}
return n
}()
我们去做做测试

感觉是那回事是吧,其实就这么回事,哈哈
rs 是不是就解决了,接着我们来分析signature:

这个t 看起来代码一长串,但是没什么用,因为我们目前里面大部分都知道了
d ,h,u(就在上面),e = 1(可以多做测试,是固定的),l = 10,p["type" + e] = p["type1"] = 1,这里我们再看一眼,因为再看一眼就会爆炸,baby。
page = p["type" + e] => 页码数,那么我们后续是不是就可以设置成动态参数呢,nice。
然后目前我们还需要啥,那肯定就是c函数的作用是啥,but 很遗憾 c 是一个webpack,所以我们就单步走。

首先我们进到c函数,发现 new e.init(r).finalize(t) 这是在开始初始化然后调用方法了,也就是说,是这里的方法开始对t进行加密的,所以我们做的就是单步跳,看看具体是做的什么加密。

当我们调到这里,可以看到是一个SHA256加密,知道加密方式就简单了,但是先别着急半场开香槟,我们要先测一测是不是标准版版,很简单,做一个空值加密,看是否和标准版的结果相同。

发现和标准版的是相同的,所以不是魔改版。代码到此处就分析完毕。完结撒花
5. 整合
const CryptoJS = require('crypto-js')
let sha256 = val => CryptoJS.SHA256(val).toString()
function get_trs(page){
var d = (new Date).getTime()
var h = (function () {
var n = ""
, i = 16
,
a = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"];
for (var o = 0; o < i; o++) {
n += a[Math.round(Math.random() * (a.length - 1))]
}
return n
})();
// var h = '1E5KjYBs9yGVkSV4'
var u = '$d6eb7ff91ee257475%'
var e = 1
var l = 10
var p = page
var t = sha256([d, h, u, e, l, p].sort().join(""))
var url = '//tousu.sina.com.cn/api/index/feed'
var r = "".concat(url, "?ts=").concat(d, "&rs=").concat(h, "&signature=").concat(t)
return {
ts: d,
rs: h,
signature: t
}
}
console.log(get_trs(1))


没毛病,老铁。具体上限多少页,我不清楚,好像是101?我测了50页反正没啥问题。大家温柔点,别把人家网站搞崩了,那就没得玩了。
如果文章对你有帮助的话,请多多点赞👍,后续有时间我会更新新的项目。
683

被折叠的 条评论
为什么被折叠?



