吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 4161|回复: 66
上一主题 下一主题
收起左侧

[Web逆向] 某动云盘分享得云朵逆向分析

  [复制链接]
跳转到指定楼层
楼主
kittylang 发表于 2024-3-9 22:21 回帖奖励
本帖最后由 kittylang 于 2024-3-10 10:49 编辑

前言

注册好几年了,才几十积分,想着写点东西刷刷积分争取早日到 200,可是空瓶子又倒不出啥技术,前段时间不是发了个某云盘每日任务的脚本么,干脆就记录一下抓取 API 的过程吧。

没有技术含量,就想着记录仔细点,万一哪个萌新看到了呢。

活动分析

先看看活动位置

pFyZxeS.jpg

pFyZjL8.jpg

理一下任务步骤

  1. 点击去查看,到达活动页面,发现就是底部栏的"发现"页面
  2. 点击分享,弹出分享方式
  3. 不分享直接退出活动,查看任务是否完成。(答案是并没有)
  4. 回到第二步,不过这次需要点击某个方式了
  5. 分享成功后,查看任务是否完成。(ok 的)
  6. 云盘这个任务点进 QQ 就行了,不用真发送也能成功完成任务

那么抓包就是重点分析第 4 步了,如果没成再看前面的(因为有时候活动需要前置请求激活才能完成)。

HttpCanary 抓包

通过上面的分析,我们在弹出分享方式后,打开抓包,点击 QQ 后停止抓包,这样可以获得较少的请求(如果没有找到想要的才扩大范围)。

抓取到 12 条请求

pFyeWfs.jpg

简单的查看 url 和 请求体,并没有发现可疑的有 share 关键字或者类似的请求。

先尝试下重放请求。发一条请求查看一下云朵记录,结果重放第一条就行了,这就是运气吧!再重放两次也是 OK 的。

pFyeRYj.jpg

请求分析

