当前位置: 首页 > news >正文

爬虫练习(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()
}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 操作系统体系结构分类
  • Python爬虫:通过js逆向获取某瓜视频的下载链接
  • 计算机岗位(面试)
  • Leetcode Day21组合总和
  • 设计模式之-开闭原则
  • ecmascript和javascript的区别详细讲解
  • 云原生架构概念
  • 发那科A06B-6270-H045#H600 主轴伺服放大器
  • 1. GIS开发工程师岗位职责、技术要求和常见面试题
  • 数据访问:JPA关联MyBatis
  • 【ShuQiHere】深入理解递归:从基础概念到实际应用
  • mysql如何使用explain来分析语句使用到的索引效果
  • JAVA毕业设计167—基于Java+Springboot+vue3+小程序的物业管理系统小程序(源代码+数据库+万字论文+文献综述)
  • 基于BiLSTM-CRF的医学命名实体识别研究(下)模型构建
  • 【计算机网络】socket编程 --- 实现简易TCP网络程序
  • ----------
  • [rust! #004] [译] Rust 的内置 Traits, 使用场景, 方式, 和原因
  • 2017年终总结、随想
  • Android 初级面试者拾遗(前台界面篇)之 Activity 和 Fragment
  • C++类的相互关联
  • ES6, React, Redux, Webpack写的一个爬 GitHub 的网页
  • JavaScript类型识别
  • JSONP原理
  • Linux编程学习笔记 | Linux IO学习[1] - 文件IO
  • Sublime Text 2/3 绑定Eclipse快捷键
  • V4L2视频输入框架概述
  • 从输入URL到页面加载发生了什么
  • 关键词挖掘技术哪家强(一)基于node.js技术开发一个关键字查询工具
  • 关于List、List?、ListObject的区别
  • 码农张的Bug人生 - 见面之礼
  • 前端面试题总结
  • 前嗅ForeSpider中数据浏览界面介绍
  • 如何学习JavaEE,项目又该如何做?
  • 什么软件可以剪辑音乐?
  • 小李飞刀:SQL题目刷起来!
  • 云大使推广中的常见热门问题
  • ‌U盘闪一下就没了?‌如何有效恢复数据
  • !!【OpenCV学习】计算两幅图像的重叠区域
  • # 深度解析 Socket 与 WebSocket:原理、区别与应用
  • #FPGA(基础知识)
  • $.ajax()方法详解
  • ()、[]、{}、(())、[[]]命令替换
  • (4)(4.6) Triducer
  • (aiohttp-asyncio-FFmpeg-Docker-SRS)实现异步摄像头转码服务器
  • (C++哈希表01)
  • (cos^2 X)的定积分,求积分 ∫sin^2(x) dx
  • (八)光盘的挂载与解挂、挂载CentOS镜像、rpm安装软件详细学习笔记
  • (大众金融)SQL server面试题(1)-总销售量最少的3个型号的车及其总销售量
  • (二)基于wpr_simulation 的Ros机器人运动控制,gazebo仿真
  • (附源码)计算机毕业设计SSM智慧停车系统
  • (剑指Offer)面试题41:和为s的连续正数序列
  • (全注解开发)学习Spring-MVC的第三天
  • (四)TensorRT | 基于 GPU 端的 Python 推理
  • (五)网络优化与超参数选择--九五小庞
  • (一)基于IDEA的JAVA基础10