爬虫练习(js逆向解密)

news2024/9/25 13:21:25

目标

        网站地址交易列表 - 福建省公共资源交易电子公共服务平台 (fj.gov.cn)

        抓取内容如下:

分析 

        查找js代码

        点击下一页翻页的时候,查看请求返回的数据,发现data数据是经过加密后得到的

        通过全局搜索data,发现有两千多个结果,一个一个去找是会非常麻烦,所有可以查一下其它的值,例如msg

         

        查找msg后,只有3个js文件,这样大大降低了我们的查询难度,只需要一个一个文件去看就好了。

         

        通过挨个查找msg,我们发现了以下部分js代码,其中json.parse一般是用于js中数据解密的。所以我们可以猜测这个部分的代码就是和data数据加密有关。

         证明

        通过打断点刷新页面后我们发现,此时传入的数据e.Data就是我们之前得到的未加密数据,据,e.Data经过b()函数解密后得到数据。我们可以直接在控制台输入b(e.Data)来查看解码后的结果。

        所以我们想要的解密函数就是b函数,鼠标悬停在b上,直接追溯到b函数的位置,得到以下结果,可以很清楚的看到用的是AES加解密。

 JS代码补环境

        新建js文件,将b函数摘到js文件中,导入crypto-js包,同时将h.a替换成CryptoJS

         继续在浏览器中对b函数打断点进行分析。通过多次刷新跳转页面,发现e的值固定是"EB444973714E4A40876CE66BE45D5930",i的值固定是"B5A8904209931867",无论跳转到第几页这两个值都是不变的,而t则是我们输入的未解密数据。

        使用固定值替换,同时引入一个固定的t,在命令窗口下运行该js,擦看是否可以运行。

修改后的测试js如下:

命令窗口运行结果如下:

        成功解密,说明js编写没有问题

python与js结合 

        在完成js文件的编辑后,我们需要使用python程序调用js文件,进行解密。

后续问题

        在固定data值下python可以正常运行,当继续访问网页解析代码后,发现无法获取到页面元素。这里猜测和时间戳有关,过了一段时间后portal-sign值就会改变,所以需要继续查询网页的js代码,找到portal-sign是如何生成的

        全局搜索portal-sign,只有一处

        portal-sign是通过f.getSign(e)获得,继续打断点获取数据。

        看到e中有ts属性,可以猜测到这个是和时间戳有关系的。 

         通过逆向查找getSign()函数,补全js代码,如下:

         在发送到url的请求中替换ts为当前的时间戳

        head头中的portal-sign替换为js的运行结果:

        代码运行结果如下,拿到数据后有很多方法去处理,这里就不再多写了: 

源码

        py源码

import time

import requests
import json
import execjs


with open('./tests.js', 'r', encoding='utf-8') as f:
    ctx = execjs.compile(f.read())


data = {
    "pageNo": 3,
    "pageSize": 20,
    "total": 3675,
    "AREACODE": "",
    "M_PROJECT_TYPE": "",
    "KIND": "GCJS",
    "GGTYPE": "1",
    "PROTYPE": "",
    "timeType": "6",
    "BeginTime": "2024-03-01 00:00:00",
    "EndTime": "2024-09-01 23:59:59",
    "createTime": [],
    "ts": int(time.time()*1000)
}

headers = {
    "Accept": "application/json, text/plain, */*",
    "Accept-Language": "zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6",
    "Connection": "keep-alive",
    "Content-Type": "application/json;charset=UTF-8",
    "Origin": "https://ggzyfw.fj.gov.cn",
    "Referer": "https://ggzyfw.fj.gov.cn/business/list/",
    "Sec-Fetch-Dest": "empty",
    "Sec-Fetch-Mode": "cors",
    "Sec-Fetch-Site": "same-origin",
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36 Edg/128.0.0.0",
    "portal-sign": ctx.call('d2', data),
    "sec-ch-ua": "\"Chromium\";v=\"128\", \"Not;A=Brand\";v=\"24\", \"Microsoft Edge\";v=\"128\"",
    "sec-ch-ua-mobile": "?0",
    "sec-ch-ua-platform": "\"Windows\""
}

cookies = {
    "ASP.NET_SessionId": "vj2wan2om5jhh1x5ou3vvcob"
}

url = "https://ggzyfw.fj.gov.cn/FwPortalApi/Trade/TradeInfo"

data = json.dumps(data, separators=(',', ':'))
response = requests.post(url, headers=headers, cookies=cookies, data=data).json()
text = response['Data']

print(text)


res = ctx.call('bbb', text)
print(res)


        js源码

//npm install crypto-js 
const CryptoJS = require('crypto-js')

