【JS逆向百例】某点数据逆向分析,多方法详解

news2024/12/28 1:54:15

0

前言

最近收到粉丝的私信,其在逆向某个站点时遇到了些问题,在查阅资料未果后,来询问K哥,K哥一向会尽力满足粉丝的需求。网上大多数分析该站点的教程已经不再适用,本文K哥将提供 3 种解决方案,对于 webpack 不太熟练的小伙伴来说,这是一个很好的练手案例:

7g4HjG.png

逆向目标

  • 目标:某点数据,排行榜
  • 地址:aHR0cHM6Ly9hcHAuZGlhbmRpYW4uY29tL3JhbmsvaW9zLw==

逆向过程

抓包分析

打开开发者人员工具,随便打开一个区域排行榜,在 Network 中即会抓包到相应的排行榜数据接口,即

/pc/app/v1/rank ,响应内容如下:

7gCT1P.jpg

请求参数如下,其中主要参数为 K 参数,需要通过算法生成,其他参数 time,country_id 等,是时间戳以及一些固定的 id 值,k 值每次都会发生变化,需要进行分析研究:

7gCLQ6.jpg

本文将会用多种方法实现数据的采集,适合不同的技术群体。

协议采集

逆向分析

该接口是通过 XHR 进行请求的,我们直接下一个 XHR 断点 api.diandian.com/pc/app/v1/rank,刷新排行榜,成功断了下来:

7gCn3Q.jpg

并没有发现任何 k 值,所以我们找网络拦截器,通过堆栈找到 m.request 的地方,在此处下一个断点,断下来以后,查看 m 变量,里面存储了很多回调方法:

7gCI5f.jpg

通过查看 m 方法,我们在 onRequest 方法上下一个断点,同时在方法末尾也下断点,同时将上图的断点进行方向,再次查看排行榜,发现在 onRequest 上成功断了下来。同时我们发现,在调用 t 函数之前并没有 k 参数的生成:

7gCMCc.jpg

我们继续执行,在方法结束末尾断点断了下来,发现右侧已经有 k 参数的生成。所以,由此判断,k 参数是通过 t 函数生成的:

7gCiB3.jpg

我们进入 t 函数,在函数的开头和结尾分别下一个断点,发现通过 M 函数以后,生成了 k 值:

7gCZq4.jpg

继续跟进 M 函数,我们查看 k 值是如何生成的:

7gCdDh.jpg

通过分析得到 k 值的生成逻辑为:

var r = h()(t.params, !1)
    , o = Object(y.a)(r, path, {
    s: n.s,
    k: n.k,
    l: n.l,
    d: n.d,
    sort: n.sort,
    num: n.num
}, "get");
t.params.k = o

所以他是通过 y.a 传入 r、path 以及大数组生成的,我们可以通过将 y.a 函数扣出来实现 k 参数的生成。

第一种思路我们可以看看 y 函数是如何被定义,可以看到它是 webpack 打包,调用 2294 模块来实现的:

7gJ93Y.jpg

第二种思路,我们进入 y.a 函数,进行算法的还原,其生成逻辑如下:

7gCef9.jpg

发现是通过 Object(l.b) 函数加密成字节集,然后通过 t.from 方法编码成 base64 进行展示,所以我们只需将这两部分进行算法还原即可复现 k 参数的生成,当然本文将会用不同的方法进行分析。

手动 webpack + 补环境

在 y=n(2294) 下断点,刷新排行榜,在该行成功断下来:

7gJkAH.jpg

进入分发器 n 中,将 runtime.js 全部拿下,放到我们本地:

7gJBCZ.jpg

拿到本地以后,将分发器导出,window.kk=r

7gMn34.jpg

控制台通过 n.m[模块名] 将所需的模块进行查找:

7gJpgq.jpg
拿到对应模块后,将 js 里的模块复制放到我们刚刚扣的分发器中:

7gJLRs.jpg
通过模块,调用加密函数,查看报错信息:

a = window.kk(2294)
r = {
    "start_time": 1717776000,
    "end_time": 1718345618
}
n = {
    "proxy": "/app",
    "target": "",
    "sort": "dd",
    "num": 10,
    "s": "d044bec62c1c9f9eee1ebd567e501719",
    "k": "93086c0e7c41cf46",
    "l": "091043cf5d1393af",
    "d": 0
}
path = "/v2/user/monitor/msg"
o = Object(a.a)(r, path, {
    s: n.s,
    k: n.k,
    l: n.l,
    d: n.d,
    sort: n.sort,
    num: n.num
}, "get");
console.log(o)

