0
点赞
收藏
分享

微信扫一扫

JS逆向案例 | CryptoJS模块破解加密字符串

向上的萝卜白菜 2022-03-22 阅读 69

目录


本次爬取仅供学习交流,无任何商业用途,目标网址已做脱敏处理!

目标网址:aHR0cDovL2p6c2MubW9odXJkLmdvdi5jbi9kYXRhL2NvbXBhbnk=

一、寻找加密源码

抓包分析可知,原数据已被加密成长串字符。之前的博客已分析过,这种可能是JSON加密过的。因此,搜索Json.parse函数,最终定位到JS文件如下所示
在这里插入图片描述
跟进JS文件后,继续搜索Json.parse,最终定位到935行,在此打断点刷新,发现h函数就是最终的加密函数!
在这里插入图片描述
继续跟进h函数,可获得如下的加密逻辑
在这里插入图片描述

二、引入CryptoJS模块

在定位到加密逻辑后,现对该逻辑展开分析。之前的博客是继续跟进相应的函数,进行查漏补缺,不断完善。本次通过观察代码中出现AES.decrypt,可判断为AES加密。此时,可以引用常见的加解密模块——CryptoJS。现重写加密逻辑,并保存为jscode.js文件,如下所示

var CryptoJS = require("crypto-js")

function Parse_Data(t) {
    var m = CryptoJS.enc.Utf8.parse("0123456789ABCDEF"),
        f = CryptoJS.enc.Utf8.parse("jo8j9wGw%6HbxfFn"),
        e = CryptoJS.enc.Hex.parse(t),
        n = CryptoJS.enc.Base64.stringify(e),
        a = CryptoJS.AES.decrypt(n, f, {
            iv: m,
            mode: CryptoJS.mode.CBC,
            padding: CryptoJS.pad.Pkcs7
    }),
        r = a.toString(CryptoJS.enc.Utf8);
    return r.toString()
}

注意:

  • CryptoJS模块需要安装node.js,安装及环境配置可参照博客node.js安装教程
  • 安装后,需在cmd以管理员模式中安装CryptoJS模块,命令如下npm install crypto-js

三、Python解密

现用Python中的execjs库执行上述JS代码,实现解密。

import requests
import execjs
import json


def get_text(url):

    headers = {
        'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.74 Safari/537.36',
        'cookies': 'Hm_lvt_b1b4b9ea61b6f1627192160766a9c55c=1647842220,1647842596; Hm_lpvt_b1b4b9ea61b6f1627192160766a9c55c=1647842596'
    }

    data = {'pg': 0, 'pgsz': 15, 'total': 450}
    r = requests.get(url, headers=headers, params=data)
    return r.text


def load_jscode(js_path):
    with open(js_path, 'r', encoding='utf-8') as f:
        js_code = f.read()
    return js_code

if __name__ == "__main__":
    url = 'http://jzsc.mohurd.gov.cn/api/webApi/dataservice/query/comp/list?'
    r_text = get_text(url)
    js_code = load_jscode("jscode.js")
    rst = execjs.compile(js_code).call("Parse_Data",r_text)
    print(rst)

解密结果如下,成功返回数据!(注意:如果出现编码格式错误,可参照该博客execjs执行编码格式错误解决方法,修改_external_runtime.py文件)
在这里插入图片描述

四、全部代码

整理输出数据格式,现将全部代码整理如下

import requests
import execjs
import json
from jsonpath import jsonpath
import pandas as pd


def get_text(url):
    headers = {
        'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.74 Safari/537.36',
        'cookies': 'Hm_lvt_b1b4b9ea61b6f1627192160766a9c55c=1647842220,1647842596; Hm_lpvt_b1b4b9ea61b6f1627192160766a9c55c=1647842596'
    }

    data = {'pg': 0, 'pgsz': 15, 'total': 450}
    r = requests.get(url, headers=headers, params=data)
    return r.text


def load_jscode(js_path):
    with open(js_path, 'r', encoding='utf-8') as f:
        js_code = f.read()
    return js_code


def save_data(json_data):
    org_code = jsonpath(json_data, "$..list[*].QY_ORG_CODE")
    company_name = jsonpath(json_data, "$..list[*].QY_NAME")
    company_represent = jsonpath(json_data, "$..list[*].QY_FR_NAME")
    company_loc = jsonpath(json_data, "$..list[*].QY_REGION_NAME")

    final_data = pd.DataFrame({
        "社会信用代码": org_code,
        "企业名称": company_name,
        "法人代表": company_represent,
        "企业地址": company_loc}
    )
    
    final_data.to_csv("company_information.csv",encoding='gbk',index=False)

if __name__ == "__main__":
    url = 'http://jzsc.mohurd.gov.cn/api/webApi/dataservice/query/comp/list?'
    r_text = get_text(url)
    js_code = load_jscode("jscode.js")
    rst = execjs.compile(js_code).call("Parse_Data", r_text)
    json_data = json.loads(rst)
    save_data(json_data)

最终数据如下
在这里插入图片描述
以上就是本次分享的全部内容~

举报

相关推荐

0 条评论