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

news/2024/7/17 13:58:26

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://lihuaxi.xjx100.cn/news/2233104.html

相关文章

适合学习通考试的搜题软件?四个公众号和软件推荐清单! #微信#微信#其他

积极参加社团活动和实践项目,可以帮助大学生拓宽人脉圈和锻炼实际操作能力。 1.酷学习 酷学习网站全内容全覆盖,其涵盖面包括了从小学到大学庞大的知识群 内容主要包括数学、物理、化学、英语、生物、语文、历史、地理的教学视频,包括小升…

如何高效配置与使用Pip换源

目录 1. Pip源的基本概念 1.1 常见的国内镜像源 2. 临时换源 2.1 使用命令行参数指定镜像源 2.2 安装多个包时指定镜像源 3. 永久换源 3.1 修改用户级配置文件 3.1.1 创建和编辑配置文件 3.2 修改全局配置文件 3.2.1 创建和编辑全局配置文件 4. 验证换源配置 5. 切…

【组件缓存相关生命周期函数】

在Vue开发中,有时需要在组件被激活或者被缓存时执行某些操作。为此,Vue 提供了组件缓存相关的生命周期函数,可以监听组件被激活和组件被缓存的事件。当组件被激活时,会触发组件的onActivated( )生命周期函数;当组件被缓存时&#…

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

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

板凳-------第58章SOCKET:TCP/IP网络基础

58.1 互联网 互联网会将不同的计算机网络连接起来并允许位于网络中的主机相互之间进行通信。互联网的目标是隐藏不同物理网络的细节以便向互联网中的所有主机呈现一个统一的网络架构,TCP/IP已经成了使用最为广泛的协议套件了, 术语Internet被用来指将全球…

在超线程CPU上切换到另一个线程

在超线程CPU上切换到另一个线程,主要涉及到的是上下文切换的过程。超线程技术允许单个CPU核心同时执行多个线程,提高了CPU的并行计算效率。当需要从一个线程切换到另一个线程时,CPU会进行一系列的操作来确保线程之间的顺利切换。 首先&#…

谷歌浏览器截图

一 右击,然后点击检查; 二 然后ctrlshiftp,运行命令; 三 3.1搜索截图: 如果你设置为中文,搜索截图,选择你想要的截图类型; 如果你是在英文情况下: 输入capture full size 来过滤…

小型语言模型的兴起

介绍 小型语言模型是一种用于处理和生成人类语言的神经网络。与大型语言模型一样,它们也使用大量文本数据进行训练,从而能够学习语言中的模式、关系和细微差别。不过,小型语言模型的规模较小,这意味着它们需要的计算资源较少&…