前程无忧接口分析

news2024/11/28 12:50:25

前程无忧接口分析

  • 所需用到的工具
  • URL解析
  • 通过抓包软件或者开发者选项抓取数据包
  • 对代码中的参数解析分析
  • 对acw_sc__v2进行分析
  • 对acw_sc__v2进行转换代码生成
    • 生成outPutList数组
    • 生成arg2参数
    • 生成arg3参数
    • 最终的效果
  • 对详情页面的分析
    • 对timestamp__1258的生成分析

所需用到的工具

  • Charles抓包工具
  • https://curlconverter.com/python/

URL解析

先访问网页https://www.51job.com/
在这里插入图片描述输入关键字点击搜索
在这里插入图片描述通过查看这个网址
https://we.51job.com/pc/search?jobArea=260200&keyword=%E5%85%BC%E8%81%8C&searchType=2&sortType=0&metro=

有以下参数

参数名说明
jobArea260200城市代码
keyword兼职关键字(UrlEncode 编码)
sortType00代表综合排序
1代表最新优先
3代表薪资优先
5代表活跃职位优先

通过抓包软件或者开发者选项抓取数据包

在这里插入图片描述复制cURL Request通过https://curlconverter.com/go/转为Python代码
在这里插入图片描述

运行代码查看是否能获取成功

在这里插入图片描述

对代码中的参数解析分析

通过对代码中的参数分析,最终发现修改acw_sc__v2的值会导致访问失败

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

所以基本上确定acw_sc__v2为我们需要破解的

对acw_sc__v2进行分析

现在我们需要去网站对acw_sc__v2逆向分析
先检查一下acw_sc__v2,是本地生成的还是服务器生成
通过如下图可知它是由本地js文件生成的
在这里插入图片描述现在我们需要把这个值删除,并编写一个hook使其能够快速的定位

cookie_cache = document.cookie;
Object.defineProperty(document, "cookie", {
        get: function () {
            console.log(cookie_cache);
        // 在获取document.cookie时,执行你想要的操作
        return cookie_cache; // 返回原始的cookie值
    },
    set: function(value) {
        // 在设置document.cookie时,执行你想要的操作
        if(value.includes('acw_sc__v2')){
           debugger;
        }

    }
});

在这里插入图片描述最终定位如下图
在这里插入图片描述开始对栈分析,定位到上一栈
在这里插入图片描述通过查看我们可以知道arg3就是acw_sc__v2的值
在这里插入图片描述
在这里打上一个断点,并重新加载页面

在这里插入图片描述
搜寻arg3
在这里插入图片描述
通过阅读这份代码可知arg3是通过一个循环来生成的,但是循环的条件与arg2有关,arg2又与列表outPutList有关,outPutListarg1有关

所以基本的思路为通过arg1生成outPutListoutPutList生成arg2arg2生成arg3

搜寻arg1
在这里插入图片描述在这里打上断点,重新加载网页
在这里插入图片描述在这里插入图片描述通过如上两张图片可知arg1来自于访问一个URL所返回的body

通过抓包软件抓取并转为Python代码
在这里插入图片描述在这里插入图片描述我们可以通过正则表达式取出这个值

arg1=re.findall("arg1=('[^']*')",response.text)
arg1=arg1[0].replace("'","")

对acw_sc__v2进行转换代码生成

生成outPutList数组

通过arg1生成outPutList

for (var i = 0; i < arg1[_0x1e8e("0x1")]; i++) {
    var this_i = arg1[i];
    for (var j = 0; j < posList[_0x1e8e("0x1")]; j++) {
        if (posList[j] == i + 1) {
            outPutList[j] = this_i
        }
    }
}

分析这个js代码可知这是通过循环来生成的
arg1[_0x1e8e(“0x1”)]是arg1的长度
posList[_0x1e8e(“0x1”)]是posList数组的长度
posList数组是固定值
转为Python代码如下

