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

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.rhkb.cn/news/359216.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[个人感悟] MySQL应该考察哪些问题?

前言 数据存储一直是软件开发中必不可少的一环, 从早期的文件存储txt, Excel, Doc, Access, 以及关系数据库时代的MySQL,SQL Server, Oracle, DB2, 乃至最近的大数据时代f非关系型数据库:Hadoop, HBase, MongoDB. 此外还有顺序型数据库InfluxDB, 图数据库Neo4J, 分布式数据库T…

【unity小技巧】unity事件系统创建通用的对象交互的功能

文章目录 前言实现1. **InteractEvent 类**:2. **Interact 类**:3. **Player 类**:4. **Chest 类**: 工作流程说明:开单个箱子按钮触发打开很多箱子拾取物品(传参)参考完结 前言 游戏开发过程中…

vue中用JSON格式查看数据(vue-json-viewer)

vue中把string用JSON格式展示数据 vue-json-viewer使用 官网地址:https://www.npmjs.com/package/vue-json-viewer 1. 安装插件vue-json-viewer //vue2 npm install vue-json-viewer2 --save //vue3 npm install vue-json-viewer3 --save2. 引入vue-json-viewer…

Kubernetes Dashboard

Minikube 环境搭建 Kubernetes 的基本架构 Kubernetes 声明式语言 YAML YAML操作Kubernetes核心对象 CentOs搭建Kubernetes集群 Kubernetes进阶对象Deployment、DaemonSet、Service Kubernetes进阶对象Ingress、Ingress Class、Ingress Controller Kubernetes集群部署项目实践 …

本地离线模型搭建指南-中文大语言模型底座选择依据

搭建一个本地中文大语言模型(LLM)涉及多个关键步骤,从选择模型底座,到运行机器和框架,再到具体的架构实现和训练方式。以下是一个详细的指南,帮助你从零开始构建和运行一个中文大语言模型。 本地离线模型搭…

基于Springboot + vue 的抗疫物质管理系统的设计与实现

目录 📚 前言 📑摘要 📑系统流程 📚 系统架构设计 📚 数据库设计 📚 系统功能的具体实现 💬 系统登录注册 系统登录 登录界面 用户添加 💬 抗疫列表展示模块 区域信息管理 …

APP自动化测试-Appium常见操作之详讲

一、基本操作 1、点击操作 示例:element.click() 针对元素进行点击操作 2、初始化:输入中文的处理 说明:如果连接的是虚拟机(真机无需加这两个参数,加上可能会影响手工输入),在初始化配置中…

【初阶数据结构】深入解析栈:探索底层逻辑

🔥引言 本篇将深入解析栈:探索底层逻辑,理解底层是如何实现并了解该接口实现的优缺点,以便于我们在编写程序灵活地使用该数据结构。 🌈个人主页:是店小二呀 🌈C语言笔记专栏:C语言笔记 &#x1…

论坛实现随机发帖的学习

1、badboy操作,录制发帖全过程,录制结果保存,生成为.jmx格式的文件 2、在Jmeter中打开该.jmx文件,重命名,便于了解步骤 3、生成结果树,查看所以步骤是否正确 4、实现随机发帖 断言:具有唯一表…

Java面试八股之什么是分布式垃圾回收

什么是分布式垃圾回收 分布式垃圾回收(Distributed Garbage Collection, DGC)是Java中一种特殊的垃圾回收机制,主要用于处理跨Java虚拟机(JVM)的远程对象引用时的内存管理问题。在分布式系统中,当一个JVM中…

yolov10打包为exe

一、前言 本节实验将官方yolov10推理程序打包为exe运行 二、代码 首先下载官方代码至本机,并使用conda创建虚拟环境,并安装好yolov10所需库 conda create --prefix E:/pyenv/myYolo10 python3.8 pip install -r requirements.txt 下载官方模型权重 …

【面试干货】Java中的四种引用类型:强引用、软引用、弱引用和虚引用

【面试干货】Java中的四种引用类型:强引用、软引用、弱引用和虚引用 1、强引用(Strong Reference)2、软引用(Soft Reference)3、弱引用(Weak Reference)4、虚引用(Phantom Reference…

在线装修管理系统的设计

管理员账户功能包括:系统首页,个人中心,管理员管理,装修队管理,用户管理,装修管理,基础数据管理,论坛管理 前台账户功能包括:系统首页,个人中心,…

【计算机网络】[第4章 网络层][自用]

1 概述 (1)因特网使用的TCP/IP协议体系(四层)的网际层,提供的是无连接、不可靠的数据报服务; (2)ATM、帧中继、X.25的OSI体系(七层)中的网络层,提供的是面向连接的、可靠的虚电路服务。 (3)路由选择分两种: 一种是由用户or管理员人工进行配置(只适用于规…

【开发工具】git服务器端安装部署+客户端配置

自己安装一个轻量级的git服务端,仅仅作为代码维护,尤其适合个人代码管理。毕竟代码的版本管理是很有必要的。 这里把git服务端部署在centos系统里,部署完成后可以通过命令行推拉代码,进行版本和用户管理。 一、服务端安装配置 …

爬虫阶段思考

内容:写这篇文章是因为最近帮同学改了很多的爬虫代码,感触良多。 我用豆瓣为例,并不是不会用别的,而是这个我个人感觉最经典。然后还会写我遇到的一些问题以及解决方法。 首先,我们得先知道怎样爬取。我用的scrapy框…

算法基础精选题单 动态规划(dp)(递推+线性dp)(个人题解)

前言&#xff1a; 一些简单的dp问题。 正文&#xff1a; 题单&#xff1a;237题】算法基础精选题单_ACM竞赛_ACM/CSP/ICPC/CCPC/比赛经验/题解/资讯_牛客竞赛OJ_牛客网 (nowcoder.com) 递推&#xff1a; NC235911 走楼梯&#xff1a; #include<bits/stdc.h> using na…

linux 关闭防火墙

文章目录 关闭系统防火墙关闭 linux 防火墙 关闭系统防火墙 systemctl stop firewalld systemctl disable firewalld // 关闭开机自启动 systemctl status firewalld // 查看防火墙状态关闭 linux 防火墙 setenforce 0 getenforce // 查看状态 vim /etc/sysconfig/selinux //…

USB2.0学习4--USB包结构和包类型

目录 1. USB包基本结构 1.1 SOP域&#xff08;Start Of Packet&#xff09; 1.2 SYNC域&#xff08;同步域&#xff09; 1.3 PID域&#xff08;标识域&#xff09; 1.4 地址域&#xff08;ADDR&#xff09; 1.5 帧号域&#xff08;Fram&#xff09; 1.6 数据域&#xff…

jeecg 框架的excel导入 含图片(嵌入式,浮动式)

jeecg 框架的excel导入 含图片&#xff08;嵌入式&#xff0c;浮动式&#xff09; 一、啰嗦二、准备三、 代码1、代码&#xff08;修改覆写的ExcelImportServer&#xff09;2、代码&#xff08;修改覆写的PoiPublicUtil&#xff09;3、代码&#xff08;新增类SAXParserHandler&…