JavaScript 逆向技巧总结
本节属于知识总结,只是对思路的梳理,不对具体内容进行展开
JS 逆向可以分为三大部分: 寻找入口, 调试分析, 模拟执行
寻找入口: 这是非常关键的一步,逆向在大部分情况下就是找一些加密参数到底是怎么来的,比如请求中的 token ,sign 等参数到底在哪里构造的, 这个关键逻辑可能写在某个关键的方法里面或者隐藏在某个关键的变量里面。一个网站加载了很多 JS 文件,那么怎么从这么多 JS 代码里面找到关键的位置,那就是一个关键的问题,这就是寻找入口
调试分析: 找到入口后,比如我们可以定位到某个参数可能是在某个方法里面执行了的,那么里面的逻辑究竟是怎样的,里面调用了多少加密算法,经过了多少变量赋值和转换等,这些需要我们先把整体思路整理清楚,以便于我们后面进行模拟调用或者逻辑改写。在这个过程中,我们主要借助于浏览器的调试工具进行断点调试分析,或者借助一些反混淆工具进行代码的反混淆
模拟执行: 经过调试分析之后,我们差不多已经搞清楚整个逻辑了,但我们最终目的还是写爬虫,怎么爬取到数据才是根本,因此这里就需要对整个加密过程进行逻辑复写或者模拟执行,以把整个加密流程模拟出来,比如输入一些已知变量,调用之后我们就可以拿到一些 token 内容,再用这个 token 进行数据爬取即可
本节将对以上内容进行梳理
寻找入口
其中包括 查看请求, 搜索参数, 分析发起调用, 断点, Hook 等
查看请求
一般来说,我们都是先分析想要的数据到底从哪里来的。 比如说对示例网站
https://spa6.scrape.center

我们可以看到首页有一条条数据,这些数据肯定是某个请求返回的,那它究竟是从哪个请求里面来的呢? 我们可以先尝试搜索一下
打开浏览器开发者工具,打开 Network 面板,然后点击搜索按钮, 比如这里我们搜索 “霸王别姬”
注意: 要把中间的内容刷新出来才搜索,不然什么都搜不到

我们可以看到对应的搜索结果,点击搜索到的结果,我们可以定位到响应结果的位置

这样我们看到了是哪里发起的请求

我们还可以看到请求的参数,比如 token
一般来说,我们可以通过这种方式寻找最初的突破口。如果请求中带有加密参数,就顺着继续找这个参数究竟在哪里生成的。如果没有加密参数,我们就可以直接爬取
搜索参数
前面我们找到了最初的突破口,同时也找到了加密参数 token ,这里我们看看 token 怎么构造出来的
一种简单的方法就是全局搜索。一般来说,参数名大多数情况下就是一个普通的字符串,比如这里叫做 token ,那么这个字符串肯定隐藏在某个 JS 文件中,我们可以尝试进行搜索,也可以加 冒号,空格,引号等来配合搜索。因为一般来说这个参数会配合一些符号一起出现,比如我们可以搜 token token: token : "token" 等,我们可以直接调用浏览器调试面板的搜索功能

这是一个资源搜索入口,比如可以搜索下载下来的 JS 文件的内容这里我们输入 token 来进行搜索

如果内容不显示,是可以上拉的,这里搜索到的结果,我们可以点进去看看里面是不是我们要的内容
分析发起调用
上述搜索是其中一种查找入口的方式,这是从源码级别上直接查找。我们也可以通过其他思路来查找入口,比如可以查看发起调用的流程。
可以直接从 Network 请求里面的 Initiator 查看当前请求构造的相关逻辑

看不到内容,当我们鼠标悬停在 Initiator 那一栏的时候会出现对应的调用

我们可以看到每一层的调用,我们可以依次点进去查看,比如这里的第八层调用了一个 onFetchData 方法, 点击右侧代码位置,我们就可以找到一些相关的逻辑

断点
另外我们还可以通过断点进行入口查找,比如 XHR 断点, DOM 断点,事件断点等。我们可以在开发者工具中的 Sources 面板里面添加设置,比如这里我们就添加了 XHT 断点和全局 Load 事件断点

