简单js逆向案例(1)

声明

本文章中所有内容仅供学习交流,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关,若有侵权,请联系我立即删除!

模块

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

猜你喜欢

转载自blog.csdn.net/qq_65898266/article/details/132480824