移动云盘加密分析-以链接有消息检查为例子
- 有一个需求,检测移动云盘分享链接是否有效,然后自己创建了一个链接,后分享取消,我们来到了这个页面
- 示例代码链接
- 顺便吐槽一下
- 移动云盘你也是,加密是做啥子,你关键的接口加密我没意见,比如文件列表获取,你这个分享链接有效期也加密..,有这功夫提升下服务多号,给程序员加个鸡腿也好,也没见多少人用啊……

解密逻辑
- 示例代码链接
- 刚开始我想着和其他一样,也是通过调用接口来获取链接状态,然后找啊找
- 发现请求响应的除了一些乱七八糟的数据,感觉也没有什么有用的东西,之前几个网盘都有什么
message为分享取消等之类的消息
- 发现请求响应的除了一些乱七八糟的数据,感觉也没有什么有用的东西,之前几个网盘都有什么

- 然后搜索关键字符串也没发现什么

- 然后直接请求get,会发现响应的是一个无html代码的网页,也就是SFC(单文件组件)常用的做法

- 知道了是单文件,然后我们看下怎么渲染数据上去的,因为都是数据驱动视图渲染
- 然后搜索怎么渲染上去的
- 技巧,==$0就指代了这个对象,可以直接在控制台通过$0操控
- 我们要使用
console.dir来查看

- 然后找到了
errormsg,也就是通过errormsg字段渲染上去的- errormsg肯定是通过请求数据状态获取到的,不可能是本地的,除非你是SSR服务器渲染好了存在文件中

- 我们
ctrl+shift+f全局代码搜索下

- 不断的断点,断点,来到了这里

- 我们就来到了解密逻辑定位
1 | //后面有r.a.AES.decrypt用到了一个变量D,这个j函数没有 |
- 测试看是不是,可以看到,数据从一个不可阅读的变到了一个可阅读的

- 这种加密一看就是cryptojs,我们使用nodejs仿写一下
1 | var CryptoJS = require("crypto-js"); |
- 解密成功

- resultCode也就是国际化的东东,一个编号啥的,不用特别在意

加密逻辑
- 示例代码链接
- 我们知道了解密逻辑,那我们怎么发送这个请求呢?
- 我们发现是请求接口https://share-kd-njs.yun.139.com/yun-share/richlifeApp/devapp/IOutLink/getOutLinkInfoV6
- 然后里面的数据就不知道了,没有一个和url中的某一个参数一样的(我靠,这都加密??)
- 全局搜索
/richlifeApp/devapp/IOutLink/getOutLinkInfoV6定位到了下图

- 断点

- 刷新页面,断点来到了这里

- 跳过下一个函数调用,来到了这里,很明显是一个请求拦截器,我们下断点,我们只需要getOutLinkInfoV6请求的即可,其他url的不需要看(因为貌似他们不同的url还设置了不同加密逻辑….)

- 我们来看看闭包里面的数据,看看能不能发现什么,可以看到,目前处理的url请求是
/platformInfo/advertapi/adv-filter/adv-filter/AdInfoFilter/getAdInfos我们跳过,我们只看getOutLinkInfoV6

- 好,我们断点来到了这,可以看到里面的data数据还是原始的数据,并没有被加密

- 查看下,发现data到了这里就改变了,变成了加密的
1 |
|

- 跳转查看下
jt["h"]函数干了什么

- 跳转到了下图所示位置

- 好了,这样子就知道加密了,你丢给gpt问一问就好了
1 | var D = r.a.enc.Utf8.parse("PVGDwmcvfs1uV3d1"); |
- 里面还有一个
i["a"],发现是下面图的内容

- 丢给gpt重写下,自己懒得写了
- 就是获取类型的
1 | function getType(t) { |
- 用nodejs重新书写下
1 | const CryptoJS = require("crypto-js"); |
- 运行

- 测试正常

- 链接失效基本上是返回这个,当然不排除其他的,什么资源违规啥的
1 | { |
- 因为移动云盘分享链接强制提取码(移动端没试过),所以应该可以使用下面状态来判断有效
1 | { |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 梦洁小站-属于你我的小天地!
评论


