前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【JS 逆向百例】建筑市场监管平台企业数据

【JS 逆向百例】建筑市场监管平台企业数据

原创
作者头像
K哥爬虫
修改2021-08-10 18:12:23
2.6K2
修改2021-08-10 18:12:23
举报
文章被收录于专栏:Python 爬虫Python 爬虫

声明

本文章中所有内容仅供学习交流,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关。

逆向目标

逆向过程

本次的逆向目标是建筑市场监管平台的企业数据,来到全国建筑市场监管公共服务平台首页,依次点击数据服务 —> 企业数据,尝试抓包一下所有企业的数据,可以看到返回的数据是经过加密的:

数据看不出来是什么加密方式,但是加密分析得多了,就知道一般都是经过 CryptoJS 加密模块加密得到的,那么我们可以尝试直接搜索 CryptoJSdecrypt 等关键字,或者搜索加密算法中经常用到的偏移量 iv、模式 mode、填充方式 padding 等,还有一般的 JSON 数据可以搜索 JSON.parse 等,这里直接搜索 JSON.parse,在 app.a9f6bb6d.js 文件里定位到可疑代码,埋下断点进行调试:

可以看到 e 就是解密后的数据,观察语句 var e = JSON.parse(h(t.data));,直接跟进 h 函数,可以看到很明显的 AES 加密:

代码语言:txt
复制
function h(t) {

    var e = d.a.enc.Hex.parse(t)

    , n = d.a.enc.Base64.stringify(e)

    , a = d.a.AES.decrypt(n, f, {

        iv: m,

        mode: d.a.mode.CBC,

        padding: d.a.pad.Pkcs7

    })

    , r = a.toString(d.a.enc.Utf8);

    return r.toString()

}

加密模式为 CBC,填充方式为 Pkcs7,而缺少的偏移量 m、f 的值,在上面也可以找到:

代码语言:txt
复制
f = d.a.enc.Utf8.parse("jo8j9wGw%6HbxfFn")

m = d.a.enc.Utf8.parse("0123456789ABCDEF")

在 Python 当中,直接引入 CryptoJS,重写这个函数即可。

完整代码

完整代码可在 GitHub 下载:https://github.com/kuaidaili/crawler/tree/main/jzsc_mohurd_gov_cn

jzsc_mohurd_decrypt.js

代码语言:txt
复制
// 引用 crypto-js 加密模块

var CryptoJS = require('crypto-js')



function getDecryptedData(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()

}



// 测试样例

// var t = '95780ba094xxxxxxxxxx'

// console.log(getDecryptedData(t))

jzsc_mohurd.py

代码语言:txt
复制
#!/usr/bin/env python3

# -\*- coding: utf-8 -\*-





import json



import execjs

import requests





data\_url = 'http://jzsc.mohurd.gov.cn/api/webApi/dataservice/query/comp/list?pg=%s&pgsz=15&total=450'





def get\_encrypted\_data(page):

    headers = {

        'Host': 'jzsc.mohurd.gov.cn',

        'Referer': 'http://jzsc.mohurd.gov.cn/data/company',

        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'

    }

    encrypted\_data = requests.get(url=data\_url % page, headers=headers).text

    return encrypted\_data





def get\_decrypted\_data(encrypted\_data):

    with open('jzsc\_mohurd\_decrypt.js', 'r', encoding='utf-8') as f:

        jzsc\_mohurd\_js = f.read()

    decrypted\_data = execjs.compile(jzsc\_mohurd\_js).call('getDecryptedData', encrypted\_data)

    return json.loads(decrypted\_data)





def main():

    # 30页数据

    for page in range(30):

        encrypted\_data = get\_encrypted\_data(page)

        decrypted\_data = get\_decrypted\_data(encrypted\_data)

        print(decrypted\_data)





if \_\_name\_\_ == '\_\_main\_\_':

    main()

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 声明
  • 逆向目标
  • 逆向过程
  • 完整代码
    • jzsc_mohurd_decrypt.js
      • jzsc_mohurd.py
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档