爬虫逆向实战(二十三)--某准网数据

news/2024/7/19 12:29:54 标签: 爬虫

一、数据接口分析

主页地址:某准网

1、抓包

通过抓包可以发现数据接口是api_to/search/company_v2.json
在这里插入图片描述

2、判断是否有加密参数

  1. 请求参数是否加密?
    通过查看“载荷”模块可以发现b参数和kiv参数是加密参数
    在这里插入图片描述
  2. 请求头是否加密?
  3. 响应是否加密?
    通过查看“响应”模块可以发现,网站返回的响应数据也是加密的
    在这里插入图片描述
  4. cookie是否加密?

二、加密位置定位

1、加密参数bkiv

(1)看启动器

查看启动器发现里面包含异步,所以无法正确找到加密位置
在这里插入图片描述

(2)搜索关键字

通过搜索关键字kiv:可以发现有一处条件判断,根据请求的方法和请求头类型设置bkiv,所以此处大概是加密参数的赋值位置。
在这里插入图片描述
在此处下断点,再次获取数据,发现可以断住,ta是加密参数的值。同时ta的生成就在上方,所以此处就是加密位置。
在这里插入图片描述

2、响应数据

因为响应加密数据一般都是json数据加密,所以解密后会使用JSON.parse进行解密,所以我们可以对JSON.parse进行hook
hook代码段:

var my_parse = JSON.parse;
JSON.parse = function (params) {
    debugger
    console.log("json_parse params:",params);
    return my_parse(params);
};

运行hook代码,再次获取数据,发现可以断住明文
在这里插入图片描述
接着调试执行,可以发现e.data是密文数据,经过M.gy方法解密后的t是明文数据。
在这里插入图片描述

三、扣js代码

将加密以及解密的方法扣出,缺啥补啥即可。在扣代码时可以发现,网站使用的AES加密,所以可以直接使用标准模块。同时,kiv是加解密时使用的iv,所以加解密时要使用相同的kiv
JavaScript源码:

var CryptoJS = require('crypto-js')

function M_A(e) {
    void 0 === e && (e = 16);
    for (var t = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789".split(""), n = "", r = 0; r < e; r++) {
        n += t[Math.ceil(61 * Math.random())]
    }
    return n
}

var s, u = (s = null,
        function () {
            return s || (s = function () {
                var e, t, n, r, i = null;
                return i || (t = new RegExp("\\u200c", "g"),
                    n = new RegExp("\\u200d", "g"),
                    r = new RegExp(".{8}", "g"),
                    e = "‍‌‍‍‍‌‌‌‍‍‌‍‍‌‍‍‍‍‌‍‍‌‍‍‍‌‍‌‍‍‍‌‍‌‌‍‍‍‍‌‍‌‌‌‍‌‌‌‍‌‌‍‍‍‌‌‍‌‌‍‌‍‌‌‍‌‍‍‍‌‌‌‍‌‌‍‍‌‌‍‍‌‌‍‍‍‍‌‍‌‍‍‌‌‍‍‍‌‍‍‍‍‌‍‍‍‌‌‌‍‍‌‍‍‌‌‍‌‌‌‍‌‌‌‍‍‌‍".replace(r, (function (e) {
                            return String.fromCharCode(parseInt(e.replace(t, 1).replace(n, 0), 2))
                        }
                    )),
                    i = {
                        key: CryptoJS.enc.Utf8.parse(e),
                        mode: CryptoJS.mode.CBC,
                        pad: CryptoJS.pad.Pkcs7
                    }),
                    i
            }()),
                s
        }
)

l = function (e, t) {
    void 0 === e && (e = ""),
    void 0 === t && (t = "");
    var n = u()
        , r = CryptoJS.AES.encrypt(e.toString(), n.key, {
        iv: CryptoJS.enc.Utf8.parse(t),
        mode: n.mode,
        padding: n.pad
    });
    return r = r.toString()
}

c = function (e, t) {
    void 0 === e && (e = ""),
    void 0 === t && (t = "");
    var n = u()
        , r = CryptoJS.AES.decrypt(e.toString(), n.key, {
        iv: CryptoJS.enc.Utf8.parse(t),
        mode: n.mode,
        padding: n.pad
    });
    return r = r.toString(CryptoJS.enc.Utf8)
}