7gJ0Za.jpg

这种错误就是提示缺少对应模块,我们只需根据调用堆栈向上查看,补上缺失的模块即可:

7gJlu7.jpg

然后在控制台用 n.m[模块名] 进行模块查找,然后重复上述操作将找到的模块放入分发器即可,它这个站模块分布在几百个 js 中,也算是一种代码混淆了:

7gJqAJ.jpg

最后板凳坐穿,全部模块找完大概 6w 多行代码吧,结果如下:

7gJ7DI.jpg

自动扣 webpack 模块

网上自动扣 webpack 的方法很多,但是对于几百个 js 文件的模块来说,可能就不太适用,上部分手动通过 n.m[模块名] 进行模块查找的方法是最通用的,但是对于多个 js 文件模块就略显繁琐。所以我们可以通过重写分发器的方法,将加载的模块自动保存然后导出。

首先方法同上,先找到分发器的位置,在 r.e 及它之前下个断点:

7gJuJG.jpg

刷新页面,发现在 r.e 的地方成功断住,我们将以下 js 代码在控制台进行注入:

window.code = '';
r = function (e) {
    if (r[e])
        return r[e].exports;
    var d = r[e] = {
        i: e,
        l: !1,
        exports: {}
    };
    console.log(e)

    window.code += e + ':' + o[e] + ',\r\n'
    return o[e].call(d.exports, d, d.exports, r),
        d.l = !0,
        d.exports
}

然后回车刷新浏览器,进行一遍查看排行榜的操作,发现控制台就会自动打印加载的模块:

7gJyTB.jpg

控制台输入 copy(window.code) 将模块导出,然后同上述方法一样放到分发器中即可,再挂上代理,将常规的 document、navigator 补一下即可调用。最后结果如下:

7gJHgt.jpg

算法还原

分析完 webpack 与补环境以后,我们最后来讲讲如何用算法生成。上文提到,我们进入 y.a 函数后,发现他主要是通过 Object(l.b) 和 t.from 这两个函数生成的,进入 Object(l.b) 发现是一个 AES 方法:

7gJKYb.jpg

其中又发现了这个 t.from 方法,这个方法其实就是一个 utf8 编码,复现如下:

t=[]
t.from=function (hexString, encoding) {
    if (encoding !== "utf8") {
        throw new Error("Unsupported encoding");
    }

    // 将每个字符转换为对应的 UTF-8 编码的数值
    let byteArray = new Uint8Array(hexString.split('').map(char => char.charCodeAt(0)));

    return byteArray;
}

剩余的加密方法,我们引库复现即可:

const crypto = require('crypto');
var c = crypto.createDecipheriv("aes-128-cbc", n, o);
return d += c.update(e, "hex", "utf8"),
    d += c.final("utf8")

同时将 c 与 _ 这俩个函数也补一下(补函数的话,遵循和原函数一致即可,如果读不懂原函数,可能就会卡在某一部分):

function c(a) {
    return function(t) {
        return t;
    };
}
var n = c()(t);  

function _(n) {
    return typeof n === 'object' && n !== null;
}

最后全部函数实现完毕以后,结果如下:

7gJbZe.jpg

只需 70 行即可完成 k 参数的生成,至此全部流程分析完毕。

八爪鱼采集

对于新手来说,0 代码实现数据采集是不二选择,同时他还可以设置代理 IP 进行免封操作。使用教程也非常简单,进入官网选择对应的系统版本进行下载安装:

7gC0vO.jpg

安装完成以后打开软件,首先看到的是他拥有一个模板采集,里面内置了很多已经配置好的采集任务,点击即可一键应用:

7gC7Lf.jpg

我们点击“模板”或者“更多”,搜索点点数据,发现搜索未果:

7gCExc.jpg

那我们只能手动去新建一个任务,选择左侧新建,然后输入你要采集的网址:

7gCQ43.jpg

进去以后,等待网页加载完毕,然后选择自动识别,它会根据页面的布局自动生成几套采集模板:

