爬虫练习(js逆向解密)

目标

        网站地址交易列表 - 福建省公共资源交易电子公共服务平台 (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 timeimport requests
import json
import execjswith 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} elsen += 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.mzph.cn/bicheng/53295.shtml

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

相关文章

AI超强语音转文本SenseVoice,本地化部署教程!

文章目录 模型介绍SenseVoice在线预览链接本地化部署VsCode 远程连接 模型介绍 SenseVoice专注于高精度多语言语音识别、情感辨识和音频事件检测 多语言识别&#xff1a; 采用超过40万小时数据训练&#xff0c;支持超过50种语言&#xff0c;识别效果上优于Whisper模型。富文本…

跨境电商代购系统中前台基本功能介绍:帮助更快的了解跨境代购业务

前台多语言&#xff1a;可支持语言有中文&#xff08;繁体&#xff09;中文&#xff08;简体&#xff09;英文等。多语言使用百度翻译引擎接口实现&#xff0c;翻译效果与百度一致&#xff1b;网站语言分为两大块&#xff1a;1.系统后台有语言包可以编辑修改网站标题以及发布文…

WPS中JS宏使用说明(持续优化...)

前言 好久没发文章了&#xff0c;今天闲来无事发篇文章找找之前的码字感觉。 正文 最近在写教案&#xff0c;发现之前的技术又可以派上用场了。就是JS&#xff0c;全称JavaScript&#xff0c;这个语言太强大了&#xff0c;我发现WPS里的宏现在默认就是JS。功能选项如下图&…

MySQL数据库安装(详细)—>Mariadb的安装(day21)

该网盘链接有效期为7天&#xff0c;有需要评论区扣我&#xff1a; 通过网盘分享的文件&#xff1a;mariadb-10.3.7-winx64.msi 链接: https://pan.baidu.com/s/1-r_w3NuP8amhIEedmTkWsQ?pwd2ua7 提取码: 2ua7 1 双击打开安装软件 本次安装的是mariaDB&#xff0c;双击打开mar…

Java运行环境的下载、安装、配置与运行

一、实验目的及要求 目的&#xff1a;掌握如何下载java JDK软件包&#xff0c;如何设置Java程序的运行环境&#xff0c;如何编写与运行Java程序&#xff0c;了解Java概貌。 要求&#xff1a; 1、安装Java JDK软件包&#xff1b; 2、练习编写简单的Java Application程序并掌握…

vscode安装使用plantuml插件

使用 VSCode 插件 如果你在 Visual Studio Code 中使用 PlantUML 插件&#xff0c;你可以按照以下步骤生成图片&#xff1a; 安装 PlantUML 插件&#xff1a; 在 VSCode 的扩展市场中搜索并安装 PlantUML 插件。 配置插件&#xff1a; 打开设置&#xff0c;确保插件配置正确。…

Node.js发票查验接口示例、识别查验接口参数返回

财务、审计等经常与发票打交道的人员常常会遇到虚假发票、错票、重复报销等一系列问题。对于会计审计、代理记账、电子商务等发票查验量多的企业来说&#xff0c;成千上万张发票如果仅依赖于人工来进行核验&#xff0c;速度慢效率低&#xff0c;准确率也没保障&#xff0c;因此…

MySQL record

更改密码&#xff1a; alter user rootlocalhost identified with mysql_native_password by ‘123456’; 注意&#xff1a; 在命令行方式下&#xff0c;每条MySQL的命令都是以分号结尾的&#xff0c;如果不加分号&#xff0c;MySQL会继续等待用户输入命令&#xff0c;直到MyS…

kube-prometheus部署

