某药监局药品详情sign值逆向

免责声明

本教程仅用于教育目的,演示如何合法获取公开专利数据。在实际操作前,请务必:

1.  仔细阅读目标网站的robots.txt文件和服务条款
2.  控制请求频率,避免对服务器造成负担
3.  仅获取和使用公开数据
4.  不用于商业用途或大规模抓取

本次逆向查询药品接口:aHR0cHM6Ly93d3cubm1wYS5nb3YuY24vZGF0YXNlYXJjaC9kYXRhL25tcGFkYXRhL3NlYXJjaA==

1.打开控制台注入代码绕过无限debugger或者找调用堆栈使用本地替换js文件将循环创建debuger的部分删掉

let _Function = Function
Function = function (s) {
    if(s==="debugger"){
        return null
    }
    return _Function(s)
}

​

2.查找sign值加密位置 全局搜索检索到在ajax.js的getSign中

3.直接复制js再补环境

复制ajax.js、md5.js到本地项目,本地先运行看报错,注意看getSign函数调用了哪些方法,其他的不重要的报错可直接删除

最终项目结构:

//env.js
window = global

4.ajax.js中需要注意部分:
(1)getLoginToken

getCookie等方法node中没有,最快的方法就是直接删除或注释掉

(2)具体调用方法位置: 改写hasTokenGet函数

原方法返回值为

改写为返回加密后的sign值

'hasTokenGet': function(_0x194f10, _0x20d400) {
        var _0x30b6f6 = {
            'inoTo': _0xdfc7('f5', 'f[WA'),
            'wyNxZ': function(_0x2d025f, _0x2003c1) {
                return _0x2d025f + _0x2003c1;
            },
            'AlzcX': _0xdfc7('f6', 'C0n&'),
            'rgvgy': function(_0x53dd9b, _0x31ed1e) {
                return _0x53dd9b || _0x31ed1e;
            },
            'azOWI': function(_0x37bbec) {
                return _0x37bbec();
            },
            'HUDdP': function(_0x3b1a0f, _0x198aca) {
                return _0x3b1a0f === _0x198aca;
            },
            'kNYKd': _0xdfc7('f7', ')nUr'),
            'AlUdj': 'pMSzI',
            'GmLgF': function(_0x326050, _0x182779) {
                return _0x326050(_0x182779);
            },
            'yWqYp': _0xdfc7('f8', 'A^Px'),
            'ycJHx': function(_0x5e7cd7, _0x282811) {
                return _0x5e7cd7(_0x282811);
            }
        };
        _0x20d400 = _0x30b6f6[_0xdfc7('f9', '(TPJ')](_0x20d400, {});
        var _0x37cd60 = false;
        _0x20d400[_0xdfc7('fb', 'e4PG')] = _0x20d400['timestamp'];
        let _0x2cd4d6 = getSign(_0x20d400);
        for (let _0x1a609b in _0x2cd4d6) {
            if (_0x30b6f6[_0xdfc7('fd', 'VfYA')](_0x30b6f6[_0xdfc7('fe', 'A8L]')], _0x30b6f6[_0xdfc7('ff', 'lios')])) {
                app = _0x30b6f6[_0xdfc7('100', 'FE9r')];
                let _0x3306b1 = _0x30b6f6[_0xdfc7('101', 'A8L]')](_0x30b6f6['wyNxZ'](app, _0x30b6f6['AlzcX']), _0x20d400);
                location[_0xdfc7('102', 'n7gq')] = _0x3306b1;
            } else {
                if (_0x2cd4d6[_0x1a609b] == '') {
                    delete _0x2cd4d6[_0x1a609b];
                }
            }
        }
       let sign =  _0x30b6f6[_0xdfc7('105', 'OmpI')](jsonMD5ToStr, _0x2cd4d6)
       return sign
    },

5.运行main.js

//main.js
require("./env")
require("./md5")
require("./ajax")


function get_sign(){
    let url = 'https://www.nmpa.gov.cn/datasearch/data/nmpadata/search'
    let params = {
        'isSenior': 'N',
        'itemId': 'ff80808183cad75001840881f848179f',
        'pageNum': '1',
        'pageSize': '10',
        'searchValue': '国药准字H20063188',
        'timestamp': 1749092062000,
    }
    let ops = {
        url,
        params
    }
    let e = pajax.hasTokenGet(ops.url, ops.params)
    console.log(e)
}
get_sign()

