【爬虫逆向实战篇】定位加密参数、断点调试与JS代码分析

文章目录

  • 1. 写在前面
  • 2. 确认加密参数
  • 3. 加密参数定位
  • 4. XHR断点调试

【作者主页】:吴秋霖
【作者介绍】:Python领域优质创作者、阿里云博客专家、华为云享专家。长期致力于Python与爬虫领域研究与开发工作!
【作者推荐】:对JS逆向感兴趣的朋友可以关注《爬虫JS逆向实战》,对分布式爬虫平台感兴趣的朋友可以关注《分布式爬虫平台搭建与开发实战》
还有未来会持续更新的验证码突防、APP逆向、Python领域等一系列文章

1. 写在前面

  现在爬虫如果不会分析加密参数、定位加密入口、扣取JS加密代码、还原加密算法。你敢说你是做爬虫的?在这之前很多新手读者与粉丝找作者聊天时经常聊到对JS逆向没有头绪,不知道断点如何下,JS加密代码如何扣取!本期作者将通过实际案例手把手喂饭如何对加密参数进行分析与逆向、如何对JS加密代码进行扣取

在开发一个网站的爬虫之前,我们要做的首先就是分析爬虫是否需要取逆向。确认接口参数是否加密、参数是否动态验证等一系列前置验证

分析目标

aHR0cHM6Ly9rYW95YW4uZG9jaW4uY29tL3BkZnJlYWRlci93ZWIvIy9kb2Npbi9kb2N1bWVudHM/dHlwZT0xJmtleXdvcmQ9JUU4JTgwJTgzJUU3JUEwJTk0JUU4JUI1JTg0JUU2JTk2JTk5

2. 确认加密参数

这里我们点击下一页,查看一下发包与请求头信息,请求参数的话都是明文,不需要我们去分析。而请求头参数内X-Nonce、X-Sign参数是密文,如下所示:

在这里插入图片描述

一般正常情况下,对于头部非正常字符串可能是我们需要去分析的,像一些16进制、关键Key字段Sgin、Token等之类的字段。一些网站会自定义,如某书(X-s、X-s-c)就在头部信息中!

这个时候先不要急,我们需要确认X-Nonce、X-Sign参数是否动态生成的,这个时候可以直接Curl请求到终端进行测试,如下所示:

在这里插入图片描述
可以看到请求出现了异常,这个时候我们可以在浏览器网站中重放一下请求看一下,可以看到同样失效了,如下所示:

在这里插入图片描述

这样的情况下证明它网站的接口是有一个时效性的!根据上面接口反馈的信息,Nonce重复提交,意味这个这个参数不能重复,每一次是不一样的!

重新发包发现X-Sign参数也是变化的,那么大概率这两个参数都是需要我们逆向的

所以通过模拟请求的方式我们能够来明确网站的参数是否需要逆向,接下来我们继续,分析加密参数并完成逆向

3. 加密参数定位

关于对加密参数的定位在作者以前的很多关于爬虫JS逆向的文章中都有相关讲解,但是本期文章主打的就是喂饭!所以这里我们先使用搜索大法,打开网站如下步骤:

在这里插入图片描述

如上搜索完毕之后,可以看到有两个JS文件内含X-Nonce参数。我们先点击第一个JS进去查看,如下所示:

在这里插入图片描述

可以看到除了X-Nonce参数外,X-Sign签名参数也在其中,都进行了头部参数的赋值操作。接下来,我们需要下一个断点进行分析,而从知道这个加密的值从哪里来的,如上图中我们可以看到通过调用Tools.newGuid()得到nonce并赋值给X-Nonce,而X-Sign参数的生成则调用了Tools.sign()方法并传递了四个参数timestamp,、nonce、application,version、 body,如下所示:

在这里插入图片描述

触发断点后,会停留在上图的第21行,一般我们可能会直接在控制台查看一下Tools.newGuid()方法,但是由于作用域关系, 会出现如下问题:

在这里插入图片描述

这里我们可以直接进入到Tools.newGuid()方法内部查看,如下所示:

在这里插入图片描述

我们可以上图的作用域看到返回的值是跟请求头中参数值格式是一样的,所以X-Nonce的值是从NewGuid返回的。剩下的操作就是后续我们需要去实际的扣这一部分的代码了

接下来,我们翻回去分析一下Sign的签名参数,同样方式进入到签名生成方法内部查看具体代码,如下所示:

在这里插入图片描述

import md5 from 'js-md5';export default {//签名sign(timestamp, nonce, application, version, body) {let secret = "SV1dLfFDS32DS97jk32Qkjh34";let str = secret + "&" + timestamp + "&" + nonce + "&" + application + "&" + version + "&" + body;let sign = md5(str).toUpperCase();return sign;},
}

上面代码是具体方法,可以看到网站的开发人员已经将注释都写好了~是吧?就是签名!它是导了一个md5,然后sign方法接受几个参数,还有一个固定的盐值secret,然后接着进行一个大的字符串拼接,最后用md5生成加密结果,toUpperCase的话将加密结果转换为大写

