吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 2174|回复: 7
收起左侧

[Web逆向] 浅谈某云盘签名算法的分析与如何生成

[复制链接]
libw 发表于 2024-4-1 10:35
本帖最后由 libw 于 2024-4-1 20:25 编辑

声明

本文章中所有内容仅供学习交流使用,不用于其他任何目的,不提供完整代码,抓包内容、敏感网址、数据接口等均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关!
听说最近好像更新了算法,来试试手
新人发帖,请多多指教,各位大佬手下留情
该请求头构建时还有其它参数和载荷数据涉及敏感信息甚至违规,所以已全做打码处理

目标


  • POST提交时请求标头中特定Sign参数值的分析与生成
  • 接口地址:aHR0cHM6Ly95dW4uMTM5LmNvbS9vcmNoZXN0cmF0aW9uL3BlcnNvbmFsQ2xvdWQvY2F0YWxvZy92MS4wL2dldERpc2s=
  • 启动!提交!

抓包


如图所示,三次请求时的荷载除了commonAccountInfo中的account值是跟着用户登录信息变化以外,其它的值全部写死了

抓包001

抓包001

抓包002

抓包002

抓包003

抓包003

再来看请求头,这个值由三段内容组合,大致为:
  • 现在时间
  • 一串16位的字符串
  • 一个关键的信息*

抓包004

抓包004


分析


鉴于代码没有混淆,直接全局搜索对应参数名,也是中奖了
它由i、o、s三个值组成,用逗号分隔,然后直接拼接到一起

往上找var得知:
o:通过往c.a的getRandomSring方法传入一个16整数,获得了一段随机的16位字符串文本
r:通过新建出来的Date对象中getTime方法获得当前时间戳
i:通过往l对象中的t方法传入r和2个空文本参数获得当前时间(应该就是一个时间戳转换方法)
s:通过往c.a的getNewSign方法传入4个参数来获得关键信息;t.params在当前接口请求是undefinedt.data是载荷,i和o我们已知

初见s值

初见s值

t.params

t.params

t.data

t.data


那就进去看看吧:

初见getNewSign方法

初见getNewSign方法

先对getNewSign方法进行一个解析
[JavaScript] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
A = {
    getNewSign: function (t, e, a, n) {
        var sign = ""; // 初始化 sign 字符串
        var encodedData = ""; // 初始化编码后的数据字符串
 
        // 如果存在额外参数(也就是载荷)
        if (e) {
            // 克隆参数对象,避免修改原对象
            var clonedParams = Object.assign({}, e);
 
            // 将参数对象转换为 JSON 字符串,并进行 URL 编码
            encodedData = JSON.stringify(clonedParams);
            encodedData = encodeURIComponent(encodedData);
 
            // 将编码后的字符串转换为数组,然后排序
            var encodedArray = encodedData.split("");
            var sortedArray = encodedArray.sort();
 
            // 将排序后的数组转换为字符串
            encodedData = sortedArray.join("");
        }
 
        // 使用 Base64 编码处理编码后的数据
        var base64EncodedData = btoa(encodedData);
 
        // 拼接a和n(也就是现在时间和随机字符串),并使用 Base64 编码处理
        var base64EncodedCredentials = btoa(a + ":" + n);
 
        // 将编码后的数据和编码后的凭据连接在一起,并将结果转换为大写形式
        sign = Md5(base64EncodedData + base64EncodedCredentials).toUpperCase();
 
        return sign;
    }
}

此方法的目的是生成一个签名,用于验证POST提交的数据是否合法,以及时间校验等
方法接受四个参数:t、e、a、n
其中 t 是一个占位符,似乎没有被使用,不知道以后再更新算法会不会加进去(再拼接一次doge
e 是一个对象,包含额外的参数,也就是载荷
a 和 n 是现在时间和随机字符串
方法的主要逻辑是将参数进行一系列处理,然后使用标准的 MD5 加密算法生成一个签名


实战


至此,我已完全参透了算法,是时候掏出器灵(Python)来实战了

实战

实战

成功,开香槟~

后话


不是很建议像我这样去用器灵请求服务器或者干别的事情,据说有风控,次数多了会喜提禁令,请各位自重!
如有错误请指出,同时也感谢您的阅读,您的指点就是我进步的动力
今天是美好的一天,也祝您拥有美好的心情

免费评分

参与人数 2威望 +1 吾爱币 +21 热心值 +1 收起 理由
涛之雨 + 1 + 20 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
kittylang + 1 说是脱敏,但是标题不就是人家的名字吗

查看全部评分

本帖被以下淘专辑推荐:

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

l101 发表于 2024-4-1 20:15
好像没有完全脱敏哦,而且不建议逮住一个老是搞事,搞多了喜提禁令,严重甚至有风险。毕竟人家用户基数大。
TheWeiJun 发表于 2024-4-2 11:40
FireHeadZoffy 发表于 2024-4-3 09:41
感谢分享,最近刚学到md5加密和base64编码JWT token。不过我听说某盘已经换了一次摘要计算方式了,一个文件会分块处理?
 楼主| libw 发表于 2024-4-4 12:02
FireHeadZoffy 发表于 2024-4-3 09:41
感谢分享,最近刚学到md5加密和base64编码JWT token。不过我听说某盘已经换了一次摘要计算方式了,一个文件 ...

对非秒传的话一直是分块;秒传的话,分不分块都一样,服务端只看载荷里的md5摘要
timodn 发表于 2024-5-1 00:24
谢谢大佬分享,学些了
hongjiu 发表于 2024-5-2 21:50
收藏一下,感谢分享破解
Dave5027 发表于 2024-5-19 12:27
有点意思
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2025-4-2 02:02

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表