这样网页就可以在整个页面加载完成之后,发起 Ajax 请求的时候停下来,进入断点调试模式。
Hook
Hook 也是一个非常常用的查找入口的功能。有时候,一些代码搜索或者断点并能很有效的找到对应的入口位置,这时候就可以使用 Hook 了
比如说我们可以对一些常用的加密和编码算法,常用的转换操作都进行一些 Hook , 比如说 Base64编码, Cookie 的赋值, JSON 的序列化等
比较方便的 Hook 方式就是通过 TamporMonkey 这个插件实现,使用它我们不仅可以方便的自定义脚本执行时间点,也可以引入一些额外的脚本辅助 Hook 进行代码编写,具体实现可以查阅相关资料
其他
以上便是一些常见的分析入口的方法,当然还有很多其他方法,比如使用 Pyppeteer, PlayWright 里面内置的 API 实现那一些数据拦截和过滤功能, 也可以使用一些抓包软件对一些请求进行拦截和分析,还可以使用一些第三方工具或浏览器来辅助分析
调试分析
找到对应的入口后我们就要开始调试分析了。在这个步骤中我们通常需要进行一些格式化,断点调试,反混淆等操作来辅助整个流程的分析
格式化
格式化这个流程非常重要,它可以大大增加代码的可读性,一般来说很多 JS 代码都是经过打包和压缩的。多数情况下我们可以使用 Sources 面板下 JS 窗口左下角的格式化按钮对代码进行格式化

另外还有一些网站的 HTML 和 JS 是混在一起的,比如 : https://spa8.scrape.center/

如果代码被压缩成一行,无法利用前面的方法格式化,可以把代码复制下来,然后用一些格式化工具进行格式化,例如: https://beautifier.io/

我们还可以选择一些格式化的选项,比如缩进, 换行等
断点调试
代码格式化之后,我们就可以正式进入调试流程了,基本操作就是给想要调试的代码添加断点,同时在对应的面板里观察对应变量的值

反混淆
在某些情况下,我们还有可能遇到一些混淆方式,比如控制流扁平化,数组移位等。对于一些特殊的混淆,我们可以使用 AST 技术来对代码进行还原。
比如案例: https://antispider10.scrape.center 就使用控制流扁平化方式对代码进行混淆,
不要管页面怎么显示,只看代码