返回结果与断点调试一致,说明加密破解完成

6.最后改写main.js传入搜索的动态参数(若需要查询其它参数可自行修改)

// main.js
require("./env")
require("./md5")
require("./ajax")

// 接收JSON格式参数
exports.get_sign=(searchValue,itemId)=>{
    const timestamp = Math.floor(new Date().getTime() / 1000)*1000;
    let url = 'https://www.nmpa.gov.cn/datasearch/data/nmpadata/search'
    let params = {
        'isSenior': 'N',
        'itemId': itemId,
        'pageNum': '1',
        'pageSize': '10',
        'searchValue': searchValue,
        'timestamp': timestamp,
    }
    let ops = {
        url,
        params
    }
   return  {
        sign:pajax.hasTokenGet(ops.url, ops.params),
        timestamp
    }
}

7.最后python中调用获取到的sign进行请求验证:



由于js中环境比较复杂,可能存在异步环境,所以直接在python中直接使用JSPyBridge调用
完整python代码:

# main.py
import requests
from javascript import require

module = require('./main.js')
# 境内生产药品关键字
searchValue = '国药准字H20063188'
# 境内生产药品的分类id,https://www.nmpa.gov.cn/datasearch/config/NMPA_DATA.json?date=1750063132836文件中获取
itemId = 'ff80808183cad75001840881f848179f'
cookies = {
    'arialoadData': 'true',
    'STEP_TIPS_INDEX': 'true',
    'STEP_TIPS_RESULT': 'true',
    'NfBCSins2OywS': '60VFrBtp2fYqK27Td0tYbC5CRf4E.BZlG6pWbb3gYrPGz0WIXmABkCsR8HI6XVDB_AcP17JdSQjb6Tv9pchfY_7G',
    'visualdevice': 'pc',
    'ariawapChangeViewPort': 'true',
    'token': '',
    'NfBCSins2OywT': '0McoHRSTI4GA1FDsDNZGRVsWa_YAPgNii0SSHy0FQPujWWg77XntpSOwtb3z6KS.PGNhqji_IR.YrC4vWBwiIYUHYQo4h1iJvck1OW689OVQ710UV6.es983u4qEf5gvlW8dfPwMbAfefe1h2OihdrAfKgNCFyXJaFHbM2IU1xJGzJXY4H9TvSEMgds2k8hNhbU3Qiog3zvxaf73QkptcX7UP1hOpN9fSwu7_qUcvQUL9t6qKqeSirmfgQ6HEoVHJfeDvQ7wOIVUYpB5rnGaG_kWyi7B4AH5MuSPHMMcsaESKxqiHW3NCitmUBVE3.v6G.tiUsBzL46zWFVetmd0sNyUNAl9rysWm5cRFbr1PpaG',
    'acw_tc': '276aeddd17491037078795923e65691aaf4313222d2c37a83255a8dbc4c9c3',
    'ariauseGraymode': 'false',
}
sign_data = module.get_sign(searchValue, itemId)
headers = {
    'Accept': 'application/json, text/plain, */*',
    'Accept-Language': 'zh-CN,zh;q=0.9',
    'Cache-Control': 'no-cache',
    'Connection': 'keep-alive',
    'Pragma': 'no-cache',
    'Referer': 'https://www.nmpa.gov.cn/datasearch/search-result.html',
    'Sec-Fetch-Dest': 'empty',
    'Sec-Fetch-Mode': 'cors',
    'Sec-Fetch-Site': 'same-origin',
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/137.0.0.0 Safari/537.36',
    'sec-ch-ua': '"Google Chrome";v="137", "Chromium";v="137", "Not/A)Brand";v="24"',
    'sec-ch-ua-mobile': '?0',
    'sec-ch-ua-platform': '"Windows"',
    'sign': sign_data["sign"],
    'timestamp': str(sign_data["timestamp"]),
    'token': 'false',
}

params = {
    'itemId': itemId,
    'isSenior': 'N',
    'searchValue': searchValue,
    'pageNum': '1',
    'pageSize': '10',
    'timestamp': int(sign_data["timestamp"]),
}
response = requests.get(
    'https://www.nmpa.gov.cn/datasearch/data/nmpadata/search',
    params=params,
    cookies=cookies,
    headers=headers,
)
print(response.json())


OK,本次逆向完成。

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值