token逆向和简单的字体解密

一、token加密部分

网址:aHR0cHM6Ly9qenNjLmpzdC56ai5nb3YuY24vUHVibGljV2ViL2luZGV4Lmh0bWwjLw==

点开查询的xhr的包,发现headers中含有token这一加密参数。

直接跟栈,很容发现在第三个栈加密。

 s = Object(L.b)(l).toString(),由函数Object(L.b)加密,加密传入的l是时间戳。进入函数。很明显的便准AES加密,在前面复制i与s。

js代码:

const CryptoJS = require('crypto-js')
var i = CryptoJS.enc.Utf8.parse("255B675CDF21B04F923992E0E9F4A498");
var s = CryptoJS.enc.Utf8.parse("255B675CDF21B04F");
function get_token(t) {
            var e = CryptoJS.enc.Utf8.parse(t);
            return CryptoJS.AES.encrypt(e, i, {
                iv: s,
                mode: CryptoJS.mode.CBC,
                padding: CryptoJS.pad.Pkcs7
            }).toString()
};

二、字体加密部分

可以发现数据的字体是进行了加密的,且每一次访问字体都不同,下载字体,在工具中打开。并利用TTfont查找对应关系。

 

数据包附近的包就是字体。双击可下载。 

 

获取映射表 

 

from fontTools.ttLib import TTFont
font_obj = TTFont('浙江省建筑市场.woff')
cmap = font_obj.getBestCmap()
print(cmap)
Mapping_tables = {}
for code,mapping in cmap.items():
    character_key = chr(code)
    character_value = chr(int(mapping[3:],16)) if mapping.startswith('uni') else mapping
    Mapping_tables[character_key] = character_value
print(Mapping_tables)

结果为:

 

character_value = chr(int(mapping[3:],16)) if mapping.startswith('uni') else mapping 

这行代码的作用是,如果 mapping 以 'uni' 开头,它会将 mapping 中的十六进制 Unicode 值转换为对应的字符,否则直接将 mapping 赋值给变量 character_value。

这里是代码的解释:

mapping.startswith('uni'): 这个条件判断检查变量 mapping 是否以 'uni' 开头。
int(mapping[3:], 16): 如果 mapping 以 'uni' 开头,它会提取从第四个字符到结尾的子字符串 (mapping[3:]),然后将其解释为十六进制数 (int(..., 16)) 并将其转换为整数。
chr(...): 这个函数接受一个整数 Unicode 代码点,并返回对应的字符。
因此,如果 mapping 以 'uni' 开头,它会从字符串中提取 Unicode 代码点并使用 chr() 函数将其转换为对应的字符。如果 mapping 不以 'uni' 开头,则假定它已经表示一个字符,直接将其赋给变量 character_value。 

 实际情况是这样运行代码,根本不需要token,也没有字体加密,不知道为什么。

import requests
import ddddocr
import execjs
import time
import re
import json

f = open('demo.js','r').read()
js_code = execjs.compile(f)
for page in range(1,10):
    time.sleep(1)
    t = int(time.time()*1000)
    token = js_code.call('get_token',t)
    print(token)
    def get_response(token):
        url = 'https://jzsc.jst.zj.gov.cn/publishserver/OTMcxygd/OTMjuiiRnupruxBidw'
        data = {
            'City': '',
            'COUNTY': '',
            'tenderProName': '',
            'tenderUnit': '',
            'tenderBrokerOrg': '',
            'pageIndex': page,
            'pageSize': 15,
        }
        headers = {
            "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36",
            # "Token":token,
            "Referer":"https://jzsc.jst.zj.gov.cn/PublicWeb/index.html",
        }

        response = requests.post(url=url,json=data,headers=headers)
        return response
    response = get_response(token)

    data = re.findall('</style>(.*?),"count',response.text)[0]+',"count":11637}'

    json_data = json.loads(data)

    for index in json_data['data']:
        print(index)

 

 

 

 

  • 9
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

努力学习各种软件

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值