蓝天资源网
当前位置:蓝天资源网 / 汇编逆向 / 正文

网易云音乐歌曲评论获取JS加密分析

作者:忆笙发布时间:2021-09-08 02:19浏览数量:900次评论数量:0次

网址:aHR0cHM6Ly9tdXNpYy4xNjMuY29tLyMvc29uZz9pZD0xODcwMzkwNzA1

用到的工具:edge浏览器,精易编程助手!

首先抓包分析

先找一下返回的包,找到正确的包再看提交的参数

可以看到,这边提交了两个加密参数

params和encSenKey

首先脑子里想的第一个想法就是搜索一下参数名encSenKey

先点击第一个进入看一下

这里往上一点点直接就看到了熟悉的加密字眼:AES

首先不管这个AES,分析一下这个d方法

function d(d, e, f, g) {
    var h = {}
      , i = a(16);
    return h.encText = b(d, g),
    h.encText = b(h.encText, i),
    h.encSecKey = c(i, e, f),
    h
}

首先新建一个变量h,i;

这个i是通过a方法赋值的,至于生成的什么,先不管他

h.encText是通过b方法赋值的,提交了两个参数,d和g

然后再次通过b方法赋值一次,这次提交的是自己和i

h.encSecKey是c方法赋值的,参数是c,e和f

打个断点看看

点击下一页评论,直接断下

可以看到,这里的g是0CoJUm6Qyw8W8jud

d是:

{"rid":"R_SO_4_1870390705","threadId":"R_SO_4_1870390705","pageNo":"1","pageSize":"20","cursor":"-1","offset":"0","orderType":"1","csrf_token":""}

猜想一下d是提交的获取评论的明文参数

这里分析一下d参数这一串是什么东西

{"rid":"R_SO_4_1870390705","threadId":"R_SO_4_1870390705","pageNo":"1","pageSize":"20","cursor":"-1","offset":"0","orderType":"1","csrf_token":""}

首先,映入眼帘的是rid:R_SO_4_1870390705;那么这个东西是怎么来的呢?后面的1870390705经过比对,很明显是歌曲的ID,前面的在JS中搜索一下看看

让我搜到了

至于我是怎么知道的?我找到了这里,哈哈

也就是说看你获取的类型是啥,rid前面的前缀就是什么!

threadId和rid一样,就跳过了

pageNo字面意思不难理解,就是页数

pageSize从字面意思大概也是:每页获取的数量之类的

cursor经过分析大概是上一页最后一个评论的时间参数,没有就-1

offset:0

orderType:1

csrf_token:空值

继续分析,走一步,看一下返回值是什么?

好的,到这里再分析一波

b方法

function b(a, b) {
    var c = CryptoJS.enc.Utf8.parse(b)
      , d = CryptoJS.enc.Utf8.parse("0102030405060708")
      , e = CryptoJS.enc.Utf8.parse(a)
      , f = CryptoJS.AES.encrypt(e, c, {
        iv: d,
        mode: CryptoJS.mode.CBC
    });
    return f.toString()
}

AES加密

这边已知的参数是三个

d:{"rid":"R_SO_4_1870390705","threadId":"R_SO_4_1870390705","pageNo":"1","pageSize":"20","cursor":"-1","offset":"0","orderType":"1","csrf_token":""}

g:0CoJUm6Qyw8W8jud

还有一个b方法里面的:0102030405060708

而AES加密正好是三个参数

来测试一下自己的想法

正好和上一步打的断点生成的h.encText是一样的

继续分析

再测试一下

果然,一模一样!

继续分析

c方法:

function c(a, b, c) {
    var d, e;
    return setMaxDigits(131),
    d = new RSAKeyPair(b,"",c),
    e = encryptedString(d, a)
}

看字眼就看到RSA加密

看一下结果

提交的两个参数都是从d方法中算出来的

params就是d方法中的h.encText

encSenKey就是d方法中的h.encSecKey

开始扣代码

既然是AES加密CryptoJS.AES,直接搜索CryptoJS,找到他创建对象的地方开始复制

复制到精易编程助手中的JS调试这里,点击加载

直接加载成功,改写一下JS代码中的d方法!咱们就用到一个d方法,别让他变得那么复杂!

调试一下,把参数{"rid":"R_SO_4_1870390705","threadId":"R_SO_4_1870390705","pageNo":"1","pageSize":"20","cursor":"-1","offset":"0","orderType":"1","csrf_token":""}提交上去运行看一下

直接运行成功!输出出来了结果!

测试一下

正确,至此,分析结束!

最后整理一下思路

经过各种拼接出来的明文Json参数{"rid":"R_SO_4_1870390705","threadId":"R_SO_4_1870390705","pageNo":"1","pageSize":"20","cursor":"-1","offset":"0","orderType":"1","csrf_token":""}

这个参数先经过固定密钥0CoJUm6Qyw8W8jud和偏移0102030405060708经过AES加密得到第一次加密结果

在经过a方法生成随机的密钥和第一次的偏移0102030405060708再次加密得到第二次加密结果

而这个结果就是提交的params参数

第二次生成的随机密钥和固定参数

00e0b509f6259df8642dbc35662901477df22677ec152b5ff68ace615bb7b725152b3ab17a876aea8a5aa76d2e417629ec4ee341f56135fccf695280104e0312ecbda92557c93870114af6c9d05c4f7f0c3685b7a46bee255932575cce10b424d813cfe4875d3e82047b97ddef52741d546b8e289dc6935b3ece0462db0a22b8e7

和010001经过RSA加密得到的结果就是提交的第二个参数encSenKey

忆笙

忆笙 主页 联系他吧

人间山河远阔,只想与你同行。

欢迎 发表评论: