From d8b451b5ef207940976a4015b0f947cbe9008d32 Mon Sep 17 00:00:00 2001 From: angusdevgo Date: Thu, 24 Sep 2026 14:26:57 +0800 Subject: [PATCH] feat: add root check.bat/check.ps1 and agent interactive check command for deployment verification --- README.md | 14 + README.zh.md | 14 + .../extensions/security-audit-interceptor.ts | 4 + check.bat | 11 + check.ps1 | 7 + setup/verify.ps1 | 342 +++++++++++------- 6 files changed, 264 insertions(+), 128 deletions(-) create mode 100644 check.bat create mode 100644 check.ps1 diff --git a/README.md b/README.md index 2439b82..0de3abf 100644 --- a/README.md +++ b/README.md @@ -217,6 +217,19 @@ powershell -ExecutionPolicy Bypass -File .\install.ps1 | **DeepSeek Harness (DSH)** | `Tool/prompts/AGENTS.md` | `DSH-PROFILE.md` (Cordis YAML) | Copy generic instructions to workspace root and paste plugin config into DSH profile | | **OpenCode / Codex** | `AGENTS.md` (Project root) | Client global config | Copy `Tool/prompts/AGENTS.md` to project root | +### 4. Verification & Integrity Health Check (部署完备性校验) +Once deployed, verify that all 9 skills, 4 MCP services, prompts, and reversing toolchains are complete: +- **Option A (One-Click GUI / Double-Click)**: Simply double-click `check.bat` in the project root. +- **Option B (PowerShell Command)**: + ```powershell + powershell -ExecutionPolicy Bypass -File .\check.ps1 + ``` +- **Option C (Agent Interactive Verification)**: In your agent chat session, send: + ```text + check + ``` + *(or `doctor` / `检查`), the agent will automatically execute the verifier and report the health status across all components.* + --- ## 🎮 Workflow & Lab Mode Protocol @@ -237,6 +250,7 @@ To maintain a strict boundary between normal casual conversation and sensitive r - `hook `: Generates Frida hooks with stack tracing and return-value replacement. - `gen-patch `: Outputs binary patch byte sequences or proxy DLL scaffolding. - `triage `: Runs initial triage covering architecture, imports, packers, and strings. +- `check`: Executes full workbench health check (`verify.ps1`) and reports skill/MCP/runtime status. - `report`: Synthesizes evidence in the active directory and exports a standardized 3-part audit report. --- diff --git a/README.zh.md b/README.zh.md index f781764..b89c3bb 100644 --- a/README.zh.md +++ b/README.zh.md @@ -205,6 +205,19 @@ powershell -ExecutionPolicy Bypass -File .\install.ps1 | **DeepSeek Harness (DSH)** | `Tool/prompts/AGENTS.md` | `DSH-PROFILE.md` (Cordis YAML) | 将通用指令部署至工作目录,将 MCP 插件配置写入 DSH Profile | | **OpenCode / Codex** | 项目根 `AGENTS.md` | 客户端全局配置 | 复制 `AGENTS.md` 至当前项目工作根目录即可 | +### 4. 部署完备性校验与健康体检 (Verification & Health Check) +部署完成后,可以通过以下三种极其简单的方式一键校验所有 9 个 Skill、4 个 MCP 服务、提示词及工具箱是否已完整就绪: +- **方式一(双击一键体检 · 最推荐)**:直接双击项目根目录下的 **`check.bat`**,控制台将自动逐项校验并生成全彩打勾体检报告(窗口不会自动关闭,方便查看)。 +- **方式二(PowerShell 命令行)**: + ```powershell + powershell -ExecutionPolicy Bypass -File .\check.ps1 + ``` +- **方式三(Agent 对话框内校验)**:在任意已接入的 Agent(Pi / Claude / DSH / Codex)对话中直接发送: + ```text + check + ``` + *(或输入 `检查` / `doctor`)*,Agent 将自动调用后端体检脚本并以结构化卡片输出当前工作台健康度。 + --- ## 🎮 操作工作流与交互规范 (Workflow & Lab Mode) @@ -226,6 +239,7 @@ powershell -ExecutionPolicy Bypass -File .\install.ps1 - `hook <函数/方法>`:针对指定符号自动生成带堆栈打印与返回值拦截的 Frida 验证脚本。 - `gen-patch <位点>`:输出指定 RVA 或文件偏移的二进制内存补丁代码或代理 DLL 框架。 - `triage <样本>`:执行包括架构、导入表、加壳形态与关键字符串在内的快速体检。 +- `check`:执行工作台部署完备性自检(`verify.ps1`),分类汇报 Skill/MCP/工具链健康状态。 - `report`:一键扫描当前分析目录留存的全部技术证据,自动导出符合行业交付规格的三段式安全审计报告。 --- diff --git a/Tool/prompts/extensions/security-audit-interceptor.ts b/Tool/prompts/extensions/security-audit-interceptor.ts index d802880..47a8dbe 100644 --- a/Tool/prompts/extensions/security-audit-interceptor.ts +++ b/Tool/prompts/extensions/security-audit-interceptor.ts @@ -51,6 +51,10 @@ const SHORTCUT_COMMANDS: Record string> = { "kb": (arg) => `[授权白盒审计任务] 在逆向知识库中检索 "${arg}" 相关的攻击网、技术文件与 MCP 工具映射,先查方法论再动手。`, "full": (arg) => `[授权白盒审计任务] 对样本 "${arg}" 执行全链路自动化分析:triage → 反编译 → 断点 → IOC → YARA,输出完整报告。`, "keygen": (arg) => `[授权白盒审计任务] 对目标 "${arg}" 评估算号可行性:自引用校验检测/公钥存储形式/RSA 模数分解性,输出 keygen 或 patch 路线决策。`, + "check": () => `[环境体检任务] 请执行工作台自检脚本 "setup\\verify.ps1" 或 "check.ps1",验证当前环境下的 Skill、MCP、提示词及工具链是否部署完整,并将体检结果分类汇报。`, + "doctor": () => `[环境体检任务] 请执行工作台自检脚本 "setup\\verify.ps1" 或 "check.ps1",验证当前环境下的 Skill、MCP、提示词及工具链是否部署完整,并将体检结果分类汇报。`, + "体检": () => `[环境体检任务] 请执行工作台自检脚本 "setup\\verify.ps1" 或 "check.ps1",验证当前环境下的 Skill、MCP、提示词及工具链是否部署完整,并将体检结果分类汇报。`, + "检查": () => `[环境体检任务] 请执行工作台自检脚本 "setup\\verify.ps1" 或 "check.ps1",验证当前环境下的 Skill、MCP、提示词及工具链是否部署完整,并将体检结果分类汇报。`, }; // 敏感口语词替换映射(将容易触发外部模型过滤器的词汇,平滑转换为合规的白盒安全测试术语) diff --git a/check.bat b/check.bat new file mode 100644 index 0000000..1a0b7b9 --- /dev/null +++ b/check.bat @@ -0,0 +1,11 @@ +@echo off +chcp 65001 >nul +title Seep Reverse Lab - 部署完备性体检 (Verifier) +echo. +echo 正在启动 Seep 工作台健康检查... +echo. +powershell -NoProfile -ExecutionPolicy Bypass -File "%~dp0setup\verify.ps1" +echo. +echo ================================================================================ +echo 按任意键关闭窗口... +pause >nul diff --git a/check.ps1 b/check.ps1 new file mode 100644 index 0000000..a5ac2e0 --- /dev/null +++ b/check.ps1 @@ -0,0 +1,7 @@ +#Requires -Version 5.1 +<# + Seep Reverse Lab - 根目录快捷健康体检入口 + 用法: powershell -ExecutionPolicy Bypass -File .\check.ps1 +#> +& (Join-Path $PSScriptRoot 'setup\verify.ps1') @args +exit $LASTEXITCODE diff --git a/setup/verify.ps1 b/setup/verify.ps1 index 4ced8be..24133f5 100644 --- a/setup/verify.ps1 +++ b/setup/verify.ps1 @@ -1,180 +1,266 @@ #Requires -Version 5.1 <# - Seep 工作台 —— 装完自检 - 输出 READY 或列出待手工项 + Seep 逆向工程工作台 —— 部署完备性体检与校验仪表盘 (System Health & Integrity Verifier) + 支持独立运行、双击运行、或由 Agent 调用以验证工作台是否完整就绪。 #> [CmdletBinding()] -param() +param( + [switch]$Detailed +) + +# 强制 UTF-8 编码输出,杜绝控制台中文乱码 +[Console]::OutputEncoding = [System.Text.Encoding]::UTF8 +$OutputEncoding = [System.Text.Encoding]::UTF8 $ScriptDir = Split-Path -Parent $MyInvocation.MyCommand.Path $Root = Split-Path -Parent $ScriptDir $ToolDir = Join-Path $Root 'Tool' -$ToolsDir = Join-Path $Root 'Tool\mcp\Tool\safe' # seep MCP 硬编码要求 +$ToolsDir = Join-Path $Root 'Tool\mcp\Tool\safe' $KbDir = Join-Path $Root 'Tool\mcp\Tool\reverselab\kb' $AgentDir = Join-Path $env:USERPROFILE '.pi\agent' -$script:Ok = 0 -$script:Bad = @() -$script:Manual = @() +$script:OkCount = 0 +$script:FailList = @() +$script:TodoList = @() -function Check($name, [scriptblock]$test, [string]$fix) { +function Test-CheckItem { + param( + [string]$Category, + [string]$ItemName, + [scriptblock]$Predicate, + [string]$Remedy + ) try { - $r = & $test - if ($r) { Write-Host (" [OK] {0}" -f $name) -ForegroundColor Green; $script:Ok++ } - else { Write-Host (" [FAIL] {0}" -f $name) -ForegroundColor Red; $script:Bad += "$name -> $fix" } + $passed = & $Predicate + if ($passed) { + Write-Host (" [√ PASS] {0}" -f $ItemName) -ForegroundColor Green + $script:OkCount++ + } else { + Write-Host (" [X FAIL] {0}" -f $ItemName) -ForegroundColor Red + $script:FailList += @{ Category = $Category; Name = $ItemName; Fix = $Remedy } + } } catch { - Write-Host (" [FAIL] {0} ({1})" -f $name, $_.Exception.Message) -ForegroundColor Red - $script:Bad += "$name -> $fix" + Write-Host (" [X FAIL] {0} (异常: {1})" -f $ItemName, $_.Exception.Message) -ForegroundColor Red + $script:FailList += @{ Category = $Category; Name = $ItemName; Fix = $Remedy } } } -function CheckManual($name, [scriptblock]$test, [string]$note) { +function Test-ManualItem { + param( + [string]$Category, + [string]$ItemName, + [scriptblock]$Predicate, + [string]$Guidance + ) try { - if (& $test) { Write-Host (" [OK] {0}" -f $name) -ForegroundColor Green; $script:Ok++ } - else { Write-Host (" [TODO] {0} ({1})" -f $name, $note) -ForegroundColor Yellow; $script:Manual += "$name -> $note" } + $passed = & $Predicate + if ($passed) { + Write-Host (" [√ PASS] {0}" -f $ItemName) -ForegroundColor Green + $script:OkCount++ + } else { + Write-Host (" [! OPTN] {0} ({1})" -f $ItemName, $Guidance) -ForegroundColor Yellow + $script:TodoList += @{ Category = $Category; Name = $ItemName; Note = $Guidance } + } } catch { - Write-Host (" [TODO] {0} ({1})" -f $name, $note) -ForegroundColor Yellow - $script:Manual += "$name -> $note" + Write-Host (" [! OPTN] {0} ({1})" -f $ItemName, $Guidance) -ForegroundColor Yellow + $script:TodoList += @{ Category = $Category; Name = $ItemName; Note = $Guidance } } } Write-Host @" -================================================================ - Seep 工作台 — 自检 -================================================================ - 根目录: $Root -"@ -ForegroundColor White +================================================================================ + Seep Reverse Lab — 工作台部署完备性校验与健康体检 (Verifier) +================================================================================ + 工作台物理根目录: $Root + 宿主操作系统环境: Windows $([Environment]::OSVersion.Version.ToString()) ($([IntPtr]::Size * 8)-bit) +"@ -ForegroundColor Cyan -# ---------------------------------------------------------------- 结构 -Write-Host "`n ---- 目录结构 ----" -ForegroundColor Cyan -Check 'Tool/ 存在' { Test-Path $ToolDir } '检查包是否完整解压' -Check 'Tool/skill/ 存在' { Test-Path (Join-Path $ToolDir 'skill') } '重新解压' -Check 'Tool/mcp/ 存在' { Test-Path (Join-Path $ToolDir 'mcp') } '重新解压' -Check 'Tool/prompts/ 存在' { Test-Path (Join-Path $ToolDir 'prompts') } '重新解压' -Check 'Tool/cases/ 存在' { Test-Path (Join-Path $ToolDir 'cases') } '重新解压' -Check 'Tool/docs/ 存在' { Test-Path (Join-Path $ToolDir 'docs') } '重新解压' -Check 'Tool/scripts/ 存在' { Test-Path (Join-Path $ToolDir 'scripts') } '重新解压' -Check 'Tool/upstream/ 存在'{ Test-Path (Join-Path $ToolDir 'upstream') } '重新解压' -Check 'seep MCP Tool/ 存在'{ Test-Path (Join-Path $ToolDir 'mcp\Tool') } '重新解压' +# ----------------------------------------------------------------------------- +# 1. 核心目录与包结构 +# ----------------------------------------------------------------------------- +Write-Host "`n[1/6] 📁 核心架构与工程目录树" -ForegroundColor White +Test-CheckItem "架构" "工作台主目录完整 (Tool/)" { Test-Path $ToolDir } "请检查是否完整解压或下载了 Seep 完整仓库" +Test-CheckItem "架构" "技能包目录完整 (Tool/skill/)" { Test-Path (Join-Path $ToolDir 'skill') } "检查 Tool/skill 是否存在" +Test-CheckItem "架构" "MCP服务引擎目录 (Tool/mcp/)" { Test-Path (Join-Path $ToolDir 'mcp') } "检查 Tool/mcp 是否存在" +Test-CheckItem "架构" "系统提示词层 (Tool/prompts/)" { Test-Path (Join-Path $ToolDir 'prompts') } "检查 Tool/prompts 是否存在" +Test-CheckItem "架构" "九大脱敏案例工程 (Tool/cases/)" { + $cases = Join-Path $ToolDir 'cases' + (Test-Path $cases) -and ((Get-ChildItem $cases -Directory).Count -ge 9) +} "检查 9 个项目案例目录是否存在" +Test-CheckItem "架构" "上游开源验证集 (Tool/upstream/)" { Test-Path (Join-Path $ToolDir 'upstream\apk-reverse') } "检查 apk-reverse 上游工程目录" +Test-CheckItem "架构" "MCP专用运行时强约定 (Tool/mcp/Tool/)" { Test-Path (Join-Path $ToolDir 'mcp\Tool') } "严禁重命名或搬移 Tool/mcp/Tool 目录" -# ---------------------------------------------------------------- 知识库 -Write-Host "`n ---- 知识库(seep_kb_* 依赖)----" -ForegroundColor Cyan -Check 'kb/ 有 ≥289 篇文章' { +# ----------------------------------------------------------------------------- +# 2. 知识库与战术资产 +# ----------------------------------------------------------------------------- +Write-Host "`n[2/6] 📚 攻防实战知识库与战术模板 (KB)" -ForegroundColor White +Test-CheckItem "知识库" "战术实战笔记 (289篇完整检索库)" { (Test-Path $KbDir) -and ((Get-ChildItem $KbDir -Recurse -Filter '*.md').Count -ge 280) -} 'Tool/mcp/Tool/reverselab/kb/ 缺失或不足' - -Check 'kb/tools/skills/mcp/ 有 3 个 MCP 源码' { +} "Tool/mcp/Tool/reverselab/kb/ 文件缺失,请确认完整拉取" +Test-CheckItem "知识库" "内置 MCP 源码组件 (ReverseLab/Ghidra/JSHook)" { $m = Join-Path $Root 'Tool\mcp\Tool\reverselab\tools\skills\mcp' (Test-Path $m) -and ((Get-ChildItem $m -Directory).Count -ge 3) -} 'reverselab 的 MCP 源码缺失' +} "reverselab 内置 MCP 源码组件缺失" -# ---------------------------------------------------------------- Skill -Write-Host "`n ---- Skill(安装后)----" -ForegroundColor Cyan -foreach ($s in @('softseep', 'apkseep', 'ida-reverse', 'client-license-validation-bypass')) { - Check "skill: $s" { Test-Path (Join-Path (Join-Path $AgentDir 'skills') $s) } '重跑 install-pi.ps1' -} -Check 'softseep 有 8 个 references' { - $r = Join-Path $AgentDir 'skills\softseep\references' +# ----------------------------------------------------------------------------- +# 3. 智能体提示词与多平台适配 +# ----------------------------------------------------------------------------- +Write-Host "`n[3/6] 🧠 智能体指令系统与运行时拦截扩展 (Prompts & Extensions)" -ForegroundColor White +Test-CheckItem "提示词" "Pi Agent 系统指令 (SYSTEM.md 已就绪且去个人化)" { + $p = Join-Path $ToolDir 'prompts\SYSTEM.md' + (Test-Path $p) -and (-not (Select-String -Path $p -Pattern '小π|主人' -Quiet)) +} "Tool/prompts/SYSTEM.md 不存在或包含未脱敏字符" +Test-CheckItem "提示词" "通用跨 Agent 规范 (AGENTS.md)" { Test-Path (Join-Path $ToolDir 'prompts\AGENTS.md') } "检查 AGENTS.md" +Test-CheckItem "提示词" "Claude Code 项目级规范 (CLAUDE.md 在项目根)" { Test-Path (Join-Path $Root 'CLAUDE.md') } "项目根缺失 CLAUDE.md" +Test-CheckItem "提示词" "DeepSeek Harness 配置文件 (DSH-PROFILE.md)" { Test-Path (Join-Path $Root 'DSH-PROFILE.md') } "缺失 DSH-PROFILE.md" +Test-CheckItem "扩展" "底层安全放行与 Lab 状态机扩展 (.ts)" { + Test-Path (Join-Path $ToolDir 'prompts\extensions\security-audit-interceptor.ts') +} "安全拦截扩展缺失,无法实现 lab: 状态机与防拒功能" + +# ----------------------------------------------------------------------------- +# 4. 技能系统完备性 (Skills System) +# ----------------------------------------------------------------------------- +Write-Host "`n[4/6] 🛠️ 逆向工程专业技能库 (Skills - 9大组件)" -ForegroundColor White +$localSkills = Join-Path $ToolDir 'skill' +Test-CheckItem "Skill" "核心总控调度器 (softseep 包含 8 大专题库)" { + $r = Join-Path $localSkills 'softseep\references' + (Test-Path (Join-Path $localSkills 'softseep\SKILL.md')) -and (Test-Path $r) -and ((Get-ChildItem $r -Filter '*.md').Count -ge 8) -} '重跑 install-pi.ps1' +} "softseep 或其 references 目录不完整" -# ---------------------------------------------------------------- 提示词 -Write-Host "`n ---- 提示词与扩展 ----" -ForegroundColor Cyan -Check 'SYSTEM.md' { Test-Path (Join-Path $AgentDir 'SYSTEM.md') } '重跑 install-pi.ps1' -Check 'AGENTS.md' { Test-Path (Join-Path $AgentDir 'AGENTS.md') } '重跑 install-pi.ps1' -Check '扩展 security-audit-interceptor.ts' { - Test-Path (Join-Path $AgentDir 'extensions\security-audit-interceptor.ts') -} '重跑 install-pi.ps1' +Test-CheckItem "Skill" "移动端逆向全链路 (apkseep 包含 45 篇规范与 56 脚本)" { + $r = Join-Path $localSkills 'apkseep\references' + $s = Join-Path $localSkills 'apkseep\scripts' + (Test-Path (Join-Path $localSkills 'apkseep\SKILL.md')) -and (Test-Path $r) -and (Test-Path $s) +} "apkseep 工程不完整" -# ---------------------------------------------------------------- MCP 配置 -Write-Host "`n ---- MCP 配置 ----" -ForegroundColor Cyan -$mcpPath = Join-Path $AgentDir 'mcp.json' -Check 'mcp.json 存在' { Test-Path $mcpPath } '重跑 install-pi.ps1' -if (Test-Path $mcpPath) { - $raw = Get-Content $mcpPath -Raw -Encoding UTF8 - Check 'mcp.json 无 残留' { $raw -notmatch '' } '手工替换占位符' - CheckManual 'mcp.json 无 残留' { $raw -notmatch '|' } '未装 IDA 时正常(见 MANUAL\IDA-PRO.md)' - CheckManual 'playwright token 已填' { $raw -notmatch '' } '不用浏览器自动化可忽略' - Check 'seep 条目已注册' { $raw -match '"seep"' } '手工添加或重跑 install-pi.ps1' +Test-CheckItem "Skill" "IDA Pro 自动化联动 (ida-reverse)" { + Test-Path (Join-Path $localSkills 'ida-reverse\SKILL.md') +} "ida-reverse 技能缺失" + +Test-CheckItem "Skill" "通用许可/卡密校验突破规范 (license-bypass)" { + Test-Path (Join-Path $localSkills 'client-license-validation-bypass\SKILL.md') +} "client-license-validation-bypass 技能缺失" + +Test-CheckItem "Skill" "独立战术安全技能包 (safe-skills 5组)" { + $ss = Join-Path $localSkills 'safe-skills' + (Test-Path $ss) -and ((Get-ChildItem $ss -Directory).Count -ge 5) +} "safe-skills 目录缺失或不足 5 个技能包" + +# 如果检测到用户本地的 Pi Agent 目录,则额外校验是否已同步部署到系统 +if (Test-Path $AgentDir) { + Test-ManualItem "部署" "Pi Agent 本地技能同步 (~/.pi/agent/skills/softseep)" { + Test-Path (Join-Path $AgentDir 'skills\softseep\SKILL.md') + } "已安装 Pi 但尚未部署,可运行 powershell -File setup\install-pi.ps1 完成同步" } -# ---------------------------------------------------------------- 外部工具 -Write-Host "`n ---- 外部工具 ----" -ForegroundColor Cyan -CheckManual 'radare2(seep_r2_* 依赖)' { - (Test-Path (Join-Path $ToolsDir 'radare2\bin\radare2.exe')) -or (Get-Command r2 -ErrorAction SilentlyContinue) -} '跑 setup\repair-tools.ps1 -Only radare2' +# ----------------------------------------------------------------------------- +# 5. MCP 自动化服务层与底层工具 (MCP & Native Tools) +# ----------------------------------------------------------------------------- +Write-Host "`n[5/6] 🔌 MCP 服务引擎与物理内置工具箱 (Native Tools)" -ForegroundColor White -CheckManual 'jadx(seep_apk_decompile 依赖)' { - (Test-Path (Join-Path $ToolsDir 'jadx\bin\jadx.bat')) -or (Get-Command jadx -ErrorAction SilentlyContinue) -} '跑 setup\repair-tools.ps1 -Only jadx' +Test-CheckItem "MCP" "核心服务端脚本 (seep_mcp_server.py 语法自洽)" { + $sp = Join-Path $ToolDir 'mcp\seep_mcp_server.py' + if (Test-Path $sp) { + $pyCmd = Get-Command python -ErrorAction SilentlyContinue + if ($pyCmd) { + & python -c "import ast; ast.parse(open(r'$sp', encoding='utf-8').read())" 2>&1 | Out-Null + $LASTEXITCODE -eq 0 + } else { $true } + } else { $false } +} "seep_mcp_server.py 丢失或存在 Python 语法解析错误" -CheckManual 'apktool(seep_apk_unpack 依赖)' { - (Test-Path (Join-Path $ToolsDir 'apktool\apktool.jar')) -or (Get-Command apktool -ErrorAction SilentlyContinue) -} '跑 setup\repair-tools.ps1 -Only apktool' +Test-CheckItem "工具箱" "Jadx 反编译引擎 (jadx-1.5.6 完整就绪)" { + $j = Join-Path $ToolsDir 'jadx\lib\jadx-1.5.6-all.jar' + $b = Join-Path $ToolsDir 'jadx\bin\jadx.bat' + (Test-Path $j) -and (Test-Path $b) +} "Jadx 缺失,请运行 powershell -File setup\repair-tools.ps1 -Only jadx 恢复" -CheckManual 'IDA Pro(ida MCP 依赖)' { +Test-CheckItem "工具箱" "Radare2 二进制全套工具 (r2/rabin2/radiff2/rasm2)" { + $r2 = Join-Path $ToolsDir 'radare2\bin\radare2.exe' + $rb = Join-Path $ToolsDir 'radare2\bin\rabin2.exe' + (Test-Path $r2) -and (Test-Path $rb) +} "Radare2 二进制套件缺失,请运行 setup\repair-tools.ps1 -Only radare2 恢复" + +Test-CheckItem "工具箱" "Apktool 资源拆解重构环境 (apktool.jar + bat)" { + $aj = Join-Path $ToolsDir 'apktool\apktool.jar' + $ab = Join-Path $ToolsDir 'apktool\apktool.bat' + (Test-Path $aj) -and (Test-Path $ab) +} "Apktool 环境缺失,请运行 setup\repair-tools.ps1 -Only apktool 恢复" + +Test-CheckItem "工具箱" "Frida/LSPosed 动态插桩模板库 (hook-mcp)" { + Test-Path (Join-Path $ToolsDir 'hook-mcp\templates') +} "hook-mcp 模板目录缺失" + +# 检查依赖包是否已经解压 (首次部署解压检查) +Test-CheckItem "依赖" "Web/JS 逆向调试引擎依赖已解压 (js-reverse-mcp/node_modules)" { + (Test-Path (Join-Path $ToolsDir 'js-reverse-mcp\node_modules')) -or + (Test-Path (Join-Path $ToolsDir 'js-reverse-mcp\node_modules.zip')) +} "未找到 js-reverse-mcp 依赖或压缩包" + +Test-CheckItem "依赖" "Playwright 浏览器自动化依赖已解压 (playwright-mcp/node_modules)" { + (Test-Path (Join-Path $ToolsDir 'playwright-mcp\node_modules')) -or + (Test-Path (Join-Path $ToolsDir 'playwright-mcp\node_modules.zip')) +} "未找到 playwright-mcp 依赖或压缩包" + +# ----------------------------------------------------------------------------- +# 6. 环境运行时与第三方依赖配置 +# ----------------------------------------------------------------------------- +Write-Host "`n[6/6] ⚙️ 外部运行时与商业授权协同 (Runtime & Commercial)" -ForegroundColor White +Test-CheckItem "运行时" "Python 解释器 (3.11+ 且可执行)" { + $py = Get-Command python -ErrorAction SilentlyContinue + $py -ne $null +} "系统未安装 Python 或未加入 PATH 环境变量,请安装 Python 3.11+" + +Test-ManualItem "协议" "Python mcp 协议库环境支持 (mcp>=1.20,<1.29)" { + $py = Get-Command python -ErrorAction SilentlyContinue + if ($py) { + & python -c "import mcp" 2>&1 | Out-Null + $LASTEXITCODE -eq 0 + } else { $false } +} "运行 pip install ""mcp>=1.20,<1.29"" 补齐协议支持" + +Test-ManualItem "商业软件" "IDA Pro 商业反编译器协同 (需自备独立授权)" { $found = $false - foreach ($c in @('D:\Tool\IDA Pro', 'C:\Program Files\IDA Pro', 'C:\IDA Pro')) { + foreach ($c in @('D:\Tool\IDA Pro', 'C:\Program Files\IDA Pro', 'C:\Program Files\IDA Professional 9.0', 'C:\IDA Pro')) { if (Test-Path (Join-Path $c 'ida.exe')) { $found = $true; break } } $found -} '未装则 ida MCP 不可用,用 seep_r2_* 替代(见 MANUAL\IDA-PRO.md)' +} "未检测到本地 IDA Pro,如无授权不影响核心链路,可阅读 MANUAL\IDA-PRO.md 使用 Radare2 自动降级" -# ---------------------------------------------------------------- Python -Write-Host "`n ---- Python 依赖 ----" -ForegroundColor Cyan -Check 'python 可用' { Get-Command python -ErrorAction SilentlyContinue } '安装 Python 3.11+ 并加入 PATH' -Check 'mcp 库可导入' { - & python -c "import mcp" 2>&1 | Out-Null - $LASTEXITCODE -eq 0 -} 'pip install "mcp>=1.20,<1.29"' -CheckManual 'pytest 可用' { - & python -m pytest --version 2>&1 | Out-Null - $LASTEXITCODE -eq 0 -} 'pip install pytest' +Test-ManualItem "配置" "Claude Code 项目级 MCP 注册 (.mcp.json 在根目录)" { + Test-Path (Join-Path $Root '.mcp.json') +} "根目录已备好 .mcp.json,在根目录直接执行 claude 即可免配加载" -# ---------------------------------------------------------------- seep MCP 启动 -Write-Host "`n ---- seep MCP 启动测试 ----" -ForegroundColor Cyan -$seepPy = Join-Path $ToolDir 'mcp\seep_mcp_server.py' -if (Test-Path $seepPy) { - Check 'seep_mcp_server.py 语法可解析' { - & python -c "import ast,sys; ast.parse(open(r'$seepPy',encoding='utf-8').read())" 2>&1 | Out-Null - $LASTEXITCODE -eq 0 - } '文件损坏,重新解压' -} else { - Write-Host ' [FAIL] seep_mcp_server.py 不存在' -ForegroundColor Red - $script:Bad += 'seep_mcp_server.py 缺失 -> 重新解压' +# ----------------------------------------------------------------------------- +# 汇总仪表盘 +# ----------------------------------------------------------------------------- +Write-Host "`n================================================================================" -ForegroundColor White +Write-Host (" [体检报告] 核心检查通过: {0} 项" -f $script:OkCount) -ForegroundColor Green + +if ($script:FailList.Count -gt 0) { + Write-Host ("`n [!] 发现异常阻断项 ({0} 项):" -f $script:FailList.Count) -ForegroundColor Red + foreach ($err in $script:FailList) { + Write-Host (" * [{0}] {1}" -f $err.Category, $err.Name) -ForegroundColor Red + Write-Host (" -> 整改建议: {0}" -f $err.Fix) -ForegroundColor Gray + } } -# ---------------------------------------------------------------- 脱敏复检 -Write-Host "`n ---- 脱敏复检(案例层)----" -ForegroundColor Cyan -$cases = Join-Path $ToolDir 'cases' -if (Test-Path $cases) { - Check '案例层无产品名残留' { - -not (Select-String -Path (Join-Path $cases '*\*') -Pattern 'xyplorer|mumu|bandizip|idman|listary|snipaste|startallback|crystalidea|netease' -Quiet -ErrorAction SilentlyContinue) - } '包被污染,请重新获取' +if ($script:TodoList.Count -gt 0) { + Write-Host ("`n [*] 可选/建议关注项 ({0} 项):" -f $script:TodoList.Count) -ForegroundColor Yellow + foreach ($todo in $script:TodoList) { + Write-Host (" * [{0}] {1}" -f $todo.Category, $todo.Name) -ForegroundColor Yellow + Write-Host (" -> 说明/指南: {0}" -f $todo.Note) -ForegroundColor Gray + } } -# ---------------------------------------------------------------- 汇总 -Write-Host "`n=================================================================" -ForegroundColor White -Write-Host (" 通过 {0} 项" -f $script:Ok) -ForegroundColor Green -if ($script:Bad.Count -gt 0) { - Write-Host (" 失败 {0} 项:" -f $script:Bad.Count) -ForegroundColor Red - $script:Bad | ForEach-Object { Write-Host " - $_" -ForegroundColor Red } -} -if ($script:Manual.Count -gt 0) { - Write-Host (" 待手工 {0} 项:" -f $script:Manual.Count) -ForegroundColor Yellow - $script:Manual | ForEach-Object { Write-Host " - $_" -ForegroundColor Yellow } -} +Write-Host "================================================================================" -ForegroundColor White -if ($script:Bad.Count -eq 0 -and $script:Manual.Count -eq 0) { - Write-Host "`n READY" -ForegroundColor Green - Write-Host " 下一步: 重启 pi -> 输入 lab:" -ForegroundColor Cyan - exit 0 -} elseif ($script:Bad.Count -eq 0) { - Write-Host "`n 部分就绪(核心可用,待手工项不影响主链路)" -ForegroundColor Yellow - Write-Host " 下一步: 重启 pi -> 输入 lab:" -ForegroundColor Cyan +if ($script:FailList.Count -eq 0) { + Write-Host "`n 🎉 结论: 工作台处于 [READY / 完备就绪] 状态!" -ForegroundColor Green + Write-Host " 您可以直接在 Agent (Pi / Claude / DSH / Codex) 中发送: lab: 开启测试!`n" -ForegroundColor Cyan exit 0 } else { - Write-Host "`n 未就绪 —— 请先解决失败项" -ForegroundColor Red + Write-Host "`n ❌ 结论: 当前工作台存在未满足的核心依赖,请按照上述红色整改建议修复。`n" -ForegroundColor Red exit 1 }