7gCgIY.jpg

同时你也点击切换识别结果来自由切换识别模板:

7gCba9.jpg

很多时候识别的结果不尽如意,你可以选择删除某些多余的字段,同时也可以点击页面元素进行文本提取或者鼠标点击等操作:

7gCWPa.jpg

在所有需要采集的东西都配置完毕以后,我们可以点击设置,进行代理的设置:

7gCU0J.jpg

这里代理选择,我们采用快代理的私密代理或者独享代理进行配置即可:

7gCOML.jpg

所有任务都准备完成以后,即可保存进行任务的采集:

7gCaNI.jpg

关于八爪鱼进阶的玩法还有自动打码与点击翻页等,特殊场景需要进行更多的实际应用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1857188.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

「51媒体」时尚类媒体邀约宣发资源

传媒如春雨,润物细无声,大家好,我是51媒体网胡老师。 时尚类媒体邀约宣发资源可以多样化且针对性地满足品牌或活动的推广需求。以下是一些主要的资源及其特点: 时尚杂志:国内外知名时尚杂志,如《Vogue》、…

2024.6.24 IDEA中文乱码问题(服务器 控制台 TOMcat)实测已解决

1.问题产生原因: 1.文件编码不一致:如果文件的编码方式与IDEA设置的编码方式不一致,就会产生乱码。确保文件和IDEA使用相同的编码,通常是UTF-8。2.IDEA设置问题:检查IDEA的全局编码设置和项目编码设置是否正确。3.终端…

晨持绪科技:开好一家抖音小店运营怎么做

在数字时代,抖音小店以其独特的社交媒体优势迅速崛起,成为许多创业者的新宠。但如何有效运营,却是一门学问。首要任务是确定你的小店定位,这关系到后续的产品选择、目标客户群及营销策略。定位明确后,接下来便是挑选适…

智慧环保一体化平台登录

据悉,在当今这个数字化、智能化的时代,环境保护工作也需要与时俱进,不断创新。朗观视觉智慧环保一体化平台应运而生,它利用先进的信息技术手段,为环保工作提供了更加便捷、高效的管理方式,成为推动绿色发展…

对的礼物送给对的人,送礼物的技巧和学问

一、教程描述 无论是商务往来,还是求人办事,送礼都是不可或缺的一种交际手段。想要建立好的人脉关系网,想要把事儿办成,一定要把对的礼物送给对的人,否则必是竹篮打水一场空。送礼是一门学问,同时&#xf…

Kubernetes排错(十)-处理容器数据磁盘被写满

容器数据磁盘被写满造成的危害: 不能创建 Pod (一直 ContainerCreating)不能删除 Pod (一直 Terminating)无法 exec 到容器 如何判断是否被写满? 容器数据目录大多会单独挂数据盘,路径一般是 /var/lib/docker,也可能是 /data/docker 或 /o…

FLASH仿真EEPROM---基于智芯Z20K11XM

一、介绍 电可擦和可编程只读存储器(EEPROM)可以对字节或字编程和擦除。EEPROM中的数据即使断电也能保持,但Z20K1xx芯片不含EEPROM。然而,闪存可以通过EEPROM仿真软件来模拟EEPROM。Z20K1xx包含两个flash阵列。编程和擦除操作可以在一个数组上进行&#…

Spring注解源码解析

一、Spring IOC常用注解 1、用于Bean申明的注解 2、用于定义Bean配置的注解 3、其他用途的注解 二、基于注解容器AnnotationConfigApplicationContext AnnotationConfigApplicationContext的其中一个构造方法,传入Java config类,refresh过程实例化Bean…

大模型时代下的技术变革:训练、负载、部署、效率、安全……都遇到了新挑战?

随着互联网的快速发展,AI 大模型算的上是当前行业里最“炽手可热”的技术,大模型是 AI 领域的重要发展趋势。大模型需要大量的数据和计算资源,同时也需要强大的应用场景支持,对各行各业都有深远的影响,各厂商开始了“千…

Excel 宏录制与VBA编程 —— 11、工作表及工作簿操作(附:Worksheets与Sheets区别)

