爬虫练习(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 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()
}
相关推荐
数据小爬虫@3 小时前
爬虫获取的数据能用于哪些数据分析?
爬虫·数据挖掘·数据分析
笨鸟笃行4 小时前
爬虫第七篇数据爬取及解析
开发语言·爬虫·python
Jelena157795857924 小时前
使用Java爬虫获取1688 item_get_company 接口的公司档案信息
java·开发语言·爬虫
数据小小爬虫4 小时前
Jsoup解析商品详情时,如何确保数据准确性?
java·爬虫
不爱学英文的码字机器5 小时前
Python爬虫实战:从零到一构建数据采集系统
开发语言·爬虫·python
B站计算机毕业设计超人6 小时前
计算机毕业设计hadoop+spark旅游景点推荐 旅游推荐系统 旅游可视化 旅游爬虫 景区客流量预测 旅游大数据 大数据毕业设计
大数据·hadoop·爬虫·深度学习·机器学习·数据可视化·推荐算法
朱剑君7 小时前
第十五天:Selenium与PhantomJS
爬虫·python·selenium
奔跑吧邓邓子14 小时前
【Python爬虫(12)】正则表达式:Python爬虫的进阶利刃
爬虫·python·正则表达式·进阶·高级
伊一大数据&人工智能学习日志17 小时前
selenium爬取苏宁易购平台某产品的评论
爬虫·python·selenium·测试工具·网络爬虫
数据小小爬虫18 小时前
利用爬虫获取淘宝商品描述:实战案例指南
爬虫