逆向某企查网站的headers参数加密调用js返回值不一致问题

1.发现问题

博主在进行逆向某企查的时候好不容易把加密的headers(本文不出现逆向代码)扣出来了,值也是没问题和调式器值一致 如图:

按正常思路使用python的execjs库调用取到返回值,在此我们的值暂时全部定死代码和运行结果如图:

好玩的来了,在node.js运行的值和调用然后返回的值不一致。

有些人可能要说了可能是时间戳然后造成的加密值的变化,但是仔细阅读加密代码后会发现加密中没有时间戳没有动态生成。换成大白话来说就是只要给搜索关键字和页码那么这个headers就是固定值。

2.进行测试

那么发现问题了开始测试

1.会不会是函数调用错误

2.会不会是返回之后的乱码

于是我在Node.js中返回值中多加了一个test可以看到正常运行

 那我们到python调用函数会发现test返回的没有问题但是返回的加密结果还是不一致。

3.解决问题

后面想了想是不是运行环境的不同在js文件里面直接调用node.js运行在python先是读取代码在运行,于是我就想到了使用subprocess库(具体干啥用的自己去搜,等会贴代码)直接调用node.js去执行文件。具体代码如下

import subprocess



# 替换为你的 Node.js 可执行文件路径
node_path = r"D:\biancheng\node\node.exe"
# 替换为你的 JavaScript 文件路径
js_file_path = r"D:\pachong\js逆向\test.js"
# 注意此处修改:指定编码为 utf-8,避免使用默认的 gbk
result = subprocess.run(
    [node_path, js_file_path],
    capture_output=True,
    text=True,  # 启用文本模式
    encoding='utf-8',  # 显式指定编码
    check=True  # 检查返回码
)
data = result.stdout#data值为你在js文件中打印的所有值并不是返回值!!!
print(data)

运行结果如下

就此返回值和加密的值一致。在此注意!!!其中返回值是js文件中打印的值而不是js中返回的值,那我们可以把js文件稍微改下。直接返回是为了后面python使用split好切割代码如下:

python运行完和代码如下:

import subprocess
# 替换为你的 Node.js 可执行文件路径
node_path = r"D:\biancheng\node\node.exe"
# 替换为你的 JavaScript 文件路径
js_file_path = r"D:\pachong\js逆向\test.js"
# 注意此处修改:指定编码为 utf-8,避免使用默认的 gbk
result = subprocess.run(
    [node_path, js_file_path],
    capture_output=True,
    text=True,  # 启用文本模式
    encoding='utf-8',  # 显式指定编码
    check=True  # 检查返回码
)
data = result.stdout.replace("\n","").split(" ")#data值为你在js文件中打印的所有值并不是返回值!!!
print(data)

4.再次测试

既然解决了问题那么肯定搜索的值不能定死那么subprocess该怎么传动态的搜索值和页码呢?

说到这既然要改变值且是动态的那么js文件中肯定要有给东西来接受传来的值(再次我只改变搜索值的参数和页码其他不变)直接上代码(里面的加密函数自己网上搜)

function keys(data) {
    let t = "/api/search/searchMulti";
    t = t.toLowerCase();
    let i = o_default(t, data);
    let u = two_r_default(t, data, '6b4418ebd1d34c565feab24e13c91783');
    console.log(i,u)
}

function get(key,page) {
    const data = {
        "searchKey":key,
        "pageIndex": page,
        "pageSize": 20
    };
    return keys(data);
}
const args = process.argv.slice(2);
const value1 = args[0];
const value2 = args[1];

get(value1,value2)

既然js文件写好了那python调用肯定需要填入参数二话不说直接上代码(其实这个是有报错的!!!!)

import subprocess
# 替换为你的 Node.js 可执行文件路径
node_path = r"D:\biancheng\node\node.exe"
# 替换为你的 JavaScript 文件路径
js_file_path = r"D:\pachong\js逆向\test.js"
# 注意此处修改:指定编码为 utf-8,避免使用默认的 gbk
searchKey="小米科技有限责任公司"
page=1
result = subprocess.run(
    [node_path, js_file_path,searchKey,page],
    capture_output=True,
    text=True,  # 启用文本模式
    encoding='utf-8',  # 显式指定编码
    check=True  # 检查返回码
)
data = result.stdout.replace("\n","").split(" ")#data值为你在js文件中打印的所有值并不是返回值!!!
print(data)

报错原因就是page页码必须要是str,那我们这里强转一下(关于这个字符串和数值后面还有坑)!!!

强转后的代码

import subprocess
# 替换为你的 Node.js 可执行文件路径
node_path = r"D:\biancheng\node\node.exe"
# 替换为你的 JavaScript 文件路径
js_file_path = r"D:\pachong\js逆向\test.js"
# 注意此处修改:指定编码为 utf-8,避免使用默认的 gbk
searchKey="小米科技有限责任公司"
page=1
result = subprocess.run(
    [node_path, js_file_path,searchKey,str(page)],
    capture_output=True,
    text=True,  # 启用文本模式
    encoding='utf-8',  # 显式指定编码
    check=True  # 检查返回码
)
data = result.stdout.replace("\n","").split(" ")#data值为你在js文件中打印的所有值并不是返回值!!!
print(data)