M_mA = function (e, t) {
    return e ? ("string" != typeof e && (e = e.toString()),
        l(e, t.iv)) : ""
}

function M_gy(e, t) {
    var n = "";
    return "string" == typeof e && e.length > 20 && (n = c(e, t.iv)),
        n
}

function get_params() {
    var r_data = {
        "query": "爬虫",
        "pageNum": 5,
        "limit": 15
    }

    var n = JSON.stringify(r_data);
    var kiv = M_A()

    var t = M_mA(n, {iv: kiv}).replace(/\//g, "_").replace(/\+/g, "-").replace(/=/g, "~");
    return {
        b: t,
        kiv: kiv
    }
}

function decryption_data(e_data, kiv) {
    var data = M_gy(e_data, {iv: kiv})
    data = JSON.parse(data)
    return data
}

http://www.niftyadmin.cn/n/4977260.html

相关文章

Gitlab怎么将一个分支代码合并到另外一个分支

在 GitLab 中将一个分支的代码合并到另一个分支,通常需要使用 Git 的命令行工具或者 GitLab 的网页界面来完成。以下是使用命令行和网页界面两种方式的步骤: 使用命令行方式: 首先,确保你已经克隆了仓库到本地,并在本地完成了相应的修改。 切换到要合并代码的目标分支。假…

数据结构】二叉树篇|超清晰图解和详解:后序篇

博主简介&#xff1a;努力学习的22级计算机科学与技术本科生一枚&#x1f338;博主主页&#xff1a; 是瑶瑶子啦每日一言&#x1f33c;: 你不能要求一片海洋&#xff0c;没有风暴&#xff0c;那不是海洋&#xff0c;是泥塘——毕淑敏 目录 一、核心二、题目 一、核心 我们清楚…

一篇文章全面解析Modbus协议

Modbus 协议是应用于电子控制器上的一种通用语言。通过此协议&#xff0c;控制器相互之间、控制器经由网络&#xff08;例如以太网&#xff09;和其它设备之间可以通信。它已经成为一通用工业标准。有了它&#xff0c;不同厂商生产的控制设备可以连成工业网络&#xff0c;进行集…

C++学习笔记总结练习:多态的三种实现方式

多态的三种方式 0 概述 定义 多态的定义简单来说就是使一条语句有多种状态。 实现方式 多态的实现方式分为三块&#xff1a;重载、重写、重定义。下面我们来谈一谈他们各自的实现方式和实现原理。 1 重载 实现方式 重载是在同一作用域内&#xff08;不管是模块内还是类…

vue3 publish 出现的问题

vue3项目使用 yarn build 编译出dist文件&#xff0c; 发布后出现错误 #问题与解决 1)登录迭代错误(Maximum call stack size exceeded) >deepclone 的问题 在 GrandhallLayout 中判断菜单和权限中; const mainMenu cloneDeep(router.getRoutes()) lodash.clonedee…

【嘉立创EDA】焊接辅助图纸制作

文章路标👉 文章解决问题主题内容拙见与拓展文章解决问题 1️⃣ 嘉立创EDA专业版在较新的版本中(如版本 : V2.1.17)中支持了焊接辅助工具功能,在这个功能中,包含了位号与PCB的对应索引(分位号聚合排序与不聚合排序两种序列方法),可以索引到对应的3D仿真图,或者简图(…

SpringBoot项目在启动后自动关闭

问题描述&#xff1a; 今天搭建了一个SpringBoot项目&#xff0c;但是在启动之后就自行关闭了&#xff0c;就像下面这样&#xff1a; 原因分析&#xff1a;在创建SpringBoot项目的时候&#xff0c;Web的依赖没有导入&#xff0c;默认以普通java项目运行导致的终止。 解决方案…

kde切换中/英文目录

切换为英文 export LANGzh_CN.UTF-8 xdg-user-dirs-upate切换为英文 export LANGen_US.UTF-8 xdg-user-dirs-upate如果没有生效&#xff0c;则可以尝试把~/.config/user-dirs.dirs和~/.config/user-dirs.locate移除后重启。