这里我们需要检验一下,这个md5加密是不是一个标准的md5算法,检验的方法很简单,将拼接的那个大字符串str放到在线工具内,我这里直接在终端测了一下,如下所示:

在这里插入图片描述
在这里插入图片描述

由此可见,网站使用的是标准的md5算法

4. XHR断点调试

其实到这里我们的分析基本就已经完成了,剩下的就是扣取JS代码。但是,既然本期是一个喂饭教程,这里顺便也是讲解一些XHR断点调试的方法,就是发包的位置进行拦截

XHR断点如何下,其实就是将请求的接口地址复制到Srouce中,复制一部分就行!如下:

在这里插入图片描述在这里插入图片描述

XHR断点下好之后,点击下一页触发断点,直接来到了发包的位置!也就是如下sned要从前端把这个包发送给后台的服务器,如下所示:

在这里插入图片描述

继续看下图,在发送的时候头部参数都已经生成好了。XHR的断点断在了请求的源码里面,所以XHR断点之所以在调试分析的时候要往前溯源去推加密的位置,是因为加密的动作都在此发包之前已经完成,如下所示:

在这里插入图片描述

参数组装–>加密操作–>发包–>响应

在这里插入图片描述

这里我们继续接着往下走,如下来到.then的回调方法,其中有一个response是来接受后端返回信息的参数,如下所示:

在这里插入图片描述

点击进去看一下,可以看到后端已经将数据返回出来了,如下所示:

在这里插入图片描述在这里插入图片描述
到了这里我们继续接着反推,断点继续出来接着往下走,如下所示:

在这里插入图片描述