运行截屏你会发现没有报错以为一切安好,其实暗藏杀机。

仔细看的人就知道加密返回的值又变了,其实这里的坑就是js文件中的page是int类型而你给的是str类型所以加密的值就有误

js我也直接贴代码



function keys(data) {
    let t = "/api/search/searchMulti";
    t = t.toLowerCase();
    let i = o_default(t, data);
    let u = two_r_default(t, data, '6b4418ebd1d34c565feab24e13c91783');
    console.log(i,u)
}
function get(key,page) {
    const data = {
        "searchKey": key,
        "pageIndex": page,
        "pageSize": 20
    };
    return keys(data);
}
const args = process.argv.slice(2);
const value1 = args[0];
const value2 = args[1];

get(value1,parseInt(value2))

就此大功告成!!!!!!!!!!!

开始测试

代码稍微改下搜索的值和页码从datas中来

运行结果

爬虫完整代码

import json
import subprocess
import requests
def get_data(data,token):
    headers = {
        "Host": "www.qcc.com",
        token[0]:token[1],
        # 'be99975c293ea89ca4b4': "3d7e45a71b96f90cb9213f5604b28f7a8a4dac6f52d0680a5f0470081a34d0860e327f3832e65fc07f27adf26f12c4a27863527a7be874d753b98362d6b4d259",
        "accept": "application/json, text/plain, */*",
        "content-type": "application/json",
        "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/134.0.0.0 Safari/537.36 Edg/134.0.0.0",
        "referer": "https://www.qcc.com/web/search?key=%E5%B0%8F%E7%B1%B3%E7%A7%91%E6%8A%80%E6%9C%89%E9%99%90%E8%B4%A3%E4%BB%BB%E5%85%AC%E5%8F%B8"
    }
    cookies = {
        "qcc_did": "91687fac-5e12-4a22-a53d-e8cd32e2b1db",
        "UM_distinctid": "1956a43175325f8-02cd602852ed73-4c657b58-144000-1956a4317542a9c",
        "QCCSESSID": "0829d310f7443b9e8d34d8faba",
        "tfstk": "gfYiBccEYhS_0q98Bp7s2voQeViLB5_fvKUAHZBqY9WQBRU9gZWD39LOBCQa3rvcdPKtfiB0iNTpXrBtCZA2eZD-e43J1CsfuYH-xun2xa5guPyA3MuFksbcNShe1C_bO1vyNKO_nlxuqI723wSFisb4bP7qtw5AsZzN0PrUL91VuZSNbkRFa_C4QrWqtBWCgZW23ZkTbrWkueTELbViuIKuKe5GjTRNQCpw87s3fBB3moYHxGXzo944uefM9JfqKzmAU36O2T9EJPbDTsvh2hDuSKA2NnSHoRl9UIJ6-N_oDfskYHKRjHDao9LOig7VxSz2twXBEeQrzJfBYCK25dV0u1T9yiX5xjzfDw8R43JgGbOF7sJfVEH75OR2NUtRrV25sHRl-gJTYuW_yr1EMerbcG5CtTLQqPl_BGXJfXc3VcsNO1HJkXqqWG5C1TGntuwGb619b",
        "acw_tc": "0a47318a17424843774237937e00426787282b6c98bc3428409fcd1e0e442e",
        "CNZZDATA1254842228": "1097317401-1741244537-https%253A%252F%252Fcn.bing.com%252F%7C1742484552"
    }
    url = "https://www.qcc.com/api/search/searchMulti"

    data = json.dumps(data, separators=(',', ':'))
    response = requests.post(url, headers=headers, cookies=cookies, data=data).json()['Result']
    print(response)
datas = {
    "searchKey": "小米科技有限责任公司",
    "pageIndex": 1,
    "pageSize": 20
}
# 替换为你的 Node.js 可执行文件路径
node_path = r"D:\biancheng\node\node.exe"
# 替换为你的 JavaScript 文件路径D
js_file_path = r"D:\pachong\js逆向\test.js"
# 注意此处修改:指定编码为 utf-8,避免使用默认的 gbk
searchKey=datas['searchKey']
page=datas['pageIndex']
result = subprocess.run(
    [node_path, js_file_path,searchKey,str(page)],
    capture_output=True,
    text=True,  # 启用文本模式
    encoding='utf-8',  # 显式指定编码
    check=True  # 检查返回码
)
token= result.stdout.replace("\n","").split(" ")#data值为你在js文件中打印的所有值并不是返回值!!!
get_data(datas,token)

本文所有技术细节仅用于教育目的,演示逆向工程原理及安全研究方法。请勿将文中内容用于非法用途,使用者需自行承担一切法律责任。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值