python爬虫AES案例:某招聘网站

声明:
该文章为学习使用,严禁用于商业用途和非法用途,违者后果自负,由此产生的一切后果均与作者无关

一、找出需要加密的参数
  1. js运行 atob(‘aHR0cHM6Ly93d3cua2Fuemh1bi5jb20vc2VhcmNoLz9xdWVyeT1weXRob24mdHlwZT0w’) 拿到网址,F12打开调试工具,点击搜索,找到 api_to/search/comprehensive.json 请求
  2. 分析请求头、参数、响应结果会发现只有参数中的 b、kiv加密,还有响应结果加密,请求头中 cookie 也有一些看起来也像加密,暂时不管cookie中的,先去扣响应结果的加密,再通过代码注释 cookie 参数判断是否cookie需要加密
    在这里插入图片描述
  3. 鼠标右击请求找到Copy>Copy as cUrl(cmd),打开网站:https://spidertools.cn/#/curl2Request,把拷贝好的curl转成python代码,新建 kanzhun.py 文件,把代码拷贝进去
    在这里插入图片描述
  4. 新建 kanzhun.js 文件,用于放扣下的代码
二、定位响应结果解密位置
  1. 因为响应结果完全是加密的,这里采用XHR拦截请求的方法定位解密位置,想尝试关键字的可以采用:JSON.parse、decrypt符合AES加密的关键字进行搜索
  2. 切换到sources,添加XHR拦截api_to/search/comprehensive.json
    在这里插入图片描述
  3. 点击搜索发送请求,一直点击跳过下一个函数,看到响应拦截器,分析代码会发现 t = (0,M.gy)(e.data, {iv: “string” == typeof n ? JSON.parse(n).kiv : n.kiv} 响应结果经过了这行代码的转换,又经过 JSON.parse 的转换,在 JSON.parse 打上断点,并把代码复制到 kanzhun.js 文件
    在这里插入图片描述
    在这里插入图片描述
  4. 结束本次调试,点击搜索发送请求,点击跳过断点调试,会定位到 JSON.parse 上的断点,分析 t = (0, )(e.data, {iv: “string” == typeof n ? JSON.parse(n).kiv : n.kiv} 会发现 M.gy、e.data、iv是需要注意的,鼠标分别悬浮上去会发现,M.gy 方法、e.data是加密参数、iv 是请求参数的kiv,分别把e.data、iv在控制台输出,把 e.data、iv 输出的值分别复制到 kanzhun.js 文件
    在这里插入图片描述
    在这里插入图片描述
  5. 鼠标悬浮到 M.gy 点击蓝色位置,找到该方法,会看到 m 方法,分析 m 方法会发现 c 方法,而e、t.iv参数是 M.gy 方法传过来的 ,在 m 方法内部打断点
    在这里插入图片描述
    在这里插入图片描述
  6. 结束本次调试,点击搜索发送请求,点击跳过断点调试,直到看到 m 方法,鼠标悬浮到 c 方法,点击蓝色部分找到该方法的位置,会发现 c 方法,分析内部代码得知是 AES 解密。而 iv 、e是经过 M.gy 传过来的,key、mode、padding 取得是 变量 n 中的,变量 n 是由 u() 方法实现,把代码复制到 kanzhun.js 文件,把方法名改为 decrypt,并导入 crypto-js 库,把代码中的 AES 相关的替换成库里面的,把 M.gy 替换成 ddecrypt
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
  7. 鼠标悬浮到 u 方法,点击蓝色部分找到该方法的位置,不想分析里面的代码可以完全复制到 kanzhun.js 文件,并把里面的 o.enc、o.mode、o.pad 替换成crypto-js 库的,有代码洁癖的可以只把 s = function() 拷贝出来命名成 u 方法,再把里面的 o.enc、o.mode、o.pad 替换成crypto-js 库的
    在这里插入图片描述
  8. 验证结果,运行代码打印出 解密后的值,把 t 在控制台输出,会发现里面的值是一样的
    在这里插入图片描述
    在这里插入图片描述
三、python 解密验证结果,并分析 cookie 中是否又加密参数
  1. 修改 kanzhun.py 文件,把参数中的b、kiv换成对应请求中的,运行文件会发现结果已经解密,我这里遇到了编码问题,加了 subprocess.Popen = partial(subprocess.Popen, encoding=“utf-8”) 以及 open(‘kanzhun.js’,‘r’,encoding=‘UTF-8’) 解决,没遇到的可以忽略
    在这里插入图片描述在这里插入图片描述
  2. 分析 cookie 中是否又加密参数,把cookie中的字段全部注释,会发现加密数据依然可以解密成,说明 cookie 中的字段无加密参数影响请求
    在这里插入图片描述
四、定位b、kiv加密位置
  1. 删除所有断点,点击搜索发送请求,关键字搜索 kiv,会发现有 kiv 赋值的地方,右击请求,点击在 sources 中打开,在打开的文件Ctrl+F搜索kiv,找到对应的位置并断点
    在这里插入图片描述在这里插入图片描述
  2. 点击搜索发送请求,点击跳过断点调试,直到看到 api_to/search/comprehensive.json 停下,分析代码,由此代码可看出 b、kiv 都在这个位置,分别对应 t、a ,而 a = (0,M.A)()、t = (0,M.mA)(n, {iv: a}).replace(///g, "").replace(///g, “_”).replace(/+/g, “-”).replace(/=/g, “~”),分析两段代码,会发现 a 是有 M.mA 函数生成,t 是由 M.mA、n、a生成,把 n 在控制台输出,会发现是参数的 明文信息,根据分析把代码复制到 kanzhun.js
    在这里插入图片描述在这里插入图片描述
  3. 分析 M._A 方法,鼠标悬浮 M._A,点击蓝色部分找到该方法,会发先 p 方法,把该方法复制到 kanzhun.js,并把 M._A 替换成 p
    在这里插入图片描述在这里插入图片描述在这里插入图片描述
  4. 分析 M.mA 方法,鼠标悬浮 M.mA,点击蓝色部分找到该方法,会发现 h 方法,在该方法内部断点
    在这里插入图片描述在这里插入图片描述
  5. 结束此次调试,点击搜索发送请求,一直点击跳过断点调试,直到看到刚才的 h 方法,分析该方法内部e、t是由M.mA传参过来的,只有一个 l 方法需要分析,鼠标悬浮 l 方法,点击蓝色部分找到该方法,会看到一个 l 方法,方法内部是 AES 加密,而在代码下方是之前的请求解密方法,加密里面的 n 也是之前的 u 方法生成,把代码复制到 kanzhun.js,把方法名改为 encrypt,并导入 crypto-js 库,把代码中的 AES 相关的替换成库里面的,把 M.mA 替换成 encrypt,点击运行 kanzhun.js,会发现 b、kiv5可以生成成功
    在这里插入图片描述
    在这里插入图片描述在这里插入图片描述在这里插入图片描述
五、python 加密结果
  1. 修改 kanzhun.py 文件,运行后会发现接口请求成功,且解密后的数据正常
    在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Webshell流量分析

Webshell流量分析 常见的一句话木马: asp一句话 <%eval request("pass")%> aspx一句话 <%@ Page Language="Jscript"%><%eval(Request.Item["pass"],"unsafe");%> php一句话 <?php @eval($_POST["pass&…

SDK emulator directory is missing

要进行uniapp真机测试&#xff0c;不得不安装配置一下安卓开发环境 &#xff0c;搞一个模拟器。。。然后又是各种坑。。对比来对比去还是IOS的环境使用着舒服&#xff0c;XCODE下载好&#xff0c;一切重点就是在编码了。。 安卓这个脑残货呀&#xff0c;哎&#xff0c;各种安装…

Win中Redis部署与配置

1.下载msi版本 下载传送门 2.双击next-->next安装安装 3.密码配置以及开机自启 在配置文件中配置相应配置进行配置密码以及端口和ip port 6379指定 Redis 监听端口&#xff0c;默认端口为 6379&#xff0c;作者在自己的一篇博文中解释了为什么选用 6379 作为默认端口&…

【傻瓜级JS-DLL-WINCC-PLC交互】7.​C#直连PLC并读取PLC数据

思路 JS-DLL-WINCC-PLC之间进行交互&#xff0c;思路&#xff0c;先用Visual Studio创建一个C#的DLL控件&#xff0c;然后这个控件里面嵌入浏览器组件&#xff0c;实现JS与DLL通信&#xff0c;然后DLL放入到WINCC里面的图形编辑器中&#xff0c;实现DLL与WINCC的通信。然后PLC与…

实现一个高并发的Redis分布式锁

1. 无锁场景 下面是一个扣减库存逻辑, 由于查库存和扣减库存两个操作不是原子的,明显存在并发超卖问题 // 假设初始库存200GetMapping("/stock")public String stock(RequestParam(value "name", defaultValue "World") String name) {String…

基于docker的onlyoffice使用--运行JavaSpringExample

背景 我之前看到有开源项目很好地集成了onlyoffice&#xff0c;效果要比kkfilepreview好&#xff08;应当说应用场景不太一样&#xff09;。本文是在window10环境&#xff0c;安装完Docker Desktop的基础上运行onlyoffice&#xff0c;并利用官网JavaSpringExample进行了集成。 …

福德植保无人机:农业科技的新篇章

一、引言随着科技的不断发展&#xff0c;无人机技术在许多领域中都得到了广泛的应用。近年来&#xff0c;福德植保无人机在农业领域大放异彩&#xff0c;成为了现代化农业的重要一环。本篇文章将为您详细介绍福德植保无人机的优势、特点以及未来发展趋势。 二、福德植保无人机的…

Linux socket编程(8):shutdown和close的区别详解及例子

在Linux中有两种操作可以终止socket间的进程通信&#xff1a;close和shutdown。但这两种函数在使用时有着不同的行为和效果。在网络编程中&#xff0c;正确地选择和使用这些操作至关重要&#xff0c;因为它们直接影响着通信的结束和资源的释放。本文将介绍close和shutdown函数&…

Thrift RPC Java、Go、PHP使用例子

文章目录 1、Thrift RPC介绍1.1、Protocol 支持的数据传输协议1.2、Transport 支持的数据传输方式1.3、Server 支持的服务模型1.4、IDL语法数据类型1.5、开发步骤 2、接口定义文件2.1、创建接口定义文件2.2、生成对应平台语言代码2.2.1、下载生成工具2.2.2、生成各平台语言代码…

单片机----串行通信

目录 串行通信的两种方式 串行通信的传输模式 串行通信的错误校验 1.奇偶校验 2.代码和校验 3.循环冗余码校验 串行口结构 串行口控制寄存器SCON 特殊功能寄存器PCON 串行口的4种工作方式 方式0&#xff1a; &#xff08;1&#xff09;方式0的发送过程 &#xff0…

数据结构---堆

1.堆的概念及结构 堆的性质&#xff1a; 堆中某个节点的值总是不大于或不小于其父节点的值堆总是一棵完全二叉树 2.举例说明 堆一般是把数组数据看做是一棵完全二叉树 小堆要求&#xff1a;任意一个父亲<孩子大堆要求&#xff1a;任意一个父亲>孩子 比如&#xff1…

计算机图形学:直线的扫描转换算法解析与实现

直线的扫描转换&#xff1a; DDA算法&#xff1a; 推理&#xff1a; 在计算机显示图形时&#xff0c;由于显示计算机的分辨率是有限的所以我们在绘制图形时需要将图形从连续量转换成离散量才能完成图形的绘制&#xff0c;直线的扫描转换就是将连续量转换为离散量的过程。 对…

UE Web Remote Control

前言 最近在研究UE自启WEB服务和网页通信以此来通过网页与UE进行数据交互&#xff0c;这样最好的方式就是可以摒弃掉整个繁琐的通信连接流程如TCP UDP&#xff0c;但是找到的一些方法都不是很适用&#xff0c;尤其是WEBUI这个插件它只适合内嵌到UE本身才能完成交互&#xff0c;…

mybatis关于namespace以及id以及Mapper接口命名的说明(了解)

1、建库建表 CREATE DATABASE mybatis-example;USE mybatis-example;CREATE TABLE t_emp(emp_id INT AUTO_INCREMENT,emp_name CHAR(100),emp_salary DOUBLE(10,5),PRIMARY KEY(emp_id) );INSERT INTO t_emp(emp_name,emp_salary) VALUES("tom",200.33); INSERT INTO…

Pytorch从零开始实战11

Pytorch从零开始实战——ResNet-50V2算法实战 本系列来源于365天深度学习训练营 原作者K同学 文章目录 Pytorch从零开始实战——ResNet-50V2算法实战环境准备数据集模型选择开始训练可视化总结 环境准备 本文基于Jupyter notebook&#xff0c;使用Python3.8&#xff0c;Pyt…

CentOS 8 安装国内、本地YUM源

环境&#xff1a;windows 11、 VMware 17、Cent OS 8 目的&#xff1a;加快软件下载速度 1、国内YUM源安装 使用国外的源&#xff0c;速度卡到不显示 备份默认YUM源文件 [rootlocalhost ~]# cd /etc/yum.repos.d/ [rootlocalhost yum.repos.d]# mkdir yum.bak [rootlocalho…

Drawer抽屉(antd-design组件库)简单用法

1.Drawer抽屉 屏幕边缘滑出的浮层面板。 2.何时使用 抽屉从父窗体边缘滑入&#xff0c;覆盖住部分父窗体内容。用户在抽屉内操作时不必离开当前任务&#xff0c;操作完成后&#xff0c;可以平滑地回到原任务。 需要一个附加的面板来控制父窗体内容&#xff0c;这个面板在需要时…

3D场景建模工具

在线工具推荐&#xff1a; 三维数字孪生场景工具 - GLTF/GLB在线编辑器 - Three.js AI自动纹理化开发 - YOLO 虚幻合成数据生成器 - 3D模型在线转换 - 3D模型预览图生成服务 1. 什么是3D场景建模&#xff1f; 3D场景建模是一种通过计算机图形学技术&#xff0c;将现实世…

<Linux>冯诺依曼体系结构||操作系统||系统调用于用户操作接口

前言:本文从软硬件角度计算机解释软硬件结构 硬件—冯诺依曼体系结构 软件—操作系统 文章目录 冯诺依曼计算机体系结构背景理解举例 操作系统(OS)OS的管理为什么要有操作系统? 系统调用与用户操作接口系统调用用户操作接口引入:printf&&scanf的重新理解库函数 计算机…

Could NOT find resource [logback-test.xml]

修改 之后就可以正常启动了