JavaScript 逆向技巧总结

news2024/9/21 0:37:15

本节属于知识总结,只是对思路的梳理,不对具体内容进行展开

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 代码,得到一些返回结果

总结: 本节是对整体爬取思路的梳理,加上应该用哪些方法来解决问题

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

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

相关文章

Linux磁盘管理与文件系统(二):实用工具和命令、fdisk分区示例

文章目录 4、查看或管理磁盘分区-fdisk格式选项示例 4、示例:使用 fdisk 命令创建分区需求操作步骤 5、创建文件系统-mkfs格式常用选项示例创建其他类型的文件系统 6、创建文件系统-mkswap格式常用选项示例拓展:关闭和启用交换分区拓展:swap分…

搬瓦工澳大利亚AS9929 VPS测评

搬瓦工澳大利亚vps怎么样?搬瓦工澳大利亚悉尼数据中心在运作CUII/AS9929线路的VPS,底层为KVM虚拟,纯SSD阵列,1Gbps带宽... 目前看到的是CPU主频是2.4GHz,接入XTOM网络,IP归属澳大利亚,当前大致I…

window好用的批量远程桌面连接工具

下载 安装 Remote Desktop Connection Manager 添加server

AlexNet模型搭建(三部曲_2)

文章目录 1模型介绍2 模型搭建3 模型训练4 模型预测 猫狗二分类&#xff0c;模型简单&#xff0c;训练精度并不高。数据集下载&#xff1a;<https://aistudio.baidu.com/datasetdetail/26884> 百度飞浆上找的大小只有60多M 1模型介绍 AlexNet是一个卷积神经网络的名字&a…

Linux命令(基础面试可用,都是自己觉得平时使用多的)

1.cat 参数&#xff1a;-n&#xff1a;显示行号-s&#xff1a;压缩连续的空行&#xff0c;只显示一个空行2.chattr 改变文件属性 语法&#xff1a;chattr [-RV] [/-/<属性>][文件或目录] 属性&#xff1a;a&#xff1a;让文件或目录仅供附加用途i&#xff1a;不得任意更…

MediaPipe人体姿态、手指关键点检测

MediaPipe人体姿态、手指关键点检测 文章目录 MediaPipe人体姿态、手指关键点检测前言一、手指关键点检测二、姿态检测三、3D物体案例检测案例 前言 Mediapipe是google的一个开源项目&#xff0c;用于构建机器学习管道。   提供了16个预训练模型的案例&#xff1a;人脸检测、…

基于级联深度学习算法的前列腺病灶检测在双参数MRI中的评估| 文献速递-基于深度学习的乳房、前列腺疾病诊断系统

Title 题目 Evaluation of a Cascaded Deep Learning–based Algorithm for Prostate Lesion Detection at Biparametric MRI 基于级联深度学习算法的前列腺病灶检测在双参数MRI中的评估 Background 背景 Multiparametric MRI (mpMRI) improves prostate cancer (PCa) de…

从西安出发,走向世界——西安国际数字影像产业园跻身全国十大产业园区行列

西安&#xff0c;作为中国历史文化名城&#xff0c;不仅以其丰富的历史遗产闻名于世&#xff0c;还逐渐成为现代科技和产业发展的新高地。产业园区成为推动经济增长和创新发展的重要引擎&#xff0c;西安国际数字影像产业园&#xff0c;正怀揣着雄心壮志&#xff0c;向着全国十…

idea git拉取代码can‘t update

idea有时候创建的新分支&#xff0c;提交以后却无法拉去代码&#xff0c;提示如下错误信息&#xff1a; cant update No tracked branch configured for branch 在idea的“Terminal”窗口中输入如下命令即可 git branch --set-upstream-to origin 找不到Terminal的可以参考下图…

ESP32S3 IDF 对 16路输入输出芯片MCP23017做了个简单的测试

