x猫投诉平台逆向,看完就会!!!(案例时间2025-05-30)

时隔半年重返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页反正没啥问题。大家温柔点,别把人家网站搞崩了,那就没得玩了。

如果文章对你有帮助的话,请多多点赞👍,后续有时间我会更新新的项目。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值