我是如何“破解”某软件的付费音频资源的

2,616 阅读2分钟

之前一直使用一款叫bettersleep的软件,资源非常好,支持混合播放,使用效果也特别好,支持web版,我对它是如何实现播放特别有兴趣,于是认真“研究”了一番,然后发现了“新天地”。

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第2天,点击查看活动详情

首先,大家应该尊重知识版权,尤其是音乐的制作尤其不易,有条件一定要购买正版软件。

分析资源的加载和解密

打开网站播放其中一条音频: image.png

可以看到网络tab栏多一条对应的ogg资源的请求,响应内容为类似base64格式的字符串:

image.png

对于这串数据,我认为可能被做过加密,直接拿过来没什么用,必须到主代码里找到相应的解密方法。

分析后推测主代码文件为mainjs: 截屏2022-04-02 17.24.00.png

打开检索ogg,最终定位到了下面代码并打了断点: image.png

进入下一个函数栈:

onDataDownloaded(data) {
  this.encryptedData = data; // ready for decryption

  this.changeState(SoundTrackState.DECRYPTING);
}

一番分析后定位到了解密的方法:

//注释是个好东西啊,生产环境还是需要去掉的
decrypt() {
  // for now bypass deciphering, we received the sound in base64 directly
  //之前的解密方法,现在注释了,也就是不需要解密了!!!!
  //this.cipher.decrypt(this.encryptedData, (decryptedData) => { this.onDataDecrypted(decryptedData); });
  //这里直接把base64数据传入了onDataDecrypted
  this.onDataDecrypted(this.encryptedData);
}

onDataDecrypted(decryptedData) {
  this.decryptedData = decryptedData;
  this.changeState(SoundTrackState.LOADING);
}

继续定位,来到了loadSound方法:

loadSound() {
  //var audioExtension = this.soundData.isBrainwave ? 'wav' : this.utils.getBestAudioFormatMimeType();
  var audioExtension = this.utils.getBestAudioFormatMimeType();
  //这不是资源的拼接嘛
  var howlSource = ['data:audio/' + audioExtension + ';base64,' + this.decryptedData];
  //....
}

由上我推测一个名为Birds的音频的DataUrl为:data:audio/ogg;base64,${返回的base64字符串}。 拼接好用浏览器打开,果然可以播放了:

image.png

当然,下载也是可以的:

image.png

ok,基本搞明白了,理论上,我们只要知道音频的名字,就可以直接下载音频了。

获取所有的音频名称

我们继续到主代码mainjs里查询音频名如Birds:

image.png

一下子就发现了好多的音频名字,有免费的,也有付费的。我们拷贝出来即可。

ok,音频名字搞定。

写个下载脚本

一个个地手动下载肯定是不行的,因为文件太多(几百个),所以还是得写个脚本,读取文件名,拼接并保存为mp3格式。

脚本在 这里

最后

本文仅供学习研究之用,请勿盗取、传播、售卖付费资源。