当前位置: 首页 > news >正文

码上爬第十一题【协程+wasm】

前言:此题主要是考大家遇到wasm怎么处理。

  1. 第一步:翻页抓包,分析数据接口参数,如图所示:
    在这里插入图片描述
    在这里插入图片描述
  2. 第二步:观察堆栈,定位加密位置,如图所示
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
  3. 第三步:到这里我会选择在本地改写我们需要的函数,如图所示:
    在这里插入图片描述
  4. 第四步:现在就可以开始扣js代码了,如图所示:
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
  5. 第五步:到这里也就到写代码环节了,如下:

js代码

// 调用wasm来加密参数m值
// 引入必要的模块
const fs = require('fs');
function loadWasm(page, _ts) {try {// 同步读取 .wasm 文件为二进制数据const wasmFilePath = 'D:\\Spider\\demo\\图灵系列题\\11_wasm小试牛刀\\11.wasm';const buffer = fs.readFileSync(wasmFilePath);// 编译 WebAssembly 模块const module = new WebAssembly.Module(buffer);// 实例化 WebAssembly 模块const instance = new WebAssembly.Instance(module);// 调用导出的 encrypt 函数if (instance.exports.encrypt) {const result = instance.exports.encrypt(page, _ts); // 测试参数console.log('Encrypt Result:', result); // 输出结果return result;} else {throw new Error('模块未导出 encrypt 函数');}} catch (error) {console.error('加载或运行 WASM 模块失败:', error);throw error;}
}const _js = 0x199afunction a() {const P = (function() {return [_js, 'EFLSjPQVsjReiPMOaFtrmJHiI.DcWUVoRmE.vd7k==', 'bNTQlG', 'ra7cVCkEW41VASo+W7y0vM3cLa', 'mxStoSoW', 'lHKJW5CVWQxcP8koW41iW4BdVa', 'oSoJsbaXhc3cUmkbW63cTha', 'W5zmW49fW4i', 'uamBWP3cP8knESk+bHpcUSogmSoWWQvWW4Hus8kgWQddI8o8ACkCWR49pKeTWPi', 'WRFcSmkcCN8', 'W40cdSkMW4q', 'bqCzwJ8aW4a', 'umkHiLPM', 'DSoZWRVcKCoP', 'c21XfmktdmoD', 'WONcSSkWWQ1ArtLBW7jhWPddUhX0W4lcMX7cJqy+', 'W5ZdUgfpoq', 'seOBW7NcO8oSWQu', 'W6NdPmkQWPBcNq', 'ymkgpuH3'].concat((function() {return ['W5pcHHBdRhfSWQtdLCkLbCoXWPZcRa', 'rSoGmCo5WRi', 'Ch8hdG', 'W7ddGw3dGdHlbG', 'xs8ZdL4', 'q3ZdU8o/gq', 'jKBdRmojWQ0', 'W7zuWRBdUHK', 'WPzIW5FdLmoz', 'seeVW4ZcKSkxWP10WOxdU8keW6hdMrvNpmoTnvRcVcrOWOS', 'WPbNW6G/WRJcOmk+nhpdPmoQCLS', 'WOq4ySk0', 'W5RdRmoPmW3dQ8kIddtdGJyy', 'WOCfumkrW6q', 'W4xdGfXrgG', 'qcPCuG', 'WPdcSuS8WRG', 'CcJdImkltCkjcG', 'fqDmC8ov', 'W6uVWPPOW7G'].concat((function() {return ['bxq4W4FcT8oaWP3cKG', 'lr0RW5D8W6NcTmkVW4bI', 'W5JdVMVdGmoxgCkPtstcICkVW6ZdPa', 'q8kDwXxdUwtcImkvW6C', 'W67cMCk/WPFdQSkVW5/cH8oplXZdSCkK', 'WPbLjqRcJxOXfN7cHSosvq', 'h8onkCoHW7hdPI/dGKRdRmoSWRj4BXOBW402WRlcPG', 'pab5WPNcJmkeWRrvW5JdNW', 'WPWZn8kzha', 'WRWZn8kzhgq6WO/dUgNdPCkZW47cJHekWOldUeddQmofFaVcNhfLEuPzoCod', 'sSk5mLze', 'WOvoW57dVa', 'W7zYW6PaW5eGW5FcGq', 'fv7dVmooWPm', 'w8k7WRZdImoK', 'W4awWOVcPmklzmkSW7BdKSorECoR', 'yrKmWPW', 'WOVdG0VcTW', 'lwWlj8oU'];}()));}()));}());a = function() {return P;};return a();
}function b(c, d) {const e = a();return b = function(f, g) {f = f - 0x90;let h = e[f];if (b['MZrkWY'] === undefined) {var i = function(n) {const o = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let p = '', q = '';for (let r = 0x0, s, t, u = 0x0; t = n['charAt'](u++); ~t && (s = r % 0x4 ? s * 0x40 + t : t,r++ % 0x4) ? p += String['fromCharCode'](0xff & s >> (-0x2 * r & 0x6)) : 0x0) {t = o['indexOf'](t);}for (let v = 0x0, w = p['length']; v < w; v++) {q += '%' + ('00' + p['charCodeAt'](v)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(q);};const m = function(n, o) {let p = [], q = 0x0, r, t = '';n = i(n);let u;for (u = 0x0; u < 0x100; u++) {p[u] = u;}for (u = 0x0; u < 0x100; u++) {q = (q + p[u] + o['charCodeAt'](u % o['length'])) % 0x100,r = p[u],p[u] = p[q],p[q] = r;}u = 0x0,q = 0x0;for (let v = 0x0; v < n['length']; v++) {u = (u + 0x1) % 0x100,q = (q + p[u]) % 0x100,r = p[u],p[u] = p[q],p[q] = r,t += String['fromCharCode'](n['charCodeAt'](v) ^ p[(p[u] + p[q]) % 0x100]);}return t;};b['ygIwjZ'] = m,c = arguments,b['MZrkWY'] = !![];}const j = e[0x0], k = f + j, l = c[k];return !l ? (b['dcXJGV'] === undefined && (b['dcXJGV'] = !![]),h = b['ygIwjZ'](h, g),c[k] = h) : h = l,h;},b(c, d);
}function callEncryptFunction(c, d) {const F = b, f = {'gDlFk': F(0xb2, '8WDi')};try {const g = window['exports']['encrypt'](c, d);return g;} catch (h) {console["error"]("Error calling encrypt function:", h);}
}function get_sign(page){_ts = parseInt(Math["round"](new Date()["getTime"]() / 0x3e8)["toString"]());m = callEncryptFunction(page, _ts)return {'_ts': _ts.toString(),'m': m}
}
console.log(get_sign(1))

py代码

import asyncio, aiohttp, execjsclass AsyncSpider(object):def __init__(self):self.url = 'https://www.mashangpa.com/api/problem-detail/11/data/'self.headers = {'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36'}self.cookies = {'sessionid':'7iz4z3zugx9xbdrm2ykqpfaoswvf7a3o'}self.semaphore = asyncio.Semaphore(3)with open('11.js', 'r', encoding='utf-8') as f:self.ctx = execjs.compile(f.read())async def fetch_page(self, session, page):async with self.semaphore:sign = self.ctx.call('get_sign', page)params = {'page': page,'m': sign['m'],'_ts': sign['_ts']}async with session.get(self.url, headers = self.headers, cookies = self.cookies, params = params, timeout = 10) as res:data = await res.json()return data.get('current_array', [])async def parse_all_pages(self):total_sum = 0async with aiohttp.ClientSession() as session:tasks = [self.fetch_page(session, page) for page in range(1, 21)]results = await asyncio.gather(*tasks)for array in results:if array:total_sum += sum(array)print(total_sum)if __name__ == '__main__':spider = AsyncSpider()asyncio.run(spider.parse_all_pages())
http://www.dtcms.com/a/335214.html

相关文章:

  • 博弈论07——Lemke-Howson 算法
  • STM32-GPIO实践部分1-跑马灯实验
  • 【Java基础面试题】Java基础概念
  • 按键及消抖
  • C++ 最短路Dijkstra
  • [Python]PTA:for 求奇数分之一序列前N项和
  • 安卓开发选择题
  • CUDA 编程笔记:CUDA延迟隐藏
  • 通配符 重定向 管道符
  • Java 中重载与重写的全面解析(更新版)
  • 在浏览器端使用 xml2js 遇到的报错及解决方法
  • BM25算法和传统的TF-IDF算法的区别
  • 改进版的QGIS 的(属性查询) identify featrues 功能
  • 算法题Day2
  • 计组-间接寻址
  • 抽象代数 · 代数结构 | 群、环、域、向量空间
  • 【QT】常⽤控件详解(八) Qt窗⼝ 菜单栏 工具栏 状态栏 浮动窗口 五种内置对话框
  • Oracle数据库文件管理与空间问题解决指南
  • Java中 23 种设计模式介绍,附带示例
  • IO流-打印流
  • leetcode hot100数组:缺失的第一个正数
  • 洛谷B3924 [GESP202312 二级] 小杨的H字矩阵
  • 洛谷B3865 [GESP202309 二级] 小杨的 X 字矩阵(举一反三)
  • CSDN部分内容改为视频转到B站-清单
  • 如何解决pip安装报错ModuleNotFoundError: No module named ‘opencv-python’问题
  • Cloudflare Tunnel 使用SAAS回源加速配置教程
  • 配置 Docker 镜像加速,解决 docker pull 拉取镜像失败、docker search 查询镜像失败等问题
  • Agent中的memory
  • 异构数据库兼容力测评:KingbaseES 与 MySQL 的语法・功能・性能全场景验证解析
  • MySQL性能优化:10个关键参数调整指南