作者:吾爱大佬:t00t00
前言 先放文件 https://github.com/kazutoiris/ali_ecc。 (施工完毕,请放心阅读) —————————————————————————- 背景 自从阿里云盘2023年2月13日一波大更新,直接把原来调网页版接口的第三方网盘客户端给干爆了。像小白羊、Clouddrive、AList都出现了`invalid X-Device-Id`。其中,Clouddrive通过官方申请API招安的方式勉强能用,其他俩都不能下载文件了。 这使得复习高数的我直接傻眼了,第三方客户端只能上传不能下载,而网页版的在线视频播放功能一坨,只好全部缓存下来再看。。。 这波操作属实有点逆天,晚饭吃撑了研究一下。 ——————————————————————————————– 分析 STEP1 通过报错可以发现,阿里云盘请求时候主要使用 `x-device-id` 和 `x-signature` 来进行校验。像列目录之类的可以不用校验,但是取下载链接一定要校验。 如果不带的话就只能收到 `invalid X-Device-Id` 的错误提示了。 STEP2 貌似在不同浏览器上登录,这个 `x-device-id` 会不同。暂时不清楚是怎样随机生成的(准确来说是懒得调了,又不是不能用)。 综上所述,唯一要生成的就是 `x-signature`。 开导逆 STEP1 首先就是要确定 `x-signature` 啥时候生成的。因为在前几条请求中都没有涉及到 `x-signature`,只有在请求目录后,所有的请求都带上了 `x-signature`。 STEP2 随机挑一个请求,查看发起的程序。这个一目了然,发送逻辑必定在 `bundle.js` 中! 一个搜索,一个回车,直达要害!这证明了之前的猜想没错。 STEP3 看了一下请求记录,没有 WASM,那估计不是 WASM,是纯 JS 加密算法。 悲,纯 JS 没得下硬件访问断点,WASM 调试起来可方便多了。。 不管了,直接一个断,一个刷新,欸,直接就断下了。 这不比调 WASM 爽,环境不用补,连反调试都没有。 仔细观察,createSession 中 `x-signature` 是通过外部调用传参进来的,并不是这个函数内部产生的。 但是看了一圈,似乎在调用前就有了签名值。这就意味着必须要换一种方法了。 STEP4 直接开搜 `createSession`,很快啊,就找到了引用位置。 看了一下,整体代码似乎是状态机结构,总的来说还是通俗易懂的,比起恶心的 ollvm 确实正常了不少。 整体代码是自上而下运行的,是一种流水线式的运行方式。打个比方,A切肉,B把切完的肉拿去腌,C把腌完的肉拿去烤,D把烤完的拿去出餐。 这个函数先生成签名,然后生成会话。生成会话过程的签名就是上一级产生的。 而这种流水线的方式会导致前面找堆栈的时候,没有办法找到原始签名字符串是啥时候传进来的,就像是写在了全局变量一样(这也是没办法下硬件写入断点的槽点,不然早找到了)。 STEP5 找准了函数,下一步就简单了。创建签名是在 `genSignature` 中,直接一个 Ctrl+F 直达。 整体就很清晰了:
STEP6 签名是找到了,但是是拿啥算法签名的呢? 可以看到,阿里云盘有请求一个 `get_public_key` 的地址,而且返回了一个 RSA 密钥。前面代码又有公私钥加密的,这不就是 RSA 签名嘛! 哎哎哎,可别高兴太早,RSA 签名有个显著的特点,就是 e 基本都是 65537。但是调了这么久,似乎从来也没看到过 65537? [JavaScript] 纯文本查看 复制代码
这波属实是半场开香槟——给爷整笑了。 STEP7 兄弟们,干就完事了。 现在有两种可能,一是魔改的 RSA 算法,存在一个常数,这样就只需要提供另一个数就行了;二是,这压根不是 RSA 算法。 不过这两种路子殊途同归,直接一个断点,打到 `getPublicKey` 里面。如果是魔改,必定有常数,如果不是,那也有提示。 可以看到这是一个乘法运算。RSA 中我怎么记得是没有乘法的呢? 放狗搜一下常数,哦哦哦哦哦哦.jpg 来了兄弟们,ecc-secp256k1 算法,也是非对称算法。这是用椭圆曲线做的,难怪怎么只需要一个常数就可以了。 一把梭,直接开搞。 [Python] 纯文本查看 复制代码
STEP8 别高兴太早。 出来的是 3e2a3bbd2dfe8675bc40b0b0af6a558421b827b5ad022c8d305eb861b9bfdcc48aea1243df77a6298dfd5cf692a407852b3fd996ea5a13ae213c4380bb7b8d0d, 奇怪,算法搞错了? 别急,这不还没调完嘛。。。 [JavaScript] 纯文本查看 复制代码
是吧,04 是后续转 HEX 的时候手动加上的。这证明算法已经掌握了。 (( 经坛友提醒,04 指的是未压缩 ECC 公钥,细节可以看这篇文章 https://asecuritysite.com/ecc/js_ethereum2 )) 算法搞完了,回过头看看公私钥对是咋生成的,这玩意不会有啥稀奇古怪的限制吧。 现在有两点已经掌握:
大致可以分析出来,只需要生成私钥就可以了,而且是在初始化的时候。 没有限制,随机生成,完美收官。 STEP10 搞完了生成、算法,但是签名呢?哎,没想到吧,前面已经提到了哦!
那你肯定要问了,楼主楼主,nonce 一开始是 0,后面会不会变捏? 目测是超时后生成新的 nonce。 更新时间随机的。 这里 nonce 只起限位作用,每次更新 +1,初始值为零,更新时间随机。 那你肯定又要问了,楼主楼主,appId、deviceId、userId 捏? 开积写 把前面导完的东西积一下,首先生成密钥对,发送公钥至阿里云盘,后续则使用这个密钥对进行签名。 STEP1 生成密钥对 [Python] 纯文本查看 复制代码
STEP2 生成并处理公钥 [Python] 纯文本查看 复制代码
STEP3 签名 [Python] 纯文本查看 复制代码
至于发送这种小事,完整代码直接见仓库吧,贴完文章太长没眼看了。 这里有个坑点,非对称签名每次签同样的内容产生的签名是不一样的,但是似乎阿里云盘直接简单处理了。 后记
|
-
sshot-6.png (223.4 KB, 下载次数: 1)
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!603313839@qq.com
2. 请您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容资源
3. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
4. 不保证所提供下载的资源的准确性、安全性和完整性,源码仅供下载学习之用!
5. 不保证所有资源都完整可用,不排除存在BUG或残缺的可能,由于资源的特殊性,下载后不支持退款。
6. 站点所有资源仅供学习交流使用,切勿用于商业或者非法用途,与本站无关,一切后果请用户自负!