文章目录
- 声明
- 模块
- 分析
- 完整代码
- python实现
- js扣代码实现
- 结尾
声明
本文章中所有内容仅供学习交流,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关,若有侵权,请联系我立即删除!
模块
pip install PyExecJS
pip install requests
分析
网址
aHR0cHM6Ly9nZ3p5ZncuZnVqaWFuLmdvdi5jbi9idXNpbmVzcy9saXN0Lw==
目标数据
F12打开调试面版,在返回的文档搜索数据,随便搜索关键字,如上杭县。发现没有结果。那可能是动态加载,然后渲染。
点击Fetch\XHR,在清除所有数据后,刷新页面,发现返回了几个数据包,发现返回的json中的data加密了,由于不确定是哪个数据包是我们想要的,我们可以在页面底部点击第二页,多查看几页。
找到了我们需要的数据包了,请求参数基本相同,就页数改变了。那们接下来就是开始解密了。
我们怎们定位到数据加密的地方呢?今天教大家一个简单的方法。首先我们先将目标网址的路径复制下来,然后再源代码界面,点击XHR提取断点,再点击加号,将路径粘贴进去后回车键,然后刷新页面,就会发现成功断点。
断住之后点击左下角的框框,格式化代码。
那接下来呢?我们查看堆栈,直接查看发送的请求,点击r.request。
直接在n = n.then(t.shift(), t.shift());打上断点,刷新页面。刷新页面之前要把之前的断点取消。
把鼠标停在t上面,点开第一个构造函数,直接进去。
进去之后,我们先找一下data,因为加密的就是data,找到之后我们打上断点。刷新页面。发现就是我们要找的加密数据,我们可以在控制台打印一下。
点击单步执行,接着往下走。
很明显,我们已经找到了加密逻辑,aes加密。密钥什么都要有。那接下来就是用代码实现了。
什么是AES加密?详细请点击。
AES加密算法(Advanced Encryption Standard)是一种对称加密算法,也称为高级加密标准。它是由美国国家标准与技术研究院(NIST)于2001年发布,作为DES加密算法的替代方案。AES加密算法使用128位、192位或256位密钥对数据进行加密和解密,具有高强度、高速度和易于实现等优点。
完整代码
我们可以用纯python实现或者将js代码扣下来,用node.js来执行js代码,然后用PyExecJS库来调用js代码。后者要配置环境比较麻烦,作为初学者的话,建议采用第二种,直接扣代码缺哪补哪。简单粗暴。
python实现
安装模块
pip install pycrypto
import requests
from Crypto.Cipher import AES
import base64
import json
def decrypt(info):
key = "EB444973714E4A40876CE66BE45D5930".encode(encoding='utf-8')
iv = "B5A8904209931867".encode(encoding='utf-8')
cipher = AES.new(key, AES.MODE_CBC, iv)
json_str = cipher.decrypt(base64.b64decode(info)).decode()
return json.loads(str(json_str)[0:str(json_str).rfind('}') + 1])
headers = {
'Accept': 'application/json, text/plain, */*',
'Accept-Language': 'zh-CN,zh;q=0.9',
'Cache-Control': 'no-cache',
'Connection': 'keep-alive',
'Content-Type': 'application/json;charset=UTF-8',
'Origin': 'https://ggzyfw.fujian.gov.cn',
'Pragma': 'no-cache',
'Referer': 'https://ggzyfw.fujian.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/116.0.0.0 Safari/537.36',
'portal-sign': '99682751234383b3a3f1715e54753a60',
'sec-ch-ua': '"Chromium";v="116", "Not)A;Brand";v="24", "Google Chrome";v="116"',
'sec-ch-ua-mobile': '?0',
'sec-ch-ua-platform': '"Windows"',
}
json_data = {
'pageNo': 1,
'pageSize': 20,
'total': 4174,
'AREACODE': '',
'M_PROJECT_TYPE': '',
'KIND': 'GCJS',
'GGTYPE': '1',
'PROTYPE': '',
'timeType': '6',
'BeginTime': '2023-02-25 00:00:00',
'EndTime': '2023-08-25 23:59:59',
'createTime': [],
'ts': 1692955559913,
}
# 接口网址
response = requests.post('接口网址', headers=headers, json=json_data)
print(response.json())
print(decrypt(response.json()['Data']))
js扣代码实现
这里要安装js的解密库crypto-js。
npm install crypto-js
js代码
CryptoJS = require('crypto-js')
function decrypt(t) {
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)
}
import requests
**python代码**
'''如果报编码错误可以取消注释'''
# import subprocess
# from functools import partial
#
# subprocess.Popen = partial(subprocess.Popen, encoding='utf-8')
import execjs
import requests
headers = {
'Accept': 'application/json, text/plain, */*',
'Accept-Language': 'zh-CN,zh;q=0.9',
'Cache-Control': 'no-cache',
'Connection': 'keep-alive',
'Content-Type': 'application/json;charset=UTF-8',
'Origin': 'https://ggzyfw.fujian.gov.cn',
'Pragma': 'no-cache',
'Referer': 'https://ggzyfw.fujian.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/116.0.0.0 Safari/537.36',
'portal-sign': '079ae53ac567a94c2b4185b10ee35175',
'sec-ch-ua': '"Chromium";v="116", "Not)A;Brand";v="24", "Google Chrome";v="116"',
'sec-ch-ua-mobile': '?0',
'sec-ch-ua-platform': '"Windows"',
}
json_data = {
'pageNo': 1,
'pageSize': 20,
'total': 4172,
'AREACODE': '',
'M_PROJECT_TYPE': '',
'KIND': 'GCJS',
'GGTYPE': '1',
'PROTYPE': '',
'timeType': '6',
'BeginTime': '2023-02-25 00:00:00',
'EndTime': '2023-08-25 23:59:59',
'createTime': [],
'ts': 1692952444392,
}
# 输入加密接口网址
response = requests.post('接口网址', headers=headers, json=json_data)
result = response.json()
with open('js.js', encoding='utf-8', mode='r') as f:
js_code = f.read()
print(execjs.compile(js_code).call('decrypt', result['Data']))
结尾
如果代码失效了的话可以将用请求头和请求参数重新换一下就行了。后面发现点进详细页的话,发现数据也加密码了,不过是同样的加密了,连密钥都没有换…那我们下次再见。 ————2023.8.25 17:30