看到了什么?从源码的发包位置通过断点调试分析,一步步到业务层面的代码,如下接受拦截器与请求拦截器!至此精准定位到加密参数生成位置,后续将完成对JS加密代码的扣取、调试与还原!写这篇文章的时候,恰好是元宵节(祝各位元宵节快乐!

当然除了上面提到的两种加密定位技巧还有Hook大法,像什么XHR、Header、Debugger、Json、Cookie、Websocket、Canvas、Eval的Hook,后续也会慢慢通过文章分享实战教程

  好了,到这里又到了跟大家说再见的时候了。创作不易,帮忙点个赞再走吧!你的支持是我创作的动力,希望能带给大家更多优质的文章

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

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

相关文章

实现外网手机或者电脑随时随地远程访问家里的电脑主机(linux为例)

文章目录 一、背景概要二、安装配置花生壳软件(linux版本)三、手机端(外网)验证连接四、安装ubuntu20server版系统遇到的问题记录 一、背景概要 由于经常在遇到某些问题的时候,针对某一个场景的理解,需要借助于自己的电脑去编译(aosp/linux/qemu)代码查…

Python中回调函数的理解与应用

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站零基础入门的AI学习网站~。 目录 前言 回调函数的概念 回调函数的基本用法 回调函数的实现方式 1 使用函数 2 使用类方法 3 使用类实…

1.QT简介(介绍、安装,项目创建等)

1. QT介绍 Qt(官方发音 [kju:t])是一个跨平台的C开发库,主要用来开发图形用户界面(Graphical User Interface,GUI)程序 Qt 是纯 C 开发的,正常情况下需要先学习C语言、然后在学习C然后才能使用…

LaWGPT—基于中文法律知识的大模型

文章目录 LaWGPT:基于中文法律知识的大语言模型数据构建模型及训练步骤两个阶段二次训练流程指令精调步骤计算资源 项目结构模型部署及推理 LawGPT_zh:中文法律大模型(獬豸)数据构建知识问答模型推理训练步骤 LaWGPT:基…

【Pytorch深度学习开发实践学习】B站刘二大人课程笔记整理lecture11 Advanced_CNN 实现GoogleNet和ResNet

【Pytorch深度学习开发实践学习】B站刘二大人课程笔记整理lecture11 Advanced_CNN 代码: Pytorch实现GoogleNet import torch from torchvision import datasets, transforms from torch.utils.data import DataLoader import torch.nn as nn import torch.nn.fun…

matplotlib子图绘制

文章目录 子图组合网格布局GridSpec matplotlib教程: 初步 子图 从绘图流程出发,【plt】图像有三个层级,依次是窗口、坐标系以及图像。在一个坐标系中可以有多条曲线,即表示多个图像;相应地在一个窗口中,…

wcf 简单实践 数据绑定 数据更新ui

1.概要 2.代码 2.1 xaml <Window x:Class"WpfApp3.MainWindow"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x"http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d"http://schemas.microsoft.com/expr…

一键生成PDF即刻呈现:轻松创建无忧体验

在信息爆炸的时代&#xff0c;我们每天都在与各种文件、资料打交道。无论是工作中的报告、合同&#xff0c;还是学习中的笔记、论文&#xff0c;如何高效、安全地管理这些珍贵的资料&#xff0c;成为了我们迫切的需求。幸运的是&#xff0c;随着科技的发展&#xff0c;我们不再…

java面向对象高级

一、静态 static读作静态&#xff0c;可以用来修饰成员变量&#xff0c;也能修饰成员方法。我们先来学习static修饰成员变量。 1.1 static修饰成员变量 Java中的成员变量按照有无static修饰分为两种&#xff1a;类变量、实例变量。它们的区别如下图所示&#xff1a; 由于静态…

目标跟踪之KCF详解

High-Speed Tracking with Kernelized Correlation Filters 使用内核化相关滤波器进行高速跟踪 大多数现代跟踪器的核心组件是判别分类器&#xff0c;其任务是区分目标和周围环境。为了应对自然图像变化&#xff0c;此分类器通常使用平移和缩放的样本补丁进行训练。此类样本集…

【AI链接】 大模型语言模型网站链接

目录 GPT类1. chatgpt2. GROP3. Google AI Studio4. Moonshot AI (国内) 解读论文类&#xff1a;1. txyz 编程辅助插件&#xff1a;1. Fitten Code GPT类 1. chatgpt https://chat.openai.com/ 2. GROP https://groq.com/ 3. Google AI Studio https://aistudio.google…

爬取m3u8视频

网址&#xff1a;https://www.bhlsm.com/cupfoxplay/609-3-1/ 相关代码&#xff1a; #采集网址&#xff1a;https://www.bhlsm.com/cupfoxplay/609-3-1/ #正常视频网站&#xff1a;完整视频内容 # pip install pycryptodomex #流媒体文件&#xff1a;M3U8&#xff08;把完整的…

在那静谧的冬天你飘落我荒凉心园

北风 - 刘蓝溪/梁弘志 --女--在那静谧的冬天你飘落我荒凉心园恰似北风一袭吹去秋意无限带来几片相思带来往日笑靥只见北风又起撒落枯叶片片--男--在那静谧的冬天你走进我冷漠心田恰似北风一袭吹去秋意无限北风婵媛白云白云本是轻烟只见北风又见带来白云片片--合--喔喔喔 海角…

中国象棋开源人工智能程序(带UI)搬运

我的老父亲一直想买一个人工智能象棋机器人陪他下棋&#xff0c;我就在Github上找了一个开源项目&#xff0c;带UI的中国象棋人工智能程序&#xff0c;其训练方法类似AlphaZero&#xff0c;因而叫Chinese Chess Zero (cczero)。虽然看起来很久没有维护了&#xff0c;但是棋力也…

Linux——静态库

Linux——静态库 静态库分析一下 ar指令生成静态库静态库的使用第三方库优化一下 gcc -I(大写的i) -L -l(小写的l)&#xff0c;头文件搜索路径&#xff0c;库文件搜索路径&#xff0c;连接库 今天我们来学习静态库的基本知识。 静态库 在了解静态库之前&#xff0c;我们首先来…

冯诺依曼体系结构 计算机组成的金字塔

01 冯诺依曼体系结构&#xff1a;计算机组成的金字塔 学习计算机组成原理&#xff0c;到底是在学些什么呢&#xff1f;这个事儿&#xff0c;一两句话还真说不清楚。不过没关系&#xff0c;我们先从“装电脑”这个看起来没有什么技术含量的事情说起&#xff0c;来弄清楚计算机到…

Linux的进程

在Linux中&#xff0c;可以使用多种方式来结束进程。以下是8种常见的方式&#xff1a; 终端中断&#xff08;Ctrl C&#xff09;&#xff1a;在终端中运行的程序可以通过按下Ctrl C组合键来发送SIGINT信号&#xff0c;终止该进程的执行。 kill命令&#xff1a;使用kill命令可…

汉诺塔问题—java详解(附源码)

来源及应用 相传在古印度圣庙中&#xff0c;有一种被称为汉诺塔(Hanoi)的游戏。该游戏是在一块铜板装置上&#xff0c;有三根杆(编号A、B、C)&#xff0c;在A杆自下而上、由大到小按顺序放置64个金盘(如图1)。游戏的目标&#xff1a;把A杆上的金盘全部移到C杆上&#xff0c;并仍…

fly-barrage 前端弹幕库(2):弹幕内容支持混入渲染图片的设计与实现

如果弹幕内容只支持文字的话&#xff0c;只需要借助 canvas 绘图上下文的 fillText 方法就可以实现功能了。 但如果想同时支持渲染图片和文字的话&#xff0c;需要以下几个步骤&#xff1a; 设计一个面向用户的数据结构&#xff0c;用于描述弹幕应该渲染哪些文字和图片&#x…

学习JAVA的第二天(基础)

目录 基本概念 关键字 class关键字 字面量 练习 变量 定义格式 变量使用 数据类型 基本数据类型 标识符 命名规则 键盘录入 1.导包 2.创建对象 3.接受数据 运算符 算术运算符 练习 隐式转换&#xff08;自动类型提升&#xff09; 强制转换 自增自减运算符 …