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

AI 赋能 JS 逆向MCP+Skill+autoDecoder 全自动化落地加密自动Ai逆向

0x01 前言随着各大开发的安全意识逐渐提高前端防护手段越来越复杂参数加密场景的越来越广泛并且其生成逻辑往往经过多层混淆与封装对我这种不具备深厚的代码功底和逻辑还原能力的小菜鸡来说倍感压力人工逆向的方法不仅耗时费力还高度依赖个人经验往往在对抗JS逆向时就已经筋疲力尽所有想试试结合chrome-devtools-mcp的能力并加上Skill的规范实现JSRPCFlaskautoDecoder方案的前端JS逆向自动化分析提升JS逆向的效率。现在只对常读和星标的才展示大图推送建议大家把渗透安全HackTwo“设为星标”否则可能就看不到了啦#渗透安全HackTwo0x02 详情传统JS逆向方法回顾传统JS逆向工程在实践中已经形成了一系列由简至繁、由手动到半自动的技术路径我大概归纳成了这四类1、直接修改变量法进入到调试中调试到参数加密前并直接在作用域中修改参数效果类似如下。2、中间劫持法JS-forward通过JS-forward实现在明文点处插入一段JS代码使其通过AJAX请求将现有的请求内容发送给burpsuiteburpsuite拦截并修改内容后返回到原始变量中效果类似如下。3、远程调用法JS-RPC注入到浏览器页面中的客户端中通过websocket与本地的python服务端相连直接调用在浏览器上下文中预先注册好的JavaScript函数效果类似如下。4、硬核对抗法JS原生通过反混淆分析代码逻辑研究参数作用添加补环境最终通过本地运行JS来加解密效果类似如下。在接下来的方案中我选择了选择远程调用法JS-RPC作为MCP赋能JS逆向的底座因为它能将浏览器环境直接转化为加密服务接口避免了纯手动逆向的低效又绕开了纯JS还原的高复杂度并且可以适配复杂场景下的JS逆向对抗。MCP赋能的集成方案工具链介绍JSRPC作为注入到浏览器页面中的客户端建立通过WebSocket协议的远程过程调用机制直接调用在浏览器上下文中预先注册好的JavaScript函数。Flask接收来自自动化工具如Burp Suite插件的请求提取出需要加密的参数然后通过JSRPC调用浏览器中的函数进行加密最后重构请求并转发至目标服务器实现自动化流程的串联。autoDecoder作为Burp Suite的插件用于自动化处理应用中的加密/编码接口自动将明文参数发送至该服务器并完成加密请求的构建实现“无感”的JS逆向处理。chrome-devtools-mcp通过Chrome DevTools Protocol与浏览器实例建立连接将浏览器的底层控制能力如执行JS、调试、网络监控、DOM操作等封装成一系列标准化的工具并通过MCP协议暴露给AI客户端。流程设计针对远程调用法JS-RPC初始配置阶段中定位加密函数、编写注册代码、编写python代码等繁琐操作通过引入AI技术进行赋能让AI自动完成函数发现与注册代码生成最终实现从“半自动”到“高自动”的跨越人员全程只需下方指令并最终配置一下burp即可完成JS逆向的全流程。对于手工注入原理不懂的可以看这位师傅的文章有个流程图我感觉还是比较直观的解释的https://xz.aliyun.com/news/90766MCP配置1、这边使用的是codex来调用MCP服务首先将MCP服务器写进 Codex 的配置codex mcp add chrome-devtools npx -y chrome-devtools-mcplatest2、修改 Codex 的配置文件MAC的在~/.codex/config.toml添加如下字段[mcp_servers.chrome-devtools] command npx args [-y, chrome-devtools-mcplatest]3、检测是否生效4、启动mcp服务当看到打开浏览器后MCP服务就配置好了。/Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome \ remote-debugging-port9222 \ remote-debugging-address0.0.0.0Skill配置Skill是能否一次性完成js分析和代码生成的关键创建3个mrakdown文件用于规范AI的操作以及输出1、主技能模板(js-reverse-automation)负责负责整体流程控制和协调规范AI通过MCP协议连接和控制浏览器环境让AI实现分析和理解代码生成的核心逻辑- name: js-reverse-automation description: 通过 MCP 连接浏览器为目标自动化搭建JS环境定位签名/加密函数入口生成 JSRPC 代码创建 Flask 代理并输出 Burp autoDecoder 配置。用于分析 JS 加密/签名逻辑、JSRPC代码生成、或搭建完整工具链的需求。 - # JS 逆向自动化技能 ## 补充模板引用 - 使用时先阅读本主技能再按需加载补充模板JSRPC.mdJSRPC 注入模板、flask.mdFlask 代理模板、burp-autodecoder.mdBurp autoDecoder 配置说明模板。 ## 使用本技能完成 - 通过 MCP 连接真实浏览器 - 定位 JS 中的签名/加密入口 - 基于模板生成 JSRPC 注入代码 - 构建 Flask 代理与 Burp autoDecoder 配置 - 验证端到端流程可用 ## 需要收集的输入 - 目标 URL 或功能需求如“生成 sign/enc” - 环境限制浏览器版本、代理、插件 label目标网址/label input typetext placeholderhttps://example.com / label需要分析的加密参数/label input typetext placeholder例如 sign / enc / token / labelFetch 示例可选/label textarea rows6 placeholder粘贴 fetch 请求示例便于识别参数与签名位置/textarea ## 需要交付的输出 1. JSRPC 注入代码模板 站点适配 2. Flask 代理服务API 封装 错误处理 3. Burp autoDecoder 配置说明 4. **完整的加密/签名逻辑代码**可直接复制用于人工调试 5. 验证记录示例调用 期望输出 ## 工作流程 ### 阶段一初始化与连接 1. 通过 MCP 连接浏览器 2. 加载目标页面并打开 DevTools ### 阶段二分析与入口定位 1. 触发签名流程并抓取调用栈 2. 检查打包代码并定位 sign/encrypt等函数 3. 确认入口类型全局 / 对象方法 / 动态 resolver ### 阶段三生成与注入 JSRPC 1. 基于模板生成 JSRPC 注入代码 - 配置入口路径或 resolver - 需要时绑定 this - 处理同步 / Promise 异步 - 规范化输入/输出 - 添加错误兜底 2. 注入并注册 JSRPC action 3. 验证 JSRPC 调用是否返回预期结果 4. 输出完整的加密/签名逻辑代码片段含所需依赖与调用示例便于人工调试 ### 阶段四构建服务端代理 1. 生成 Flask 代理 - JSRPC 客户端连接 - API 路由封装 - 结构化错误处理 2. 启动服务并做健康检查 ### 阶段五集成与交付 1. 输出 Burp autoDecoder 配置说明 2. 端到端验证并记录结果 3. 提供维护建议与更新要点 ## 交付前检查 - 入口定位稳定且可复现 - this 绑定正确 - Promise/异步处理正确 - 输入/输出规范化正确 - 错误有兜底且不影响调用 - Burp/Flask 配置端到端可用 - 加密/签名逻辑代码完整可独立运行 2、JSRPC注入模板 (jsrpc-injection-template) 负责 提供通用的函数拦截和远程调用能力 提供模版让生成时支持多种加密场景的适配配置 确保代码注入的稳定性和安全性 - name: jsrpc-injection-template description: 作为主技能 js-reverse-automation 的补充资源提供通用 JSRPC 注入模板用于定位签名/加密函数入口并对外注册 action。用于生成适配不同 JS 加密场景的 JSRPC 代码。 - # JSRPC 注入工具模板补充资源 本文件是主技能 js-reverse-automation 的补充模板配合 skill.md 使用。 ## 目标 - 统一生成可迁移的 JSRPC 注入代码 - 支持全局函数、对象方法、动态定位 - 兼容同步/异步 Promise 返回 - 支持输入输出规范化与错误兜底 ## 输入 - actionNameJSRPC 注册的 action 名称 - entry目标函数入口定位方式 - bindThis需要绑定的上下文对象可选 - async是否返回 Promise - normalizeInput/normalizeOutput输入/输出标准化函数 ## 输出 - 可直接注入的 JSRPC 代码段 ## 代码模板 js // 1) 建立 JSRPC 连接 var client new Hlclient(ws://127.0.0.1:12080/ws?groupfaustonameburp); // 2) 配置区 var JSRPC_CONFIG { actionName: generate_sign, entry: { type: global, // global | object | resolver path: signFunction, resolver: null }, bindThis: null, async: false, normalizeInput: function(param) { return param; }, normalizeOutput: function(result) { return result; }, onError: function(err) { return ERROR_ Date.now(); } }; // 3) 工具函数 function getByPath(root, path) { if (!root || !path) return null; var parts path.split(.); var cur root; for (var i 0; i parts.length; i) { cur cur[parts[i]]; if (!cur) return null; } return cur; } function resolveEntry(config) { if (config.entry.type global) return window[config.entry.path]; if (config.entry.type object) return getByPath(window, config.entry.path); if (config.entry.type resolver typeof config.entry.resolver function) { return config.entry.resolver(); } return null; } // 4) 注入入口 client.regAction(JSRPC_CONFIG.actionName, function(resolve, param) { try { var fn resolveEntry(JSRPC_CONFIG); if (typeof fn ! function) throw new Error(签名/加密函数未找到); var input JSRPC_CONFIG.normalizeInput(param); var ctx JSRPC_CONFIG.bindThis || null; var result fn.call(ctx, input); if (JSRPC_CONFIG.async result typeof result.then function) { result.then(function(res) { resolve(JSRPC_CONFIG.normalizeOutput(res)); }).catch(function(err) { resolve(JSRPC_CONFIG.onError(err)); }); return; } resolve(JSRPC_CONFIG.normalizeOutput(result)); } catch (error) { resolve(JSRPC_CONFIG.onError(error)); } }); ## 适配示例 ### A. 全局函数 js JSRPC_CONFIG.entry { type: global, path: signFunction }; ### B. 对象方法 js JSRPC_CONFIG.entry { type: object, path: crypto.sign }; JSRPC_CONFIG.bindThis window.crypto; ### C. 动态定位 js JSRPC_CONFIG.entry { type: resolver, resolver: function() { return window.__SIGN_FN__ || (window.crypto window.crypto.sign); } }; ### D. Promise 异步 js JSRPC_CONFIG.async true; ## 注意事项 - 保证入口函数定位稳定 - 处理 this 绑定与异步返回 - 输入输出需要可复现 - 失败要有兜底避免 JSRPC 调用中断 3、Flask代理模板 (flask-jsrpc-proxy-template) 负责 确保正常构建中间件服务连接JSRPC和Burp Suite 确保实现请求转发和签名回填的自动化 确保提供完整的错误处理和日志记录 - name: flask-jsrpc-proxy-template description: 面向 Burp autoDecoder 的 Flask 代理服务模板用于将请求体交给 JSRPC 生成加密后的结果并回填。适用于需要自动签名/加密参数回填的场景。 - # Flask JSRPC 代理工具模板 ## 目标 - 接收 Burp autoDecoder 的编码请求 - 解析请求体 - 调用 JSRPC 生成加密/签名 - 回填签名并返回给 Burp ## 输入 - dataBodyautoDecoder 传入的请求体默认表单字段 - dataHeadersautoDecoder 传入的请求头默认表单字段 ## 输出 - 更新后的请求体可包含更新后的请求头 ## 可配置项 - JSRPC 地址如 http://127.0.0.1:12080/go - JSRPC 参数group、action - 签名字段名默认 sign - 超时时间、日志级别 ## 代码模板 python from flask import Flask, request import requests import json import logging logging.basicConfig(levellogging.DEBUG) app Flask(__name__) JSRPC_URL http://127.0.0.1:12080/go JSRPC_GROUP fausto JSRPC_ACTION generate_sign SIGN_FIELD sign TIMEOUT 5 app.route(/encode, methods[POST]) def handle_encode(): app.logger.info(- 收到来自 Burp/autoDecoder 的编码请求 -) data_body request.form.get(dataBody, ) data_headers request.form.get(dataHeaders, ) if not data_body: app.logger.error(未接收到 dataBody) return data_headers \r\n\r\n\r\n\r\n data_body if data_headers else data_body try: json_data json.loads(data_body) except json.JSONDecodeError as e: app.logger.error(f解析 JSON 失败: {e}) return data_headers \r\n\r\n\r\n\r\n data_body if data_headers else data_body old_sign json_data.pop(SIGN_FIELD, None) app.logger.info(f已移除旧签名: {old_sign}) params_for_jsrpc { group: JSRPC_GROUP, action: JSRPC_ACTION, param: json.dumps(json_data, ensure_asciiFalse, separators(,, :)) } try: jsrpc_response requests.get(JSRPC_URL, paramsparams_for_jsrpc, timeoutTIMEOUT) jsrpc_response.raise_for_status() result jsrpc_response.json() new_sign result.get(data, ) except requests.exceptions.RequestException as e: app.logger.error(f调用 JSRPC 失败: {e}) new_sign except json.JSONDecodeError as e: app.logger.error(f解析 JSRPC 返回失败: {e}) new_sign json_data[SIGN_FIELD] new_sign new_data_body json.dumps(json_data, ensure_asciiFalse, separators(,, :)) if data_headers: new_content_length len(new_data_body) new_headers data_headers.replace( fContent-Length: {len(data_body)}, fContent-Length: {new_content_length} ) return new_headers \r\n\r\n\r\n\r\n new_data_body return new_data_body if __name__ __main__: app.run(host0.0.0.0, port8888, debugTrue) ## 使用说明 - Burp autoDecoder 将请求体与头部作为表单字段传入 /encode - 服务返回的内容将被 autoDecoder 用于替换原始请求 ## 注意事项 - JSRPC 端口/参数需与注入端一致 - 若加密依赖更多字段需在加密前补齐实战测试以某大学人事管理系统为例其password字段被加密我将全程使用ai进行分析并全程使用ai生成的代码进行测试来验证流程的有效性。1、首先输入触发Skill的提示词AI会提示我们需要输入的内容。按 skill.md 的流程执行2、在网页中提取我们所需的参数。3、然后输入提示我们需要输入的所需参数至codex。目标网址URLhttps://xxx/login/index 需要分析的加密参数例如 sign / enc / tokenpassword 环境限制浏览器版本、是否已配置代理、是否有插件/扩展限制无 可选fetch 请求示例便于定位签名入口fetch(https://xxx/Login/CheckLogin, { headers: { accept: application/json, text/javascript, */*; q0.01, accept-language: zh-CN,zh;q0.9,en;q0.8,en-GB;q0.7,en-US;q0.6,ar;q0.5, cache-control: no-cache, content-type: application/x-www-form-urlencoded; charsetUTF-8, pragma: no-cache, sec-ch-ua: \Not(A:Brand\;v\8\, \Chromium\;v\144\, \Microsoft Edge\;v\144\, sec-ch-ua-mobile: ?0, sec-ch-ua-platform: \macOS\, sec-fetch-dest: empty, sec-fetch-mode: cors, sec-fetch-site: same-origin, x-requested-with: XMLHttpRequest }, referrer: https://hr.ncu.edu.cn/login/index, body: username111111password96e79218965eb72c92a549dd5a330112code1943role000002, method: POST, mode: cors, credentials: include });4、等待代码执行完成发现所需的代码均以创建完成。​ Using skill js-reverse-automation (and its JSRPC/Flask/Burp templates) because the task matches the skill description. Couldn’t attach to the MCP browser: the Chrome DevTools MCP reports an existing running profile and refuses to create/list pages. I proceeded with a safe fallback by pulling the page/JS directly to locate the encryption entry. What I found (入口定位) 登录页的内联脚本直接对 password 做 $.md5(...) 后提交password: $.md5($.trim($password.val())) MD5 实现在 jquery.md5.js 与你提供的示例一致md5(111111) 96e79218965eb72c92a549dd5a330112 Artifacts generated JSRPC 注入代码jsrpc_password_md5.js Flask 代理服务flask_proxy_password.py Burp autoDecoder 配置说明burp_autodecoder_config.md 完整加密逻辑可直接调试password_encrypt_logic.js Verification record 本地校验md5(111111) - 96e79218965eb72c92a549dd5a330112与示例请求体一致 说明这是登录前端对 password 的唯一加密步骤MD5 How to use (简要) JSRPC在浏览器控制台注入 jsrpc_password_md5.js确保 Hlclient 已加载调用 action generate_password_md5 Flaskflask_proxy_password.py Burp按 burp_autodecoder_config.md 配置 autoDecoder 指向 http://127.0.0.1:8888/encode Notes 如需我按技能流程“连接真实浏览器并抓调用栈”请先关闭当前被 MCP 占用的浏览器实例或告诉我一个新的 isolated profile 配置我再补齐“阶段一/二”的可视化步骤与端到端验证。 Next steps (pick one) 我用 MCP 重新连接浏览器并做现场注入/验证你先关闭当前实例或提供 isolated 配置 我补充一个一键脚本自动注入 JSRPC 触发登录请求的验证脚本 5、启动JSRPC 6、在浏览器开发者工具的Console中执行JSRpc项目中的 JsEnv_Dev.js文件内容。 7、在控制台注入AI生成的jsrpc_password_md5.js。 // JSRPC injection for hr.ncu.edu.cn login password MD5 // Requires Hlclient to be available in the page context. var client new Hlclient(ws://127.0.0.1:12080/ws?groupfaustonameburp); var JSRPC_CONFIG { actionName: generate_password_md5, entry: { type: resolver, resolver: function () { if (window.$ typeof $.md5 function) return $.md5; if (window.jQuery typeof jQuery.md5 function) return jQuery.md5; return null; }, }, bindThis: null, async: false, normalizeInput: function (param) { if (param typeof param object) { if (param.password ! null) return String(param.password); if (param.pwd ! null) return String(param.pwd); } return String(param null ? : param); }, normalizeOutput: function (result) { return result; }, onError: function (err) { return ERROR_ Date.now(); }, }; function resolveEntry(config) { if (config.entry.type resolver typeof config.entry.resolver function) { return config.entry.resolver(); } return null; } client.regAction(JSRPC_CONFIG.actionName, function (resolve, param) { try { var fn resolveEntry(JSRPC_CONFIG); if (typeof fn ! function) throw new Error(md5 function not found); var input JSRPC_CONFIG.normalizeInput(param); var ctx JSRPC_CONFIG.bindThis || null; var result fn.call(ctx, input); if (JSRPC_CONFIG.async result typeof result.then function) { result.then(function (res) { resolve(JSRPC_CONFIG.normalizeOutput(res)); }).catch(function (err) { resolve(JSRPC_CONFIG.onError(err)); }); return; } resolve(JSRPC_CONFIG.normalizeOutput(result)); } catch (error) { resolve(JSRPC_CONFIG.onError(error)); } }); // Quick local check in console (optional): // console.log($.md5(111111)); ​8、测试jsrpc调用函数是否正常可以看到是没问题的。http://127.0.0.1:12080/go?groupfaustoactiongenerate_password_md5param1111119、运行flask_proxy_password.pyfrom flask import Flask, request import requests import json import logging from urllib.parse import parse_qs, urlencode import re logging.basicConfig(levellogging.DEBUG) app Flask(__name__) JSRPC_URL http://127.0.0.1:12080/go JSRPC_GROUP fausto JSRPC_ACTION generate_password_md5 PASSWORD_FIELD password TIMEOUT 5 CONTENT_LENGTH_RE re.compile(rContent-Length:\s*\d, re.IGNORECASE) def call_jsrpc(raw_password: str) - str: params_for_jsrpc { group: JSRPC_GROUP, action: JSRPC_ACTION, param: raw_password, } try: jsrpc_response requests.get(JSRPC_URL, paramsparams_for_jsrpc, timeoutTIMEOUT) jsrpc_response.raise_for_status() result jsrpc_response.json() return result.get(data, ) except requests.exceptions.RequestException as e: app.logger.error(fJSRPC request failed: {e}) return except json.JSONDecodeError as e: app.logger.error(fJSRPC response parse failed: {e}) return app.route(/encode, methods[POST]) def handle_encode(): app.logger.info(- incoming autoDecoder request -) data_body request.form.get(dataBody, ) data_headers request.form.get(dataHeaders, ) if not data_body: app.logger.error(missing dataBody) return data_headers \r\n\r\n\r\n\r\n data_body if data_headers else data_body # Try JSON first new_body None try: json_data json.loads(data_body) raw_pwd str(json_data.get(PASSWORD_FIELD, )) if raw_pwd: json_data[PASSWORD_FIELD] call_jsrpc(raw_pwd) new_body json.dumps(json_data, ensure_asciiFalse, separators(,, :)) except json.JSONDecodeError: # Fallback to x-www-form-urlencoded form parse_qs(data_body, keep_blank_valuesTrue) raw_pwd form.get(PASSWORD_FIELD, [])[0] if raw_pwd: form[PASSWORD_FIELD] [call_jsrpc(raw_pwd)] new_body urlencode(form, doseqTrue) if data_headers: new_len len(new_body) new_headers CONTENT_LENGTH_RE.sub(fContent-Length: {new_len}, data_headers) return new_headers \r\n\r\n\r\n\r\n new_body return new_body if __name__ __main__: app.run(host0.0.0.0, port8888, debugTrue)10、测试Flask是否可以正常加密可以看到也是没问题的。curl -X POST http://127.0.0.1:8888/encode \ -H Content-Type: application/x-www-form-urlencoded \ >11、最后参考Burp autoDecoder 配置说明burp_autodecoder_config.md配置burp的autoDecoder插件也成功加密了参数整体完美运行下来了0x03 总结如果需要Skill代码的师傅们可以在文章末尾自取本文也是成功的实现了全自动化的js分析和代码生成但是对于一些复杂场景的js代码可能分析起来还是略微有点吃力但是AI的好处就是可以反复调试也期待师傅们和优化出更好的思路和代码一起交流学习。最后愿各位师傅在后续挖洞之路中精准定位、高效挖掘天天出高危、次次有收获挖洞顺利、不踩坑、多拿奖励共同提升支付业务安全测试能力喜欢这类文章或挖掘SRC技巧文章师傅可以点赞转发支持一下谢谢