arg1='6AA3E7F5214AEB580A31B0B254C4795589509422'
posList = [15, 35, 29, 24, 33, 16, 1, 38, 10, 9, 19, 31, 40, 27, 22, 23, 25, 13, 6, 11, 39, 18, 20, 8, 14, 21, 32, 26, 2, 30, 7, 4, 17, 5, 3, 28, 34, 37, 12, 36]
outPutList = []
for i in range(len(arg1)):
    outPutList.append(0)

for i in range(len(arg1)):
    this_i = arg1[i]
    for j in range(len(posList)):
        if posList[j] == i + 1:
            outPutList[j] = this_i

print(outPutList)

生成arg2参数

经过对代码的分析可知arg2是由outPutList数组转为字符串实现的

arg2 = outPutList[_0x1e8e("0x2")]("");
arg2  = ''.join(outPutList)

生成arg3参数

for (var i = 0; i < arg2[_0x1e8e("0x1")] && i < mask[_0x1e8e("0x1")]; i += 2) {
    var GxjQsM = _0x1e8e("0x3")[_0x1e8e("0x4")]("|")
        , QoWazb = 0;
    while (!![]) {
        switch (GxjQsM[QoWazb++]) {
            case "0":
                if (xorChar[_0x1e8e("0x1")] == 1) {
                    xorChar = "0" + xorChar
                }
                continue;
            case "1":
                var strChar = parseInt(arg2[_0x1e8e("0x5")](i, i + 2), 16);
                continue;
            case "2":
                arg3 += xorChar;
                continue;
            case "3":
                var xorChar = (strChar ^ maskChar)[_0x1e8e("0x6")](16);
                continue;
            case "4":
                var maskChar = parseInt(mask[_0x1e8e("0x5")](i, i + 2), 16);
                continue
        }
        break
    }
}

arg2[_0x1e8e(“0x1”)]是arg2的长度
mask[_0x1e8e(“0x1”)]是mask的长度
mask是固定值3000176000856006061501533003690027800375
GxjQsM是固定的列表[‘1’, ‘4’, ‘3’, ‘0’, ‘2’]

转为Python代码

arg3=''
for i in range(0, 40, 2):
    strChar = int(arg2[i:i + 2], 16)
    maskChar = int(mask[i:i + 2], 16)
    xorChar = hex(strChar ^ maskChar)[2:]
    if len(xorChar) == 1:
        xorChar = '0' + xorChar
    arg3 += xorChar

最终的效果

在这里插入图片描述

对详情页面的分析

随便点击一个页面进入详情页面,抓包抓取数据
在这里插入图片描述复制CURL命令转为Python代码,运行代码
在这里插入图片描述可以获取数据
开始分析,最终发现只有修改reqtimestamp__1258才会获取失败,并且这两个是一对的,任何一个被修改都会导致获取失败

在这里插入图片描述

对timestamp__1258的生成分析

通过抓包软件发现在跳转页面之前会访问一个url获取js代码

在这里插入图片描述把整个js代码复制下来到浏览器去调试
在这里插入图片描述

在这里插入图片描述搜寻_0x3baf44
在这里插入图片描述搜寻_0x30f62c
在这里插入图片描述最中发现这个_0x56d97c是一个函数,提交的参数为下面这种结构

-1837977873|0|1702035443735
number|0|number
0之后的数字的为时间戳,第一个数字暂不知道,所以去搜寻

在这里插入图片描述大致阅读可知_0x318558通过for循环来生成的,其中与_0x1117c9有关
搜寻_0x1117c9

在这里插入图片描述打印_0x1117c9
在这里插入图片描述这里你会很熟悉,这些数据都是搜索接口里所抓取的数据
在这里插入图片描述也就是说timestamp__1258的生成思路为
构造如下的列表

{
    "protocol": "https:",
    "host": "jobs.51job.com",
    "hostname": "jobs.51job.com",
    "port": "",
    "pathname": "/guiyang-gshq/152094046.html",
    "search": "?s=sou_sou_soulb&t=0_0&req=04608edfce87b123a2d4951514d63dc4",
    "hash": "",
    "original": "https://jobs.51job.com/guiyang-gshq/152094046.html?s=sou_sou_soulb&t=0_0&req=04608edfce87b123a2d4951514d63dc4"
}

通过for循环生成_0x318558,在通过_0x318558构造如下结构的数据

