> 文章列表 > 建筑数据破解JS逆向爬虫

建筑数据破解JS逆向爬虫

建筑数据破解JS逆向爬虫

建筑数据破解JS逆向爬虫

地址:https://jzsc.mohurd.gov.cn/data/project
建筑数据破解JS逆向爬虫
GitHub地址:https://github.com/NearHuiwen/JzscCrawler
Requests+PyExecJS
JS文件:req_aes.js

目标

抓包,抓取建筑市场数据(注:用于学习,不是商用或其他恶意用途)

实现步骤

  • 1、Fidder抓包,发现返回的数据跟个鬼一样

建筑数据破解JS逆向爬虫

  • 2、定位JS文件

那我们通过url 下手试试 在All里面全局 搜索 project/list(url后面的参数,怎么方便怎么来)

一直定位到这里,很明显看得出用了AES加密,国企项目都那么喜欢AES吗,哈哈。。。

其实大厂加密都简单,安全防护之类的完全不靠js加密,靠的是风控,用一个大佬跟我说的话,当你把加解密破解之后,游戏才刚刚开始

建筑数据破解JS逆向爬虫

确定AES了,考虑一般是AES直接加密或者AES + RSA,企业比较广泛吧,不知道哪个Diao毛想的,玩挺花

当然AES + RSA 组合更加安全,RSA的公钥私钥保持不变,AES的秘钥每次随机生成,发送方用AES加密原文,再用公钥加密AES的秘钥,带上加密后的秘钥和密文去请求.而接受方则先用私钥解密得到AES的秘钥再对密文进行解密

  • 3、手撕JS代码(扣代码)
var CryptoJS = require('crypto-js')function getDecryptedData(t) {var m = CryptoJS.enc.Utf8.parse("偏移值"),f = CryptoJS.enc.Utf8.parse("秘钥"),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()
}

直接写python也可以

f = '秘钥'  # 秘钥
m = '偏移值'  # 偏移值
# 转码  utf-8?  字节 16进制
m = bytes(m, encoding='utf-8')
f = bytes(f, encoding='utf-8')
# 创建一个AES算法 秘钥  模式 偏移值
cipher = AES.new(f, AES.MODE_CBC, m)
# 解密
decrypt_content = cipher.decrypt(bytes.fromhex(response))
result = str(decrypt_content, encoding='utf-8')
# OKCS7 填充
length = len(result) # 字符串长度
unpadding = ord(result[length - 1]) # 得到最后一个字符串的ASCII
result = result[0:length - unpadding]