相关文章:

AI 赋能 JS 逆向MCP+Skill+autoDecoder 全自动化落地加密自动Ai逆向

0x01 前言 随着各大开发的安全意识逐渐提高,前端防护手段越来越复杂,参数加密场景的越来越广泛,并且其生成逻辑往往经过多层混淆与封装,对我这种不具备深厚的代码功底和逻辑还原能力的小菜鸡来说倍感压力,人工逆向的方…...

AI时代的算法思维:大经典排序学习竞

引言 在现代软件开发中,性能始终是衡量应用质量的重要指标之一。无论是企业级应用、云服务还是桌面程序,性能优化都能显著提升用户体验、降低基础设施成本并增强系统的可扩展性。对于使用 C# 开发的应用程序而言,性能优化涉及多个层面&#x…...

gte-base-zh快速上手:Xinference框架下的文本嵌入模型部署实战

gte-base-zh快速上手:Xinference框架下的文本嵌入模型部署实战 1. 引言:认识gte-base-zh文本嵌入模型 文本嵌入技术是自然语言处理中的核心基础,它能够将文字转换为计算机可理解的数字向量。gte-base-zh作为阿里巴巴达摩院基于BERT框架训练…...

Windows10 Qt5.15.2环境下MINGW编译VTK-8.2.0的完整指南与常见问题解决