_0x318558|0|时间戳

提交到_0x56d97c函数生成timestamp__1258的值

_0x56d97c函数太过庞大并且这个js代码是混淆后的,最终选择补环境的方式来实现这个生成,让后通过Python调用js代码
补环境之后的效果
在这里插入图片描述在这里插入图片描述

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

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

相关文章

一些系统日常运维命令和语句

一、前言 记录一些日常系统运维的命令和语句 二、linux命令与语句 1、linux查看各目录使用磁盘情况 du -h /home home为目录 du -h /home 2.查看内存使用情况 free -h 3、查看进程和CPU使用情况 top top 三、数据库语句 1、统计mysql数据库表数量 SELECT COUNT(*) A…

【爬取二手车并将数据保存在数据库中】

爬取二手车并将数据保存在数据库中 查看网页结构分析爬取步骤解密加密信息将密文解密代码&#xff1a; 进行爬取&#xff1a;爬取函数写入解密文件函数和获取城市函数解密文件&#xff0c;返回正确字符串函数保存到数据库 运行结果 查看网页结构分析爬取步骤 可以看出网页使用…

新版本AndroidStudio删除无用资源

第一步&#xff1a; 第二步&#xff1a; 第三步&#xff0c;等加载完&#xff0c;自己选择要删除的文件。 注意&#xff01;&#xff01;&#xff01; 可能会遇到没有显示无用资源&#xff0c;这时把项目运行在真机上就出来了。

学习pytorch19 pytorch使用GPU训练

pytorch使用GPU进行训练 1. 数据 模型 损失函数调用cuda()2. 使用谷歌免费GPU gogle colab 需要创建谷歌账号登录使用, 网络能访问谷歌3. 执行4. 代码 B站土堆学习视频&#xff1a; https://www.bilibili.com/video/BV1hE411t7RN/?p30&spm_id_frompageDriver&vd_sourc…

Python Authlib库:构建安全可靠的身份验证系统

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com 在现代应用程序中&#xff0c;安全性是至关重要的&#xff0c;特别是在处理用户身份验证时。Authlib库为Python开发者提供了一套强大的工具&#xff0c;用于简化和增强身份验证和授权流程。本文将深入探讨Authli…

js/jQuery常见操作 之各种语法例子(包括jQuery中常见的与索引相关的选择器)

js/jQuery常见操作 之各种语法例子&#xff08;包括jQuery中常见的与索引相关的选择器&#xff09; 1. 操作table常见的1.1 动态给table添加title&#xff08;指定td&#xff09;1.1.1 给td动态添加title&#xff08;含&#xff1a;获取tr的第几个td&#xff09;1.1.2 动态加工…

elasticsearch聚合、自动补全、数据同步

目录 一、数据聚合1.1 聚合的种类1.2 DSL实现聚合1.2.1 Bucket聚合语法1.2.2 聚合结果排序1.2.3 限定聚合范围1.2.4 Metric聚合语法 1.3 RestAPI实现聚合 二、自动补全2.1 拼音分词器2.2 自定义分词器2.3 自动补全查询2.4 RestAPI实现自动补全 三、数据同步3.1 思路分析3.1.1 同…

Java来实现二叉树算法,将一个二叉树左右倒置(左右孩子节点互换)

文章目录 二叉树算法二叉树左右变换数据 今天来和大家谈谈常用的二叉树算法 二叉树算法 二叉树左右变换数据 举个例子&#xff1a; Java来实现二叉树算法&#xff0c;将一个二叉树左右倒置&#xff08;左右孩子节点互换&#xff09;如下图所示 实现的代码如下&#xff1a;以…

CMake ‘3.10.2‘ was not found in PATH or by cmake.dir property.

在部署Yolov5到安卓端的过程中出现&#xff1a;CMake ‘3.10.2’ was not found in PATH or by cmake.dir property. 原因&#xff1a; cmake版本太高&#xff0c;需要安装低版本的cmake 最开始下载的是默认最高版本的cmake,默认是3.22.1&#xff0c;解决方案是&#xff0c;下载…