function bbb(t) {
    //"EB444973714E4A40876CE66BE45D5930"
    //"B5A8904209931867"
    var e = CryptoJS.enc.Utf8.parse("EB444973714E4A40876CE66BE45D5930")
      , n = CryptoJS.enc.Utf8.parse("B5A8904209931867")
      , a = CryptoJS.AES.decrypt(t, e, {
        iv: n,
        mode: CryptoJS.mode.CBC,
        padding: CryptoJS.pad.Pkcs7
    });
    return a.toString(CryptoJS.enc.Utf8)
}
function l(t, e) {
    return t.toString().toUpperCase() > e.toString().toUpperCase() ? 1 : t.toString().toUpperCase() == e.toString().toUpperCase() ? 0 : -1
}
function u(t) {
    for (var e = Object.keys(t).sort(l), n = "", a = 0; a < e.length; a++)
        if (void 0 !== t[e[a]])
            if (t[e[a]] && t[e[a]]instanceof Object || t[e[a]]instanceof Array) {
                var i = JSON.stringify(t[e[a]]);
                n += e[a] + i
            } else
                n += e[a] + t[e[a]];
    return n
}
function d2(t) {
    for (var e in t)
        "" !== t[e] && void 0 !== t[e] || delete t[e];
    var n = "B3978D054A72A7002063637CCDF6B2E5" + u(t);
    return CryptoJS.MD5(n).toString().toLowerCase()
}

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

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

相关文章

Qt将数据库中的数据导出为html

