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

某deepseek提问answer逆向分析,wasm + worker

仅供学习使用,如有侵权,联系删除!!!

仅供学习使用,如有侵权,联系删除!!!

url = 'aHR0cHM6Ly9jaGF0LmRlZXBzZWVrLmNvbS8='

来到这个网站随便问点东西,找到需要的接口信息观察发现请求头里面有一些参数需要分析请求载荷里面也有两个参数,chat_session_id和client_stream_id需要分析一下。

首先请求头里面的'x-hif-leim'是前面接口返回的,'x-hif-dliq'是localStorage里面的,经过测试发现可以不携带,请求载荷里面的chat_session_id也是前面接口返回的。

那么需要分析的只有'x-ds-pow-response'和'client_stream_id'

首先看看'x-ds-pow-response',直接进行base64解码可以看到,只有这个answer需要分析,其它的都是前面接口返回的。

搜索定位,打上断点这里返回的是一个异步,进入this.doSolveChallenge方法这里有点看不懂,问一下ai

let solveChallenge = async (challengeData, tracker) => { tracker.info({ name: "powSolveChallengeStart", message: "Start solving challenge", payload: {} }) // 第一套方案:normal(Worker A) try { const startTime = performance.now() const worker = (() => { if (!window.Worker) { throw new Error("Worker is not supported") } return new Worker( new URL(n.p + n.u("33614"), n.b), { type: "module" } ) })() const result = await o(challengeData, worker) tracker.info({ name: "powSolveChallengeSuccess", message: "Solved challenge", payload: { duration: performance.now() - startTime, from: "normal" } }) return result } catch (err) { tracker.error({ name: "powSolveChallengeFailed", message: "Failed to solve challenge", payload: tracker.withError(err, { from: "normal", info: JSON.stringify(challengeData) }) }) } // 第二套方案:fallback(Worker B / js) try { const startTime = performance.now() const worker = (() => { if (!window.Worker) { throw new Error("Worker is not supported") } return new Worker( new URL(n.p + n.u("38401"), n.b), { type: "module" } ) })() const result = await o(challengeData, worker) tracker.info({ name: "powSolveChallengeSuccess", message: "Solved challenge", payload: { duration: performance.now() - startTime, from: "js" } }) return result } catch (err) { tracker.error({ name: "powSolveChallengeFailed", message: "Failed to solve challenge", payload: tracker.withError(err, { from: "js", info: JSON.stringify(challengeData) }) }) throw err } }

那么我们只需要在第一个await o(e, s)打上断点,进入o方法又有点看不懂了,再问下ai

const solveWithWorker = async (challenge, worker) => { // 把 challenge 发给 worker worker.postMessage({ type: "pow-challenge", challenge }) const startTime = performance.now() // 等 worker 回消息 const workerResult = await new Promise((resolve, reject) => { worker.onmessage = event => { // worker 主动返回 error if (isWorkerError(event)) { reject( supportsErrorCause ? new Error("Worker error", { cause: event.data.error }) : event.data.error ) worker.terminate() return } // worker 返回成功结果 if (isWorkerSuccess(event)) { resolve(event.data) worker.terminate() return } } worker.onerror = err => { reject( new Error( `Worker error: ${err.message} ${err.filename}:${err.lineno}:${err.colno}` ) ) worker.terminate() } }) const endTime = performance.now() return { challengeResponse: workerResult.answer, duration: endTime - startTime } }

那么这里就清楚了,t是worker,通过t.postMessage发送数据,这里就单步进入t.postMessage,来到这里了这里就是这个answer生成的位置了

let o = n.__wbindgen_add_to_stack_pointer(-16) , h = u(e, n.__wbindgen_export_0, n.__wbindgen_export_1) , f = i , l = u(t, n.__wbindgen_export_0, n.__wbindgen_export_1) , p = i; n.wasm_solve(o, h, f, l, p, r); var s = c().getInt32(o + 0, !0) , a = c().getFloat64(o + 8, !0); return 0 === s ? void 0 : a

n.wasm_solve里面就是一个wasm文件,全部拿下来,用Js里面的WebAssembly做导出,调用就可以了。

加密的参数也是前面接口返回的,最后返回的a就是我们需要的answer。

接下来还有一个client_stream_id,这个就简单了,20260211代表当前日期,后面拼接了一个随机字符串

import uuid import datetime def generate_date_uuid(): """生成日期前缀的UUID""" date_prefix = datetime.datetime.now().strftime("%Y%m%d") random_part = uuid.uuid4().hex[:16] # 直接获取十六进制表示 return f"{date_prefix}-{random_part}" print(generate_date_uuid())

最后看一下实现吧

http://www.jsqmd.com/news/370928/

相关文章:

  • 破解2026普通外科学主治“选择困难”:三大讲师教学流派实战测评,高效通关 - 医考机构品牌测评专家
  • 深入解析:孤能子视角:数字时代,城乡生活的反转
  • 2026普通外科学主治考试:4 大机构铭师测评+优选师资,选对老师高效上岸 - 医考机构品牌测评专家
  • 从61%到98%:我是如何通过科学备考大幅提升执医通过率的 - 医考机构品牌测评专家
  • Agent、Prompt、Work flow、MCP,教你看懂关于智能体的这些词
  • 多维评测:卫生资格考试历年真题试卷推荐及考点分布洞察 - 医考机构品牌测评专家
  • 如果AI在写代码的时候,不小心删库了谁应该承担法律责任?
  • 临床执医备考不内耗:专属师资测评帮你高效通关 - 医考机构品牌测评专家
  • 主治医师考试最接近真实考试的试卷推荐 - 医考机构品牌测评专家
  • 梦断代码 运转
  • 《深入浅出玩转FPGA》 - 教程
  • 梦断代码 起始
  • 投入产出模型与产业链关联分析(1)(勒昂季夫模型)
  • SpringCloud 系列 03:OpenFeign 声明式服务调用,简化微服务通信
  • 读了30篇文献还不知道怎么写综述?
  • Unity调试Android/iOS库文件:崩溃排查全指南
  • AI时代iOS开发未来在哪里
  • 群友靶机tmp复现 - 场
  • 基于Python的外卖配送分析与可视化系统源码文档部署文档代码讲解等
  • 基于SpringBoot+vue3的Web的家政服务管理平台的设计与实现(源码+lw+部署文档+讲解等)
  • d11
  • 2026年值得信赖的海外品牌营销推广盘点:助力企业出海的优质之选 - 品牌2025
  • 黑马大模型RAG与Agent智能体实战教程LangChain提示词——16、RAG开发——模板类format()和invoke()方法(所有模板类都继承了Runnable类,拥有这两个方法)
  • 详细介绍:STM32新建工程(标准库官网下载)
  • 构建之法
  • 推荐几家制造业海外推广获客公司,上海、苏州地区优质制造业外贸B2B营销服务商详细介绍 - 品牌2025
  • Polya 定理学习笔记
  • cad功能区当前没有加载任何选项卡或面板
  • C++最小惊讶原则
  • 推荐几家Linkedin推广获客公司推荐,五家值得关注的Linkedin推广获客服务商盘点 - 品牌2025