AIGC创作系统ChatGPT网站源码,Midjourney绘画,GPT联网提问/即将支持TSS语音对话功能

一、AI创作系统 SparkAi创作系统是基于ChatGPT进行开发的Ai智能问答系统和Midjourney绘画系统&#xff0c;支持OpenAI-GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美&#xff0c;可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如何搭建部署AI…

C++初阶 | [七] (上) string类

摘要&#xff1a;标准库中的string类的常用函数 C语言中&#xff0c;字符串是以\0结尾的一些字符的集合&#xff0c;为了操作方便&#xff0c;C标准库中提供了一些str系列的库函数&#xff0c; 但是这些库函数与字符串是分离开的&#xff0c;不太符合OOP(面向对象)的思想&#…

区块链创新应用场景不断拓展,实现去中心化

小编介绍&#xff1a;10年专注商业模式设计及软件开发&#xff0c;擅长企业生态商业模式&#xff0c;商业零售会员增长裂变模式策划、商业闭环模式设计及方案落地&#xff1b;扶持10余个电商平台做到营收过千万&#xff0c;数百个平台达到百万会员&#xff0c;欢迎咨询。 区块…

网络知识学习(笔记三)(传输层的TCP)

前面已经介绍了传输层的UDP协议的报文以及一下相关的知识点&#xff0c;本次主要是传输层的TCP协议&#xff0c;包括TCP报文的详细介绍&#xff1b;可靠传输、流量控制、拥塞控制等&#xff1b;建立连接、释放连接。 一、TCP基本知识点介绍 1.1、TCP协议的几个重要的知识点 …

联想电脑重装系统Win10步骤和详细教程

联想电脑拥有强大的性能&#xff0c;很多用户办公都喜欢用联想电脑。有使用联想电脑的用户反映系统出现问题了&#xff0c;想重新安装一个正常的系统&#xff0c;但是不知道重新系统的具体步骤。接下来小编详细介绍给联想电脑重新安装Win10系统系统的方法步骤。 推荐下载 系统之…

Elastcsearch:通过 Serverless 提供更多服务

作者&#xff1a;Ken Exner 人们使用 Elasticsearch 解决最大数据挑战的方式一直令我们感到惊讶。 从超过 40 亿次下载、70,000 次提交、1,800 名贡献者以及我们全球社区的反馈中可以清楚地看出这一点。 Elastic 在广泛的用例中发挥的作用促使我们简化复杂性&#xff0c;让搜索…

2023年12月8日:UI登陆界面

作业 头文件 #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QMovie> #include <QPushButton> #include <QDebug>QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMESPACEclass Widget : public QWidget {Q_OBJECTpub…

Liunx系统使用超详细(五)~命令符号

目录 一、逻辑符号 1.1&& 1.2|| 二、连接符号 2.1| 2.2> 2.3>> 2.4< 三、分隔符号 3.1 &#xff1b; 在Linux中&#xff0c;逻辑符号和连接符号常用于构建命令行中的逻辑操作和管道操作。下面对这两种符号进行总结描述。 一、逻辑符号 1.1&…

运维知识点-Nginx

Nginx Nginx解析安全实战预备知识实验目的#制作图片木马# web服务器-Nginx服务命令及配置centOS7安装安装所需插件安装gccpcre、pcre-devel安装zlib安装安装openssl Nginx解析安全实战 预备知识 NginxPHP/FastCGI构建的WEB服务器工作原理 Nginx|FastCGI简介 Nginx (“engin…

Spring--10--Spring Bean的生命周期

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 1.Spring Bean1.1 什么是 Bean简而言之&#xff0c;bean 是由 Spring IoC 容器实例化、组装和管理的对象。 1.2 Spring框架管理Bean对象的优势 2.Bean的生命周期实例…

Linux shell编程学习笔记34:eval 命令

0 前言 在JavaScript语言中&#xff0c;有一个很特别的函数eval&#xff0c;eval函数可以将字符串当做 JavaScript 代码执行&#xff0c;返回表达式或值。 在Linux Shell 中也提供了内建命令eval&#xff0c;它是否具有JavaScript语言中eval函数的功能呢&#xff1f; 1 eval命…