这次还是使用了idf老版本4.4.7&#xff0c;上次用了5.3&#xff0c;感觉不好用&#xff0c;官方的MCP23017芯片是英文版&#xff0c;真的很难读明白&#xff0c;可能是我英语水平不够吧。先看看每个寄存器的功能&#xff1a; IODIRA 和 IODIRB: 输入/输出方向寄存器 IPOLA 和 I…

B端界面升级就是升级颜值,错了,这样想就片面啦。

在B端应用的发展中&#xff0c;界面升级是非常重要的一环。然而&#xff0c;界面级不仅仅是为了提升外观颜值&#xff0c;还需要关注用户体验、功能增强和效率提升等方面。 虽然美观的界面可以吸引用户的眼球&#xff0c;但如果功能不完善&#xff0c;用户可能会选择其他产品。…

LVS负载均衡(twenty-six day)

一、LVS &#xff08;一&#xff09;什么是LVS linux virtural server的简称&#xff0c;也就是linxu虚拟机服务器&#xff0c;这是一个由章文岩博士发起的开源项目&#xff0c;官网是http://www.linuxvirtualserver.org,现在lvs已经是linux内核标准的-部分&#xff0c;使用lv…

vue 实现上浮气泡效果

一、 效果 二、代码 1.用 li 来做每个气泡 <div class"dataSea_middle_bottom"><ul><liv-for"(item,index) in keyBusiness":key"index"class"pops animal"><p class"fb">{{ item.name}}</p>…

Java面试题(一)----Java基础

基础 Java中和equals有什么区别&#xff1f; 一个是运算符&#xff0c;一个是方法。 如果比较的对象是基本数据类型&#xff0c;则比较数值是否相等&#xff1b;如果比较的是引用数据类型&#xff0c;则比较的是对象的内存地址是否相等。 因为Java只有值传递&#xff0c;对于…

SQL Zoo 9-.Window functions

以下数据均来自SQL Zoo 1.Show the lastName, party and votes for the constituency S14000024 in 2017.&#xff08;显示2017年选区“S14000024”的姓氏、政党和选票&#xff09; SELECT lastName, party, votesFROM geWHERE constituency S14000024 AND yr 2017 ORDER BY…

开启IDEA打开新项目时窗口提示

1.背景 实际开发中很多时候,我们会同时打开多个项目,或者项目切换, 这时候有2中情况,打开新窗口或者在当前窗口打开(即:关闭当前窗口,打开新窗口) 具体是那种情况,要根据实际场景,因此我们希望可以弹框提示: 是打开新窗口,还是在当前窗口打开 具体设置如下: 2.步骤 3.测试…

中国科技统计年鉴,数据覆盖1991-2022年多年份

基本信息. 数据名称: 中国科技统计年鉴 数据格式: excel 数据时间: 1991-2022年 数据几何类型: xlsx 数据坐标系: WGS84 数据来源&#xff1a;国家统计局 数据预览&#xff1a; 数据可视化.

zabbix“专家坐诊”第251期问答

问题一 Q&#xff1a;zabbix模板自带的监控项很多都不需要&#xff0c;也不用删除&#xff0c;就是怎么让他们都不展示出来 A&#xff1a;禁用掉 Q&#xff1a;还是在的&#xff0c;我想要就看不见&#xff0c;不是不启用&#xff0c;想要效果跟删除一样&#xff0c;看不见&am…

我在高职教STM32——I2C通信之SHT20传感器(1)

大家好,我是老耿,高职青椒一枚,一直从事单片机、嵌入式、物联网等课程的教学。对于高职的学生层次,同行应该都懂的,老师在课堂上教学几乎是没什么成就感的。正是如此,才有了借助CSDN平台寻求认同感和成就感的想法。在这里,我准备陆续把自己花了很多心思设计的教学课件分…

go-zero中基本配置及获取参数

一、使用配置文件启动项目 1、在项目的etc文件夹下分别创建开发环境和测试环境的配置文件,这里简单点使用不同的端口 2、配置Makefile文件启动命令来启动不同配置文件 runDev:go run users.go -f etc/application-dev.yml runProd:go run users.go -f etc/application-prod.ym…