POST /datacenter/ HTTP/1.1
Host: datacenter.mail.10086.cn
Connection: keep-alive
Content-Length: 1731
sec-ch-ua: "Not A(Brand";v="99", "Android WebView";v="121", "Chromium";v="121"
Content-type: application/x-www-form-urlencoded
platform: h5
source: content-open
User-Agent: Mozilla/5.0 (Linux; Android 13; mi6 Build/TP1A.220624.014; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/121.0.6167.178 Mobile Safari/537.36 MCloudApp/10.5.1
sec-ch-ua-mobile: ?1
sec-ch-ua-platform: "Android"
Accept: */*
Origin: https://h.139.com
X-Requested-With: com.chinamobile.mcloud
Sec-Fetch-Site: cross-site
Sec-Fetch-Mode: cors
Sec-Fetch-Dest: empty
Referer: https://h.139.com/content/discoverNewVersion?columnId=20&token=STuid0000011008510086uasdjikoadakhbsw&targetSourceId=001005
Accept-Encoding: gzip, deflate, br, zstd
Accept-Language: zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7

data=eyJ0cmFjZUlkIjo5Nzxxxxxxxxxxxxxxxxn0%3D&ext=crc%3D-1412813306

可以看到在 Header 中既无 Cookie 也无 Authorization,那么鉴权信息只能是在请求体中了。

先看 data,eyJxxx 开头,最后%3D(就是=编码后的),典型的 base64 啊,打开在线工具查看一下,先 URL 解码(因为这个复制出来有%3D 之类的),再 Base64 解码

得到了

pFym6jx.md.png

不急着分析字段,接下来看 ext。

ext=crc=-1412813306 这硬看也看不出啥名堂,只知道是 CRC 循环冗余校验

目光再次来到请求,发现 Referer 是个网页

pFynirV.md.png

这也就简单多了,直接查看调用栈,试着 debuger

pFynn2R.png

先搜素一下关键字 crc=

pFynmG9.png

搜索下 hashCode,好家伙,直接出结果了,debugger 都免了。这不就是 Java 的 hashCode 用 JavaScript 实现的么?

_.hashCode = function (str) {
  if (typeof str !== 'string') {
    return 0;
  }
  var hash = 0;
  var char = null;
  if (str.length == 0) {
    return hash;
  }
  for (var i = 0; i < str.length; i++) {
    char = str.charCodeAt(i);
    hash = (hash << 5) - hash + char;
    hash = hash & hash;
  }
  return hash;
};

把 data 传入尝试一下得到 -1412813306,ok,结束了。

编写代码

直接在浏览器中运行一下

const data = {
  traceId: Number(Math.random().toString().substring(10)),
  tackTime: Date.now(),
  distinctId: '18d7cccee76678-08d30cfe3e81ee8-4c657b58-1327104-18d7cccee7711fc',
  eventName: 'discoverNewVersion.Page.Share',
  event: '$manual',
  flushTime: Date.now(),
  model: 'Nexus 5',
  osVersion: '',
  appVersion: '',
  manufacture: 'LG',
  screenHeight: 700,
  os: 'Android',
  screenWidth: 352,
  lib: 'js',
  libVersion: '1.17.2',
  networkType: '',
  resumeFromBackground: '',
  screenName: '',
  title: '【精选】一站式资源宝库',
  eventDuration: '',
  elementPosition: '',
  elementId: '',
  elementContent: '',
  elementType: '',
  downloadChannel: '',
  crashedReason: '',
  phoneNumber: '10086',
  storageTime: '',
  channel: '',
  activityName: '',
  platform: 'h5',
  sdkVersion: '1.0.1',
  elementSelector: '',
  referrer: '',
  scene: '',
  latestScene: '',
  source: 'content-open',
  urlPath: '',
  IP: '',
  url: 'https://h.139.com/content/discoverNewVersion?columnId=20&token=STuid0000011008510086uasdjikoadakhbsw&targetSourceId=001005',
  elementName: '',
  browser: 'Edge',
  elementTargetUrl: '',
  referrerHost: '',
  browerVersion: '122.0.0.0',
  latitude: '',
  pageDuration: '',
  longtitude: '',
  urlQuery: '',
  shareDepth: '',
  arriveTimeStamp: '',
  spare: { mobile: '10086', channel: '' },
  public: '',
  province: '',
  city: '',
  carrier: '',
};

function hashCode(str) {
  if (typeof str !== 'string') {
    return 0;
  }
  var hash = 0;
  var char = null;
  if (str.length == 0) {
    return hash;
  }
  for (var i = 0; i < str.length; i++) {
    char = str.charCodeAt(i);
    hash = (hash << 5) - hash + char;
    hash = hash & hash;
  }
  return hash;
}

// btoa 是浏览器的内置方法,nodejs 没有,node 直接使用 Buffer 
const base64 = btoa(JSON.stringify(data));

const res = await fetch('https://datacenter.mail.10086.cn/datacenter/', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/x-www-form-urlencoded',
    platform: 'h5',
  },
  body: `data=${base64}&ext=${encodeURIComponent('crc=' + hashCode(base64))}`,
});

console.log(await res.json());

起初用的是最精简的 Header,并没有增加云朵,依次测试后发现 platform 是必须的。

直接修改 phoneNumber 为小号的手机号码,测试成功。

修改 traceId,distinctId 这些后也是成功的,最后发现其实大部分字段都是可以删除的,确定用户身份唯一字段就是 phoneNumber。也就是不需要登录,只要手机号码就可以完成这个任务了。

其他

编辑

有同学已经发现之前的代码再浏览器中并不能成功运行,出现了

VM2516:1 Uncaught DOMException: Failed to execute 'btoa' on 'Window': The string to be encoded contains characters outside of the Latin1 range.
    at <anonymous>:1:1

值得庆幸的是,有人真的试了。但是为啥不去尝试解决呢。

翻译一下

无法在“Window”上执行“btoa”:要编码的字符串包含 Latin1 范围之外的字符。

直接百度你就能得到一个 btoa(unescape(encodeURIComponent(JSON.stringify(data)))) 这样的结果,不是太简单了么?

当然,你已经看完这篇文章,_.hashCode 找到了,用同样方式找到  _.base64Encode 不就行了。

发这个的目的不是为了发最后那几行代码,而是分析一个简单的过程,授人以鱼不如授人以渔。这几行代码没有太多的意义,我已经在站内分享了这个开源程序(前言提到的)

免费评分

参与人数 36吾爱币 +40 热心值 +29 收起 理由
sshl + 1 + 1 我很赞同!
bbybbx + 1 + 1 热心回复!
bingpo666 + 1 + 1 我很赞同!
zzb891219 + 1 用心讨论,共获提升!
wuhaolam + 1 谢谢@Thanks!
daizhanpeng + 1 + 1 谢谢@Thanks!
hulbh + 1 谢谢@Thanks!
ning22 + 1 + 1 我很赞同!
sivion + 1 + 1 感谢大佬分享
kobihelicopter + 1 热心回复!
AMX1216 + 1 谢谢@Thanks!
shanhe759 + 1 谢谢@Thanks!
bingys + 1 + 1 我很赞同!
qxiaoguiq + 1 + 1 谢谢@Thanks!
TxTbiu + 1 我很赞同!
au21 + 1 谢谢@Thanks!
huge1988 + 1 + 1 用心讨论,共获提升!
PowerKing + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!我正在学习JS逆向,感谢你的分.
温馨提示 + 1 + 1 我很赞同!
arctan1 + 1 + 1 热心回复!
chinawolf2000 + 1 + 1 热心回复!
ssdlh + 1 + 1 我很赞同!
我忘多 + 1 热心回复!
janken + 1 + 1 热心回复!
yndoc + 1 用心讨论,共获提升!
skiss + 1 + 1 谢谢@Thanks!
amouer + 1 + 1 谢谢@Thanks!
pdcba + 1 + 1 谢谢大佬分享!
www0313 + 1 + 1 我很赞同!
唐小样儿 + 1 + 1 我很赞同!
Sayon + 2 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
fzhhn + 1 + 1 我很赞同!
深情不及久伴 + 1 用心讨论,共获提升!
languor + 1 + 1 用心讨论,共获提升!
Arcticlyc + 2 + 1 用心讨论,共获提升!
爱飞的猫 + 7 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!

查看全部评分

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

推荐
anson1599 发表于 2024-3-10 09:34
是不是可以做成自动签到的脚本了?
推荐
pdcba 发表于 2024-3-11 08:30
谢谢大佬分享,上次用了wps脚本,很好用,之前显示2个每日任务完成情况有点问题,尝试修改了一下。想学整个工作的方法论,没想到就有这一篇 文章了,谢谢!
沙发
89684828 发表于 2024-3-10 08:59
4#
devilpanama 发表于 2024-3-10 09:53
时间戳需要实时么
5#
blackdarks 发表于 2024-3-10 09:59
楼主能讲讲代码如何使用吗?我直接在PC网页F12输入代码好像反馈有bug
6#
BestSum 发表于 2024-3-10 10:12
楼主是否可以做一个自动化签到的脚本,可以一键把任务能做的都做了,还有那个pc登录,每个月都要发一次验证码登录,烦得很。。
7#
p100200300 发表于 2024-3-10 10:31
感谢分享!
8#
readboy 发表于 2024-3-10 10:44
这个好,我的也比较少,可以用这个了。
9#
 楼主| kittylang 发表于 2024-3-10 10:52 |楼主
blackdarks 发表于 2024-3-10 09:59
楼主能讲讲代码如何使用吗?我直接在PC网页F12输入代码好像反馈有bug

btoa 的参数有问题是吧,查看编辑后的最后一部分,把 btoa 替换为那一行就行了
10#
 楼主| kittylang 发表于 2024-3-10 10:53 |楼主
devilpanama 发表于 2024-3-10 09:53
时间戳需要实时么

重放请求能成功就说明不需要实时,但不确定时间戳是否有用,此前有类似的接口,其时间戳会在过后几天内失效。所以怕有问题直接实时即可
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则 警告:本版块禁止灌水或回复与主题无关内容,违者重罚!

快速回复 收藏帖子 返回列表 搜索

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

GMT+8, 2024-4-29 10:09

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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