一、自定义配置(二选一&#xff0c;不建议用这个) grafana-service.yml apiVersion: v1 kind: Service metadata:name: grafananamespace: kube-monitoringlabels:app: grafanacomponent: core spec:type: NodePortports:- port: 3000nodePort: 30011selector:app: grafanaco…

uniapp 懒加载、预加载、缓存机制深度解析

uniapp 懒加载、预加载、缓存机制深度解析 文章目录 uniapp 懒加载、预加载、缓存机制深度解析一、为什么要使用uniapp的懒加载、预加载和缓存机制二、如何使用uniapp的懒加载、预加载和缓存机制1. 懒加载2. 预加载3. 缓存机制 四、扩展与高级技巧1. 结合懒加载和预加载优化页面…

链表.......

从右到左 更新尾部 typedef typedef struct ListNode { int value; struct ListNode *next;(这里不能用listnode*应为还没有定义) } ListNode; #include <stdio.h> #include <stdlib.h> // 定义链表节点结构体 struct ListNode { int value; s…

开发台球助教小程序前景分析

开发台球助教小程序的前景分析可从以下维度展开探讨&#xff1a; 市场需求的增长 台球作为一项受欢迎的休闲运动&#xff0c;其爱好者群体正在扩大。随着大众对这项运动兴趣的增加&#xff0c;寻求系统化培训的需求也愈发明显。台球助教小程序正好填补了这一市场空白&#xf…

【Hadoop|HDFS篇】HDFS的Shell操作

1. 基本语法 hadoop fs 具体命令或者hadoop dfs 具体命令。 两个是完全相同的。 2. 命令大全 hadoop fs&#xff1a; Usage: hadoop fs [generic options][-appendToFile <localsrc> ... <dst>][-cat [-ignoreCrc] <src> ...][-checksum <src> ..…

DrissionPage设置启动浏览器为edge

1.查看浏览器启动路径 在浏览器地址栏输入下面地址&#xff0c;拿到可执行文件的路径 。 edge://version/ 2.替换路径 打开DrissionPage._configs. chromium_options.py文件&#xff0c;找到def browser_path(self)这个函数&#xff0c;将返回内容替换为edge的启动路径&#x…

【网络安全】服务基础第一阶段——第十节:Windows系统管理基础---- 组策略高级应用

目录 一、组策略的基本概念 1.1 组策略的基本概念 1.1.1 组策略对象 1.2 配置 1.2.1 计算机配置&#xff08;Computer Configuration&#xff09; 1.2.2 用户配置&#xff08;User Configuration&#xff09; 1.3 作用范围 1.4 继承和优先级 1.4.1 继承&#xff08;In…

Qt:玩转QPainter序列九(文本,文本框,填充)

前言 继续承接序列八 正文 1. drawImage系列函数 绘制图像 inline void drawImage(const QPoint &p, const QImage &image); 作用: 在指定的点 p 上绘制 QImage 图像。图像的左上角将对齐到 p 点。 inline void drawImage(int x, int y, const QImage &image,…

ArkUI-状态管理-@Provide、@Consume、@Observed、@ObjectLink

ArkUI-状态管理 Provide装饰器和Consume装饰器&#xff1a;与后代组件双向同步概述观察变化框架行为Provide支持allowOverride参数 Observed装饰器和ObjectLink装饰器&#xff1a;嵌套类对象属性变化概述限制条件观察变化框架行为 Provide装饰器和Consume装饰器&#xff1a;与后…

毕业设计选题系统

一、项目概述 Hi&#xff0c;大家好&#xff0c;今天分享的项目是《毕业设计选题系统》。 毕业论文选题是大学教学管理中的重要环节&#xff0c;关系到高校的教学质量。传统的手工管理方式工作效率低下、管理繁琐&#xff0c;浪费教师和学生的时间与精力的问题。本系统以提高…

基于微信的热门景点推荐小程序的设计与实现(论文+源码)_kaic

摘 要 近些年来互联网迅速发展人们生活水平也稳步提升&#xff0c;人们也越来越热衷于旅游来提高生活品质。互联网的应用与发展也使得人们获取旅游信息的方法也更加丰富&#xff0c;以前的景点推荐系统现在已经不足以满足用户的要求了&#xff0c;也不能满足不同用户自身的个…

Leetcode面试经典150题-92.反转链表II

解法都在代码里&#xff0c;不懂就留言或者私信 比反转链表I略微难一点点 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode() {}* ListNode(int val) { this.val val; }* ListNode(int val, Li…