一、源码分享 bool ReportFormUtils::exportReportHtml(QString &errString, const QString tableName, const QString savePathAndName, const QString tableTitle, const QString tableInfo) {Q_UNUSED(errString)Q_UNUSED(tableName)Q_UNUSED(savePathAndName)#define …

原子放大1亿倍能看到另一个宇宙?微观与宏观是一体的?

原子的行星模型 开始阐述前,先从物质 组成与体积 方面进行一些铺垫与解释:我们身处于物质的世界,大部分物质由分子构成,分子由原子构成,原子由电子、质子、中子构成,质子,中子又是由夸克构成。鉴于人类目前的科技,或许未来也可以知道电子的组成是否有更加微观的存在…

kubernetes中的资源管理

目录 1 资源管理介绍 2 资源管理的方式 2.1 kubectl命令介绍及格式 2.2 资源类型 2.3 kubectl 常见操作指令 2.3.1 CREATE 示例&#xff1a; 2.3.1.1 指定资源类型创建 2.3.1.2 查看创建的资源类型 2.3.1.3 查看pods是否正确被创建并且被调度 2.3.1.4 查看名为shuyan 的 Dep…

Flutter基本组件Text使用

Text是一个文本显示控件&#xff0c;用于在应用程序界面中显示单行或多行文本内容。 Text简单Demo import package:flutter/material.dart;class MyTextDemo extends StatelessWidget {const MyTextDemo({super.key});overrideWidget build(BuildContext context) {return Sca…

我写了个ffmpeg-spring-boot-starter 使得Java能剪辑视频!!

最近工作中在使用FFmpeg&#xff0c;加上之前写过较多的SpringBoot的Starter&#xff0c;所以干脆再写一个FFmpeg的Starter出来给大家使用。 首先我们来了解一下FFmpeg能干什么&#xff0c;FFmpeg 是一个强大的命令行工具和库集合&#xff0c;用于处理多媒体数据。它可以用来做…

【redis】redis编译和redis.conf配置

下载源码 reids 解压编译 # 解压 tar -zxvf redis-5.0.14.tar.gz cd redis-5.0.14/ make PREFIX/opt/redis install# requirepass root # 开启远程访问 bind 0.0.0.0 protected-mode no # 修改日志打印路径&#xff0c;修改redis.conf daemonize yes logfile /var/log/redis.…

[深度学习][LLM]:浮点数怎么表示,什么是混合精度训练?

混合精度训练 混合精度训练1. 浮点表示法&#xff1a;[IEEE](https://zh.wikipedia.org/wiki/电气电子工程师协会)二进制浮点数算术标准&#xff08;IEEE 754&#xff09;1.1 浮点数剖析1.2 举例说明例子 1:例子 2: 1.3 浮点数比较1.4 浮点数的舍入 2. 混合精度训练2.1 为什么需…

网络编程day01(IP地址、Socket、端口号)

目录 【1】IP地址 1》基本概念 IP地址 NAT设备&#xff08;网络地址转换&#xff09; DHCP服务器&#xff08;动态主机配置协议&#xff09; 2》网络号/主机号&#xff08;二级划分&#xff09; 3》IP地址分类 特殊地址 4》子网掩码 5》三级划分 【2】socket 1》socke…

浅谈人工智能之基于AutoGen Studio+litellm+ollama构建model

浅谈人工智能之基于AutoGen Studiolitellmollama构建model 摘要 随着自然语言处理技术的飞速发展&#xff0c;基于大型语言模型&#xff08;Large Language Models, LLMs&#xff09;的应用越来越广泛。本指南旨在介绍如何利用AutoGen Studio、litellm和ollama这三大工具&…

【数据结果-二维前缀和】力扣221. 最大正方形

在一个由 ‘0’ 和 ‘1’ 组成的二维矩阵内&#xff0c;找到只包含 ‘1’ 的最大正方形&#xff0c;并返回其面积。 示例 1&#xff1a; 输入&#xff1a;matrix [[“1”,“0”,“1”,“0”,“0”],[“1”,“0”,“1”,“1”,“1”],[“1”,“1”,“1”,“1”,“1”],[“1”…

8月刷题笔记

刷题笔记—8月 LCP40.心算挑战(贪心、排序) class Solution { public:int maxmiumScore(vector<int>& cards, int cnt) {//24.8.1ranges::sort(cards, greater()); //从大到小排序int s reduce(cards.begin(), cards.begin()cnt, 0);if(s%2 0) return s;auto rep…

Java毕业设计 基于SpringBoot vue社区养老服务管理系统

Java毕业设计 基于SpringBoot vue社区养老服务管理系统 SpringBoot 社区养老服务管理系统 功能介绍 护工: 登录 主页 老人管理 健康记录管理 管理员: 登录 主页 用户管理 床位类型管理 床位管理 护工管理 老人管理 预约记录管理 来访记录管理 健康记录管理 费用管理…

网络编程套接字(Socket)详解 V✪ω✪V

目录 &#x1f348;一.什么是网络编程 1.1什么是网络编程&#xff1f; 1.2网络通信中的基本概念&#xff1a; &#x1f347;二.Soket&#xff08;套接字&#xff09;→网络编程的基础 2.1概念&#xff1a; 2.2Socket套接字分类: 数据包套接字&#xff1a;使用传输层UDP协…

Leetcode JAVA刷刷站(111)二叉树的最小深度

一、题目概述 二、思路方向 在Java中&#xff0c;要找出二叉树的最小深度&#xff0c;我们可以使用递归的方法。基本思路是&#xff0c;对于给定的根节点&#xff0c;如果它是空的&#xff0c;那么最小深度为0&#xff08;但实际上&#xff0c;空树没有深度&#xff0c;但在…

ARM 工业计算机搭载 FUXA 组态软件:开启智能制造新时代

工业自动化已经成为提高生产效率、保证产品质量以及提升企业竞争力的关键因素。而在工业自动化的舞台上&#xff0c;FUXA 组态软件与 ARM 工业计算机的组合正发挥着越来越重要的作用&#xff0c;以其高效稳定、数据可视化、实时监控等优势&#xff0c;在复杂场景应用中展现出卓…

MySQL——基础操作(1)

一、数据库的创建 1.1 库的创建 在使用数据库时&#xff0c;最先操作的是创建一个数据库。使用语法如下&#xff1a; CREATE DATABASE [IF NOT EXISTS] database_name [[DEFAULT] CHARSETcharset_name] [[DEFAULT] COLLATEcollation_name]; 对上述语句进行简单说明&#xf…

最佳视频编辑软件,适合专业人士和初学者

如果你想利用视频编辑软件&#xff0c;即使你没有很多专业知识。一段精彩的视频可能有助于你公司的成功。然而&#xff0c;出色的视频镜头只能在编辑工具的帮助下创建。有许多免费程序可供选择&#xff0c;有许多不同的需求和理由需要编辑。在编辑方面&#xff0c;无论你是专业…

【接入指南】快手API

快手小店自2018年上线以来&#xff0c;业务发展迅速&#xff0c;2年时间GMV增长1000倍&#xff0c;活跃商家达到100万&#xff0c;已经成为主流的电商平台&#xff0c;为支撑广大商家的业务处理需求&#xff0c;快手API成为快手平台业务处理软件高效、便捷的开发工具&#xff0…

C++学习笔记----6、内存管理(一)---- 使用动态内存(4)

3.6、多维自由内存空间上的数组 如果需要在运行时决定多维数组的维度&#xff0c;可以使用在自由内存空间上的数组。与一维动态分配的数组通过指针访问一样&#xff0c;多维动态分配的数组也可以通过指针访问。不同的地方在于在二维数组中&#xff0c;需要用一个指向指针的指针…

『功能项目』项目优化【21】

我们打开上一篇20主角身旁召唤/隐藏坐骑的项目&#xff0c; 本章要做的事情如以下几点&#xff1a; 1.优化资源包Resources下的层级分类 2.优化脚本包Scripts下的脚本分类 3.地形Terrain的优化&#xff08;只让主角点击地面移动跳过其他石头山树等其他物体&#xff09; 首…