代码1 - Worksheets与Sheets区别 Worksheets表示普通工作表;Sheets即可表示普通工作表也可表示图标工作表。 下面模块中代码结果是一样的,大家理解时可结合上面区别说明进行了解 Sub Test()Worksheets("Sheet1").Range("A1").Value 100Sheets("Sheet…

农业四情监测设备——提高农业生产的效率和质量

TH-Q1农业四情监测设备是用于实时监测农业领域的四大关键监测内容的设备,这些内容包括土壤墒情、苗情、病虫情和灾情。以下是关于农业四情监测设备的详细介绍: 主要用于实时测量农田土壤的水分状况。包含土壤湿度传感器、土壤温度传感器等,安…

如何处理优化这个慢查询——Java全栈知识(27)

2 、如何处理优化这个慢查询 如何定位慢查询:1、如何定位慢查询 explain 计划 面试官: 那这个 SQL 语句执行很慢, 如何分析呢? 候选人: 如果一条 sql 执行很慢的话,我们通常会使用 mysql 自动的执行计划 explain 来…

电磁场与电磁波作业题及解析

目录 第一章 1.5 1.8 1.11 1.21 第二章 2.4 2.13 2.27 第三章 3.7 3.8 3.17 3.18 第四章 4.2 4.16 第五章 5.2 第六章 6.9 6.30 第七章 7.3 第一章 1.5 1.8 1.11 1.21 第二章 2.4 2.13 2.27 第三章 3.7 3.8 3.17 3.18 第四章 4.2 4.16 第五章 5.2…

【Python新手入门指南】Linux-conda环境安装与使用参考

文章目录 前言一、conda是什么?二、安装步骤三、使用Conda来管理Python环境1. 创建环境2. 激活环境3. 安装软件包4. 查看环境5. 删除环境:如果您不再需要某个环境,可以使用以下命令将其删除: 前言 如果你是一位经验丰富的Python开…

Windwos +vs 2022 编译openssl 1.0.2 库

一 前言 先说 结论&#xff0c;编译64位报错&#xff0c;查了一圈没找到解决方案&#xff0c;最后换了32位的。 使用qt访问web接口&#xff0c;因为是https&#xff0c;没有openssl库会报错 QNetworkReply* reply qobject_cast<QNetworkReply*>(sender());if (reply){…

开放式耳机哪种好用又实用?开放式耳机必入品牌推荐,内行人分享

随着数码技术的不断推出各种各样的新产品&#xff0c;开放式耳机已经逐渐成为有份音乐发烧友的选择&#xff0c;这类耳机从早期的简单音质发展至今日的高解析度&#xff0c;其技术进步&#xff0c;也吸引了一大批开放式耳机的爱好者&#xff0c;开放式耳机以其开放式的设计&…

分布式光纤测温DTS如何与第三方数据对接?

分布式光纤测温DTS与第三方数据对接可以采用多种方式和接口。常见的接口包括RS485、RJ45网口、继电器接口和RS232接口等&#xff0c;而协议种类更是多达几十种之多。主流的协议包括modbusRTU、modbusTCP、点表协议、南网协议、电力json协议、IEC104和61850协议等。根据不同的需…

巧用SOLIDWORKS进行复杂曲面模型的实体建模

SOLIDWORKS正版软件有实体建模、曲面建模、钣金建模、焊件建模、模具建模等多种建模方式&#xff0c;每种建模方式都有独特的使用环境和场景&#xff0c;如果能灵活使用这些建模命令&#xff0c;就可以起到事半功倍的效果。 如上图所示的模型&#xff0c;通过观察和分析&#x…

【单调栈】1130. 叶值的最小代价生成树

1130. 叶值的最小代价生成树 难度&#xff1a;中等 力扣地址&#xff1a;https://leetcode.cn/problems/minimum-cost-tree-from-leaf-values/description/ 题目内容 给你一个正整数数组 arr&#xff0c;考虑所有满足以下条件的二叉树&#xff1a; 每个节点都有 0 个或是 2 个…

机器视觉光源丨CCS高显色LED光源方案实现精准色彩成像

机器视觉系统中&#xff0c;光源设计作为图像成像效果的关键&#xff0c;今天我们一起来看看自然光领域的光源方案&#xff0c;以CCS光源来说&#xff0c;高显色(自然光)LED光源&#xff0c;使用了实现接近基准光源(太阳光和白炽灯)的自然发光颜色。它主要用于辨色检测、测色检…