可以看到,这里有一个 while 循环,循环内通过一些判断条件来执行一些逻辑,有的逻辑放在了 if 区块, 有的逻辑放在了 else 区块,还有的逻辑放在了 catch 区块, 这就导致我们无法一下子了解这几个区块的真正执行顺序
对于此类混淆,我们可以使用 AST 进行还原,方便更好的阅读,关于 AST 可以查阅相关资料
模拟执行
经过一系列的调试,现在我们已经可以理清其中的逻辑了, 接下来就是一些调用执行的过程了。
Python 改写和模拟执行
由于 Python 简单易用,同时也能够模拟调用执行 JS ,如果整体逻辑不复杂的话,我们可以尝试使用 Python 来把整个加密流程完整的实现一遍。如果整体流程相对复杂,我们可以尝试使用 Python 来模拟调用 JS 来执行
JS 模拟执行 + API
由于整个逻辑是 JS 实现的,使用 Python 来执行 JS难免会有一些不太方便的地方。而 Node.js 天生就有对 JS 的支持。为了更通用的实现 JS 的模拟调用, 我们可以用 express 来模拟调用 JS, 同时将其暴露成一个 API , 从而可以实现跨语言调用
浏览器模拟执行
由于整个逻辑是运行在浏览器里面的,我们当然也可以将浏览器当做整个执行环境。比如使用 Selenium ,PlayWright 等来尝试执行一些 JS 代码,得到一些返回结果
总结: 本节是对整体爬取思路的梳理,加上应该用哪些方法来解决问题
相关文章:
JavaScript 逆向技巧总结
本节属于知识总结,只是对思路的梳理,不对具体内容进行展开 JS 逆向可以分为三大部分: 寻找入口, 调试分析, 模拟执行 寻找入口: 这是非常关键的一步,逆向在大部分情况下就是找一些加密参数到底…...
linux反向代理原理:帮助用户更好地优化网络架构
Linux反向代理原理详解 反向代理是一种在网络架构中常用的技术,尤其在Linux环境下被广泛应用。它可以帮助实现负载均衡、安全防护和请求缓存等功能。本文将深入探讨Linux反向代理的原理、工作机制以及其应用场景。 1. 什么是反向代理 反向代理是指代理服务器接收客…...
开源DevOps工具链管理:DevStream
DevStream:简化DevOps,加速创新- 精选真开源,释放新价值。 概览 DevStream,一个开源的DevOps工具链管理器(DTM),由merico-dev团队精心打造,现已加入CNCF大家庭,并在devs…...
图数据库框架及其支持的开发语言和应用场景
图数据库框架及其支持的开发语言和应用场景 1. Neo4j 类型:原生图数据库特点:最流行的图数据库之一,使用Cypher查询语言,支持ACID事务,具有丰富的图算法库。支持的开发语言:Java, Python, JavaScript, Go, .NET, Ruby, PHP等。驱动和库:Neo4j Java Driver, Py2neo (Pyt…...
【Linux 18】核心转储
文章目录 🌈 一、什么是核心转储🌈 二、如何启动核心转储🌈 三、为什么有核心转储 🌈 一、什么是核心转储 核心转储 (Core Dump):当一个进程异常终止时,会在触发进程崩溃的目录下生成一个以进程 pid 命名的…...
远程传输文件至服务器—spc 传输
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、SPC是什么?二、使用步骤1.进入 windows 客户端需要传输文件的目录。2.在该目录的路径栏输入 cmd,回车打开终端。3.确定服务器端 IP …...
HarmonyOS.FA开发流程
开发环境配置 1、DevEco Studio的安装 2、DevEcoStudio模拟运行工程:运行Tools->Device Manager,使用已认证的HW开发者联盟帐号Login(在DP平台申请测试者权限),点击"允许"授权,选择一个设备运…...
三级_网络技术_21_无线局域网设备安装与调试
1.下列关于IEEE802.11标准的描述中,错误的是() IEEE802.11无线传输的频道定义在UNII波段 IEEE802.11在物理层定义了两个扩频技术和一个红外传播规范 IEEE802.11在MAC子层引入了一个RTS/CTS选项 IEEE802.11定义的传输速率是1Mbps和2Mbps 2.下列关于IEEE802.11标…...
机械学习—零基础学习日志(项目实践01)
llM项目分类与原理解析 Prompt项目 直接产出一些具体的文本与信息,使用markdown的格式。 对prompt进行较好的格式输出,固定格式。 ChatPaper 快速获取论文内容,然后了解对应的信息,判断是否有必要阅读这一篇论文 ChatBI&…...
SpringBoot排除默认日志框架
默认用的logback application.properties中的配置无需改变,自动装配会根据条件(哪个日志的.class是否存在) 进行切换 只要切换日志配置文件就好 比如原来使用的logback-spring.xml换成log4j2-spring.xml 日志文件网上找找...
质量管理理论(至简)
本文主要讲述质量管理的发展历程、质量管理常用的理论方法、质量管理过程、质量管理工具等内容,系统化展现质量管理知识体系。 一、质量管理发展历史 质量管理的发展历史大致划分为以下几个阶段: 质量管理发展阶段 质量检验阶段19世纪末,本…...
kaggle中访问本地上传的图片(找到图片地址)
由于代码中需要使用自己上传一个图片,对图片进行操作,尝试了很多种办法终于摸索出来了,希望可以帮助到大家 首先,在kaggle中左侧导航栏中找到datasets->New Dataset->Browse Files 创建成功后就可以看到数据集的详细信息 返回到代码中…...
ChatGPT到底是什么?它能做到什么?我们怎么才能使用到
ChatGPT是一个由OpenAI开发的人工智能聊天机器人程序,它基于先进的自然语言处理技术,能够与用户进行流畅的对话和文本交互。以下是ChatGPT的主要特点和能力: 到底是什么? 人工智能模型:ChatGPT是一个基于机器学习的大…...
浦科特M6S固态硬盘数据丢失与恢复:全方位指南
在当今数据驱动的时代,硬盘中的数据已成为我们生活和工作中不可或缺的一部分。然而,数据丢失的风险始终存在,无论是由于意外删除、硬件故障还是其他未知原因。浦科特M6S作为一款高性能的固态硬盘,虽然以稳定性和速度著称ÿ…...
gdb: 编译,lzma,configure: error: missing liblzma for --with-lzma
如果是想编译时带着’–with-lzma’。如果编译主机以及安装了liblzma,gdb的configure会自动配置enable。 Build GDB with LZMA, a compression library. (Done by default if liblzma is installed and found at configure time.) LZMA is used by GDB’s “mini debuginfo” …...
LInux - 一文了解 ssh端口敲门knock
文章目录 基本概念工作原理实操注意事项 基本概念 SSH端口敲门技术是一种网络安全措施,用于防止未经授权的访问。通过端口敲门,可以动态地在防火墙上打开指定端口(如SSH端口),仅允许符合特定敲门序列的用户访问。此技…...
Java面试篇(线程池相关专题)
文章目录 1. 为什么要使用线程池2. 线程池的核心参数和线程池的执行原理2.1 线程池的核心参数2.2 线程池的执行原理 3. 线程池中常见的阻塞队列3.1 常见的阻塞队列3.2 ArrayBlockingQueue 和 LinkedBlockingQueue 的区别 4. 如何确定线程池的核心线程数4.1 应用程序中任务的类型…...
git推送错误-->远程分支比本地的分支更新,无法直接推送
每次上传本地修改好的代码的时候,十次有八次都会出现这样的问题!!(暴躁!!!) 现在写个帖子记录一下,这个问题目前我还没有解决,欢迎懂的佬指点一下. 情景: 我在本地仓库做了一些代码的修改,准备上传到远程仓库上,下边是上传步骤: git add . # 将所有的修改都提交到缓冲区git …...
【三维重建】SpotlessSplats:去除瞬态干扰物的三维高斯喷溅(3DGS)
代码:https://spotlesssplats.github.io 论文:https://arxiv.org/pdf/2406.20055 来源:DeepMind,多伦多大学,斯坦福大学,西蒙弗雷泽大学 提示:关注B站【方矩实验室】,查看视频讲解…...
28. 找出字符串中第一个匹配项的下标【 力扣(LeetCode) 】
一、题目描述 给你两个字符串 haystack 和 needle ,请你在 haystack 字符串中找出 needle 字符串的第一个匹配项的下标(下标从 0 开始)。如果 needle 不是 haystack 的一部分,则返回 -1 。 二、测试用例 示例 1: 输…...
RestClient
什么是RestClient RestClient 是 Elasticsearch 官方提供的 Java 低级 REST 客户端,它允许HTTP与Elasticsearch 集群通信,而无需处理 JSON 序列化/反序列化等底层细节。它是 Elasticsearch Java API 客户端的基础。 RestClient 主要特点 轻量级ÿ…...
在鸿蒙HarmonyOS 5中实现抖音风格的点赞功能
下面我将详细介绍如何使用HarmonyOS SDK在HarmonyOS 5中实现类似抖音的点赞功能,包括动画效果、数据同步和交互优化。 1. 基础点赞功能实现 1.1 创建数据模型 // VideoModel.ets export class VideoModel {id: string "";title: string ""…...
聊聊 Pulsar:Producer 源码解析
一、前言 Apache Pulsar 是一个企业级的开源分布式消息传递平台,以其高性能、可扩展性和存储计算分离架构在消息队列和流处理领域独树一帜。在 Pulsar 的核心架构中,Producer(生产者) 是连接客户端应用与消息队列的第一步。生产者…...
基于Uniapp开发HarmonyOS 5.0旅游应用技术实践
一、技术选型背景 1.跨平台优势 Uniapp采用Vue.js框架,支持"一次开发,多端部署",可同步生成HarmonyOS、iOS、Android等多平台应用。 2.鸿蒙特性融合 HarmonyOS 5.0的分布式能力与原子化服务,为旅游应用带来…...
OkHttp 中实现断点续传 demo
在 OkHttp 中实现断点续传主要通过以下步骤完成,核心是利用 HTTP 协议的 Range 请求头指定下载范围: 实现原理 Range 请求头:向服务器请求文件的特定字节范围(如 Range: bytes1024-) 本地文件记录:保存已…...
让AI看见世界:MCP协议与服务器的工作原理
让AI看见世界:MCP协议与服务器的工作原理 MCP(Model Context Protocol)是一种创新的通信协议,旨在让大型语言模型能够安全、高效地与外部资源进行交互。在AI技术快速发展的今天,MCP正成为连接AI与现实世界的重要桥梁。…...
GruntJS-前端自动化任务运行器从入门到实战
Grunt 完全指南:从入门到实战 一、Grunt 是什么? Grunt是一个基于 Node.js 的前端自动化任务运行器,主要用于自动化执行项目开发中重复性高的任务,例如文件压缩、代码编译、语法检查、单元测试、文件合并等。通过配置简洁的任务…...
C#中的CLR属性、依赖属性与附加属性
CLR属性的主要特征 封装性: 隐藏字段的实现细节 提供对字段的受控访问 访问控制: 可单独设置get/set访问器的可见性 可创建只读或只写属性 计算属性: 可以在getter中执行计算逻辑 不需要直接对应一个字段 验证逻辑: 可以…...
08. C#入门系列【类的基本概念】:开启编程世界的奇妙冒险
C#入门系列【类的基本概念】:开启编程世界的奇妙冒险 嘿,各位编程小白探险家!欢迎来到 C# 的奇幻大陆!今天咱们要深入探索这片大陆上至关重要的 “建筑”—— 类!别害怕,跟着我,保准让你轻松搞…...
Go语言多线程问题
打印零与奇偶数(leetcode 1116) 方法1:使用互斥锁和条件变量 package mainimport ("fmt""sync" )type ZeroEvenOdd struct {n intzeroMutex sync.MutexevenMutex sync.MutexoddMutex sync.Mutexcurrent int…...