1. 环境准备与工具安装 在Windows10系统下用Qt5.15.2的MINGW编译VTK-8.2.0,首先需要准备好基础工具链。我去年在给医疗影像项目搭建三维可视化平台时就踩过不少坑,后来总结出这套稳定可靠的配置方案。 CMake的选择特别关键,实测3.14.0版本兼容…...

软件测试人员,别再贩卖AI焦虑了!

📝 面试求职: 「面试试题小程序」 ,内容涵盖 测试基础、Linux操作系统、MySQL数据库、Web功能测试、接口测试、APPium移动端测试、Python知识、Selenium自动化测试相关、性能测试、性能测试、计算机网络知识、Jmeter、HR面试,命中…...

SpringCloud微服务进阶-Nacos更加全能的注册中心劫

插件化架构 v3 版本最大的变化是引入了模块化插件系统。此前版本中集成在核心包里的原生功能,现在被拆分成独立的插件。 每个插件都是一个独立的 Composer 包,包含 Swift 和 Kotlin 代码、权限清单以及原生依赖。开发者只需安装实际用到的插件&#xff0…...

NSudo完整指南:解锁Windows系统管理终极权限的5种方法

NSudo完整指南:解锁Windows系统管理终极权限的5种方法 【免费下载链接】NSudo [Deprecated, work in progress alternative: https://github.com/M2Team/NanaRun] Series of System Administration Tools 项目地址: https://gitcode.com/gh_mirrors/ns/NSudo …...

时间块工作法:编程专注力提升200%

在软件测试领域,专注力是高效工作的核心驱动力。测试从业者常面临多任务切换、需求变更频繁和干扰源众多的挑战,导致注意力分散、效率低下。时间块工作法(Time Blocking)作为一种科学的时间管理策略,通过将工作时间分割…...

Playwright CLI 使用指南 —— 现代浏览器自动化利器

Playwright CLI 使用指南 —— 现代浏览器自动化利器 Playwright CLI 是微软推出的命令行浏览器自动化工具,专为现代编码代理(Coding Agents)优化。它通过简洁的 CLI 命令暴露浏览器工作流,相比 MCP 协议更加 Token 高效&#xff…...

Springboot 实现多数据源(PostgreSQL 和 SQL Server)连接劣

一、环境准备 Free Spire.Doc for Python 是免费 Python 文档处理库,无需依赖 Microsoft Word,支持 Word 文档的创建、编辑、转换等操作,其中内置的 Markdown 解析能力,能高效实现 Markdown 到 Doc/Docx 格式的转换,且…...

5个关键技巧:用InteractiveHtmlBom提升PCB设计效率300%

5个关键技巧:用InteractiveHtmlBom提升PCB设计效率300% 【免费下载链接】InteractiveHtmlBom Interactive HTML BOM generation plugin for KiCad, EasyEDA, Eagle, Fusion360 and Allegro PCB designer 项目地址: https://gitcode.com/gh_mirrors/in/Interactive…...

基于cruise的仿真模型搭建及效果分析:丰田氢能源车型在wltc工况下的跟随优势

基于cruise的燃料电池功率跟随仿真,按照丰田氢能源车型搭建,在wltc工况下跟随效果好,最高车速175,最大爬坡30,百公里9s均已实现。 1.模型通过cruise/simulink联合仿真,策略通过MATLAB/Simulink搭建的多点恒…...

全新RCLAMP3324T.TCT TVS二极管 Semtech 电子元器件 原装正品IC

Semtech推出的RCLAMP3324T.TCT 是由Semtech公司生产的一款高性能、低电容的四线ESD(静电放电)保护器件,它采用RailClamp专利架构,在超紧凑的SLP1710P4T封装内,实现了0.4pF超低电容与25kV接触/30kV空气放电顶级防护的完…...

终极指南:如何用Mousecape轻松定制你的macOS鼠标光标

终极指南:如何用Mousecape轻松定制你的macOS鼠标光标 【免费下载链接】Mousecape Cursor Manager for OSX 项目地址: https://gitcode.com/gh_mirrors/mo/Mousecape 你是否厌倦了macOS千篇一律的白色箭头光标?是否希望在工作时拥有更有个性、更醒…...

AI 时代:祛魅、适应与重新定义肝

指令替换 项目需求:将加法指令替换为减法 项目目录如下 /MyProject ├── CMakeLists.txt # CMake 配置文件 ├── build/ #构建目录 │ └── test.c #测试编译代码 └── mypass2.cpp # pass 项目代码 一,测试代码示例 test.c // test.c #includ…...

AI开发-python-langchain框架(--自定义Tool )硕

起因是我想在搞一些操作windows进程的事情时,老是需要右键以管理员身份运行,感觉很麻烦。就研究了一下怎么提权,顺手瞄了一眼Windows下用户态权限分配,然后也是感谢《深入解析Windows操作系统》这本书给我偷令牌的灵感吧&#xff…...

探索DebToIPA核心技术:解密.deb到.ipa的架构突破与移动应用格式革命

探索DebToIPA核心技术:解密.deb到.ipa的架构突破与移动应用格式革命 【免费下载链接】DebToIPA Convert .deb apps to .ipa files, on iOS, locally 项目地址: https://gitcode.com/gh_mirrors/de/DebToIPA 在移动应用生态系统的技术演进中,跨平台…...

如何用Obsidian Projects解决碎片化知识管理难题:从笔记到项目的一站式解决方案

如何用Obsidian Projects解决碎片化知识管理难题:从笔记到项目的一站式解决方案 【免费下载链接】obsidian-projects Plain text project planning in Obsidian 项目地址: https://gitcode.com/gh_mirrors/ob/obsidian-projects 你是否经常在Obsidian中积累了…...

深入解析Unity粒子系统Renderer模块:从基础渲染到高级光照控制

1. 粒子系统Renderer模块的核心作用 第一次接触Unity粒子系统时,我被Renderer模块里密密麻麻的参数吓到了。直到做了个烟花特效项目才发现,这个看似复杂的模块其实是让粒子"活起来"的关键。简单来说,它就像化妆师,决定…...

ETM vs. Abstract Model: Key Differences and Practical Applications in Hierarchical Design

1. ETM与Abstract Model基础概念解析 在芯片设计领域,随着设计规模越来越大,分层设计流程(hierarchy flow)已经成为主流方法。这种自底向上(bottom-up)的设计方式,先从模块级(block …...

【深度解析】Python异步编程:为何‘async with’必须安居于async函数之内?

1. 从报错案例看异步编程的门槛 那天我正在用aiohttp写一个简单的网络爬虫,代码看起来非常简洁: import aiohttpasync with aiohttp.ClientSession() as session:async with session.get(http://example.com) as response:print(await response.text())运…...

EcomGPT电商大模型效果展示:AI将‘V领收腰显瘦’转化为英文SEO友好描述

EcomGPT电商大模型效果展示:AI将‘V领收腰显瘦’转化为英文SEO友好描述 你是否曾为将一件“V领收腰显瘦”的连衣裙,翻译成能让海外消费者一眼心动、同时符合亚马逊搜索习惯的英文标题而头疼?传统的直译往往生硬,丢失了营销的灵魂…...

宝塔面板开机自启踩坑记:从手动重启到Systemd自动化,我总结了这几点经验

宝塔面板开机自启踩坑记:从手动重启到Systemd自动化实战指南 作为一名独立开发者,我永远忘不了那个凌晨三点被客户电话吵醒的夜晚——服务器意外重启后,宝塔面板没有自动恢复运行,导致所有网站服务瘫痪。这次惨痛经历让我下定决心…...

Springboot 实现多数据源(PostgreSQL 和 SQL Server)连接匚

一、环境准备 Free Spire.Doc for Python 是免费 Python 文档处理库,无需依赖 Microsoft Word,支持 Word 文档的创建、编辑、转换等操作,其中内置的 Markdown 解析能力,能高效实现 Markdown 到 Doc/Docx 格式的转换,且…...

douyin-downloader:抖音视频批量下载的终极技术指南与实战教程

douyin-downloader:抖音视频批量下载的终极技术指南与实战教程 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fallba…...

AlienFX Tools:彻底掌控你的Alienware设备,告别臃肿原厂软件

AlienFX Tools:彻底掌控你的Alienware设备,告别臃肿原厂软件 【免费下载链接】alienfx-tools Alienware systems lights, fans, and power control tools and apps 项目地址: https://gitcode.com/gh_mirrors/al/alienfx-tools 你是否对Alienware…...

Tiktokenizer:如何让AI的“语言思维“变得可视化?

Tiktokenizer:如何让AI的"语言思维"变得可视化? 【免费下载链接】tiktokenizer Online playground for OpenAPI tokenizers 项目地址: https://gitcode.com/gh_mirrors/ti/tiktokenizer "当AI模型阅读你的文字时,它究竟…...

抖音直播间弹幕实时采集完整指南:快速搭建专业级数据监控系统

抖音直播间弹幕实时采集完整指南:快速搭建专业级数据监控系统 【免费下载链接】DouyinLiveWebFetcher 抖音直播间网页版的弹幕数据抓取(2025最新版本) 项目地址: https://gitcode.com/gh_mirrors/do/DouyinLiveWebFetcher 想要在5分钟…...

如何用GetQzonehistory一键备份QQ空间?终极数据保存指南

如何用GetQzonehistory一键备份QQ空间?终极数据保存指南 【免费下载链接】GetQzonehistory 获取QQ空间发布的历史说说 项目地址: https://gitcode.com/GitHub_Trending/ge/GetQzonehistory 你是否担心QQ空间里那些珍贵的青春记忆会随着时间流逝而消失&#x…...

粉紫系超人气月兔铃仙识

1 安装与初始化 # 全局安装 OpenSpec npm install -g fission-ai/openspeclatest # 在项目目录下初始化 cd /path/to/your-project openspec init 初始化时,OpenSpec 会提示你选择使用的 AI 工具(Claude Code、Cursor、Trae、Qoder 等)。 3 O…...