Files
Artemis-Plugins/plugins/artemis-device-test/skill/references/environment-repair.md
T

224 lines
23 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 工具安装、环境确认与修复手册
本手册用于同事首次部署、迁移电脑以及处理具体工具调用故障。与 [团队部署](team-setup.md)、[工具路由](tool-routing.md)、[有界 CLI](cli-tools.md) 配合使用。这里只分发通用方法、配置格式和已验证的修复经验;工具程序、驱动、私人运行环境、凭据和现场证据由各机器自行准备。
已授权安装或修复当前用例所需工具时,可按下面流程继续,不必逐步重复审批。先复用可用安装;只处理当前必需的缺口,不因工具清单中有某项就安装整套软件。系统管理员权限、许可证、下载权限和人工登录仍按本机及产品要求处理。安装器、驱动安装、服务重载和设备操作不能混成一次“doctor 自动修复”。
## 1. 先确定故障在哪一层
| 层次 | 检查与记录 | 不能据此推出的结论 |
| --- | --- | --- |
| 包与文件 | 来源、包摘要、可执行文件/解释器/DLL 的实际路径 | 有 ZIP、安装 EXE 或文件名就表示已安装 |
| 运行时 | 版本/帮助能运行,DLL 或 Python 模块能加载 | 工具已能连接目标设备 |
| 本地功能 | 人造媒体、签名样本、已有脱敏抓包能解析 | 真机媒体质量或安全用例通过 |
| 连接与会话 | 当前网卡/COM、Android 设备、MCP、GUI、网站会话可用 | 已登录、目标权限充分或设备身份一致 |
| 业务 | 当前用例的实际动作、独立断言与证据 | 启动成功、退出码 0、任务完成就等于 PASS |
按最早失败的层次修复,再复测同一层。没有证据定位原因时保留错误和待查项,不通过改超时、重复安装或切换整套环境掩盖问题。`manual-interface` 表示要走真实 GUI/网页;`mcp-check-required` 表示要检查 MCP,它们都不是“缺少 EXE”。
以下版本是打包前的兼容性验证记录,**不是要求团队一律安装这些旧版本,也不是最新版推荐**。更换版本后须在本机复测相应能力。
| 工具/环境 | 已验证范围 | 尚未覆盖 |
| --- | --- | --- |
| FFmpeg/ffprobe,2023-12-18 构建 | 本地 1 秒、160×120、5 帧样本生成/解析/解码;另有原流 RTSP 元数据读取 | 连续码率、GOP、画音质量和其他格式 |
| Wireshark/TShark/dumpcap 4.6.3,Npcap 1.72 | 版本、接口枚举、一次有界采集及离线解析 | 新机器驱动安装、GUI 操作、完整通信安全断言 |
| Nmap 7.60 | 帮助、版本及本机单端口 TCP connect 调用 | 全端口、UDP、服务身份及设备安全结论 |
| Binwalk 2.3.2+独立 Python 3.11 | 正式 `firmware-scan` 识别人造 gzip 签名;真实固件扫描完成但未检出签名 | 真实固件完整分析、提取器依赖、解包与加密验收 |
| MediaInfoLib 21.09+匹配位数的 Python | 正式 `media-info` 解析本地样本;在两种 Python 运行环境复测 | GUI、所有格式或操作系统级断网隔离 |
| PowerShell 串口采集 | 明确参数下的被动收取;单独现场诊断曾确认基础双向收发 | 通用自动登录、shell 命令、SecureCRT GUI 全流程 |
| 配置工具 V2.0.5 | 包与实际 EXE 一致、启动、版本控件读取;独立适配器只读身份查询 | GUI 搜索、参数设置和升级全流程 |
| mainThread | 包获取、完整解压、启动与查询入口识别 | 查询权限、周期数据/拓扑返回及原用例“杭研软件”对应关系 |
| Artemis 1.5.2+观察修复补丁 | 真实只读观察、笔记复核和正常结算 | 全部手机业务;不能把此前源码全套检查描述为全绿 |
## 2. 目录、安装器与解压
示例均使用团队占位目录,须替换为本机位置:`D:/TeamTools` 放工具,`D:/TeamConfig` 放私有配置,`D:/TeamEvidence` 放本机结果。Skill 根目录保持独立。不要将其他同事的 venv、MCP 配置、设备资料、登录会话或历史输出目录整个复制过来。
1. 核对当前已有安装的实际路径和版本,避免只看压缩包名称。记录包的 `Get-FileHash -Algorithm SHA256`;有供应方可信摘要或签名时核对来源,只有自行计算的摘要不能证明供应方真实性。
2. 对 ZIP/7z 先查看成员,确认预期入口、依赖目录及体积;不接受逃逸目标目录的绝对路径、`..` 或不明链接。解压到新的版本目录,保留旧版本。不要只取单个 EXE,Qt 插件、DLL、配置及资源目录通常需要一起保留。
3. ZIP 使用 `Expand-Archive`;7z 使用已安装且可信的 7-Zip。示例目标目录应尚不存在,避免覆盖现有环境:
```powershell
Get-FileHash -LiteralPath 'D:/TeamTools/packages/tool.zip' -Algorithm SHA256
Expand-Archive -LiteralPath 'D:/TeamTools/packages/tool.zip' -DestinationPath 'D:/TeamTools/portable/tool-version'
& 'D:/TeamTools/7-Zip/7z.exe' l 'D:/TeamTools/packages/tool.7z'
& 'D:/TeamTools/7-Zip/7z.exe' x 'D:/TeamTools/packages/tool.7z' '-oD:/TeamTools/portable/tool-version'
```
4. 必须安装的产品使用供应方正式安装器;参数按该版本说明,不猜静默开关。Windows UAC 和许可证由具备权限的使用者处理。不要运行压缩包中的激活器、破解程序或与当前工具无关的安装器。
5. 将最终执行路径写入本机 profile,再进行版本和本地样本检查。`--tool-root` 不会解压包,安装器也不能填成 `tools` 的运行入口。
上面的解压命令是部署模板,不是已在每个团队工具包上执行过的安装记录。默认不改全局 PATH;显式 profile 更容易复核实际用了哪个版本。
## 3. 基础 Python、PowerShell 与 profile
轻量脚本使用 Python 3.10+ 标准库;Binwalk 2.3.2 另用 Python 3.11;Artemis 1.5.2 的项目要求是 Python 3.12+,由其自身 `.venv` 管理。这三者可以共存,不为修复一个工具降级 Artemis 的解释器。
从 Skill 根目录检查,`python` 可替换为本机绝对解释器路径:
```powershell
python -c "import sys, struct; print(sys.version); print(struct.calcsize('P') * 8)"
python -X utf8 scripts/tool_runner.py --help
python -X utf8 scripts/tool_runner.py --tool-root 'D:/TeamTools' list
python -X utf8 scripts/tool_runner.py --profile 'D:/TeamConfig/tools.local.json' doctor
python -X utf8 scripts/tool_runner.py --profile 'D:/TeamConfig/tools.local.json' doctor --check-versions
```
`doctor` 只发现路径;`--check-versions` 才实际运行已定位程序的版本/帮助或加载检查。盘点整体退出0也可能仍有缺项,逐工具核对 availability 和 version_check,再跑对应本地样本。`--profile`、`--tool-root`、`--timeout`、`--dry-run` 放在子命令前。参照 [CLI 配置](cli-tools.md#配置与盘点) 填写 `tools`、`runtimes.binwalk_python` 和 `libraries.mediainfo`;路径可以相对 profile 所在目录,不接受命令串或额外参数。
PowerShell 已验证 Windows PowerShell 5.1 和 PowerShell 7 的基础串口类型。若 5.1 报自带 `Get-FileHash` 无法自动加载,先检查模块是否存在;历史案例通过显式导入其自带模块恢复:
```powershell
Import-Module Microsoft.PowerShell.Utility
Import-Module Microsoft.PowerShell.Security
Get-Command Get-FileHash
```
这只处理相同模块加载问题,不解决 COM 驱动或端口占用。脚本执行策略阻止运行时按组织策略解决,不能自动改为绕过策略。中文 Skill 校验遇到 GBK 解码失败时使用 `python -X utf8`,不改文档为本机编码。
## 4. FFmpeg / ffprobe:先用本地样本
从批准来源取得匹配 Windows 架构的完整构建,解压后在 profile 分别配置 `ffmpeg.exe`、`ffprobe.exe`。如果包名和 `-version` 不一致,以实际调用输出为准;原资料中的“ffmg”尚未最终确认,只将 FFmpeg/ffprobe 标为已采用的可比能力。
下列命令重用已成功的方法,生成无设备信息的样本。先创建本机证据目录;输出必须是新文件,`-n` 不覆盖已有文件:
```powershell
& 'D:/TeamTools/ffmpeg/bin/ffmpeg.exe' -nostdin -n -hide_banner -f lavfi -i 'testsrc=size=160x120:rate=5' -t 1 -c:v mpeg4 -pix_fmt yuv420p 'D:/TeamEvidence/local-video-sample.mp4'
python -X utf8 scripts/tool_runner.py --profile 'D:/TeamConfig/tools.local.json' probe --input 'D:/TeamEvidence/local-video-sample.mp4'
& 'D:/TeamTools/ffmpeg/bin/ffmpeg.exe' -nostdin -hide_banner -i 'D:/TeamEvidence/local-video-sample.mp4' -f null -
```
检查生成成功、实际尺寸 160×120、帧率 5/1、约 1 秒及解码 5 帧。失败时依次核对执行路径、DLL/构建依赖、输入文件和输出权限。RTSP 阶段另需当前明确的流地址和权限;用 `probe --rtsp-env <变量名>`,不要把认证 URL 放进 profile、聊天或报告。元数据正常之后再按用例获取帧级与持续测量证据。
## 5. Wireshark / TShark / dumpcap 与 Npcap
保留 Wireshark 完整目录,将 `tshark.exe` 和 `dumpcap.exe` 分别配置到 profile。读取已有 pcap 与现场捕获是不同能力:TShark 能离线分析不证明 Npcap 已安装,dumpcap 能显示版本不证明当前账户能抓包。
```powershell
& 'D:/TeamTools/Wireshark/tshark.exe' --version
& 'D:/TeamTools/Wireshark/dumpcap.exe' -D
Get-Service -Name npcap -ErrorAction SilentlyContinue
python -X utf8 scripts/tool_runner.py --profile 'D:/TeamConfig/tools.local.json' analyze-pcap --input 'D:/TeamEvidence/sample.pcapng'
```
无接口或加载驱动失败时,先区分程序依赖、Npcap 驱动、服务状态和当前账户权限。使用已批准的 Wireshark/Npcap 安装器按产品说明安装或修复驱动;不要把 ZIP 解压当作驱动安装,不盲装旧 WinPcap,也不因 Nmap 包带驱动而覆盖当前可用 Npcap。管理员专用访问策略按组织要求处理。
历史机器在 Npcap 1.72 下完成接口枚举和有界采集,但没有验证一套通用于所有机器的无人值守驱动安装流程。修复后先重查接口,再对当前授权的单个目标、指定接口做短时 `capture`,随后 `analyze-pcap` 回读。接口编号可能变化,不能照抄其他机器的编号;空抓包可能是接口、采集位置、过滤条件或时间窗问题,不能直接判断设备没有通信。
运行器固定 `snaplen=256`,现场采集最多 600 秒、100 MiB。只抓到截断包不够做完整应用负载或所有安全断言;扩大取证范围应回到具体用例设计。
Nmap 使用实际 `nmap.exe` 的 `--version` 检查运行时。现有 `scan` 只支持单个明确 IP、最多 128 个明确 TCP 端口的 connect 扫描;不要为环境验证扫描整个局域网。安装包版本不能代替执行版本,端口聚合或超时仍需检查覆盖度。
## 6. Binwalk:固定 Python 3.11 的隔离环境
已验证的 2.3.2 源码使用 `imp`,直接放到 Python 3.12+ 会失败。仅解压源码也可能因缺少发行元数据而无法显示版本。正确方向是在独立 Python 3.11 venv 内安装已核验的源码,profile 指向该 venv 的 Python,而非改全局 Python 或设置全局 `PYTHONPATH`。
```powershell
& 'D:/TeamTools/Python311/python.exe' -m venv 'D:/TeamTools/binwalk-env'
& 'D:/TeamTools/binwalk-env/Scripts/python.exe' -m pip --version
```
新 venv 目录应尚不存在。团队可以从批准的离线 wheel 仓库准备构建依赖后安装已审核源码;这条 pip 路径是可复用部署方案,须在本机验证:
```powershell
& 'D:/TeamTools/binwalk-env/Scripts/python.exe' -m pip install --no-index --find-links 'D:/TeamTools/packages/wheels' setuptools wheel
& 'D:/TeamTools/binwalk-env/Scripts/python.exe' -m pip install --no-index --no-build-isolation --no-deps 'D:/TeamTools/sources/binwalk-2.3.2'
```
历史修复中离线 pip 因缺 `bdist_wheel` 失败,最终在检查过源码后用该源码的 `setup.py install` 安装到同一隔离 venv,正式命令复测成功。若必须复现这条兼容路径,只在准确的 2.3.2 源码目录内执行,安装代码仍须可信;不要自动运行外层包附带的其他 Python 安装器:
```powershell
Push-Location 'D:/TeamTools/sources/binwalk-2.3.2'
try {
& 'D:/TeamTools/binwalk-env/Scripts/python.exe' setup.py install
} finally {
Pop-Location
}
```
配置 `runtimes.binwalk_python` 为 `D:/TeamTools/binwalk-env/Scripts/python.exe` 后,用 runner 的 `doctor --check-versions` 与 `firmware-scan --input <本地签名样本>` 复测。正式入口固定为 `python -I -m binwalk`;运行器另设临时用户配置目录,避免加载现有用户插件。不要复制历史临时补元数据目录,也不要以 Python 文件存在就认定模块可用。
此处只解决签名扫描。未准备外部提取器时标记相关能力缺失,不添加 `-e` 或执行扫描产物。解包失败、高熵或找不到字符串都不能证明设备 Flash 已加密;`firmware_encrypt` 必须另取匹配 SDK 的专用程序。
## 7. MediaInfo:Python 位数、DLL 与固定接口
从已批准的 MediaInfo 包保留 DLL 及必要依赖,在 `libraries.mediainfo` 填写实际 `MediaInfo.dll` 路径。位数匹配对象是**运行 tool_runner 的 Python 进程**,仅知道 Windows 是 64 位不够。
```powershell
python -c "import struct; print(struct.calcsize('P') * 8)"
python -X utf8 scripts/tool_runner.py --profile 'D:/TeamConfig/tools.local.json' doctor --check-versions
python -X utf8 scripts/tool_runner.py --profile 'D:/TeamConfig/tools.local.json' media-info --input 'D:/TeamEvidence/local-video-sample.mp4'
```
DLL 已找到但加载失败时检查 32/64 位、缺失依赖、文件来源与版本;不要改成调用 MediaInfo GUI 或任意复制 DLL 到系统目录来掩盖失败。正式命令在有时限子进程内调用固定 API,已验证 21.09 的样本结果为 160×120、5 帧、5 fps、1000 ms;Duration 单位是毫秒,ffprobe 通常是秒。
21.09 中 `Internet="No"` 会启用该选项。分发脚本已改为设置空字符串并回读 `Internet_Get` 确认关闭,同时拒绝直接 URL/UNC 输入。不要改回 `No`,也不要绕过此校验;无法确认时保留失败。该 DLL 配置不是操作系统级网络隔离的证明。
## 8. SecureCRT、串口驱动与无数据排查
SecureCRT 使用合法可用的原产品。只需被动日志时可采用已封装的 PowerShell 路径,无须为它安装 pySerial。USB 转串口驱动按实际转接器硬件 ID、供应方和系统架构选用;不要猜测为 CH340、CP210x 或其他型号。
```powershell
[System.IO.Ports.SerialPort]::GetPortNames()
Get-CimInstance Win32_SerialPort | Select-Object DeviceID, Name, PNPDeviceID
```
记录本机 COM 和驱动状态,确认供电、电平、共地、TX/RX、波特率和流控与现场已正常会话一致。运行器使用 8N1、无流控,默认 DTR/RTS 关闭;输出同时保存时间戳文本及 `.raw.bin`,路径必须为新文件。端口被 SecureCRT 或其他任务占用时保留占用结果,由当前持有者正常释放,不能抢占。
无数据时先核对连接和设备输出条件。历史现场按已确认的终端会话显式启用 DTR/RTS 后收到数据,但不能认定控制线是唯一原因,也不能把它设为所有设备默认值。确实需要且已确认其电气含义时才在 `serial` 命令加入 `--dtr-enable` / `--rts-enable`;它们不是硬件握手选项,部分设备用控制线复位。`profile.serial` 仅供环境记录,不会隐式改变运行器参数。
端口打开、收到日志、双向字符收发、认证成功和可用 shell 分别验收。历史一次诊断观察到用户名后返回密码提示,但没有确认 shell;通用 Skill 因而仍只提供被动采集,不包含自动登录或任意命令发送。不得将该现场诊断脚本及其目标参数复制为团队默认工具,也不循环猜测凭据。
## 9. 内部配置工具 V2.0.5、mainThread 与 GUI 宿主
配置工具按内部正式来源取得 V2.0.5 完整包,验证实际 EXE 与包内文件一致。保留 Qt/DLL/资源目录,在窗口版本控件复核 `V2.0.5 Build:2026041414`,避免误启旧版本。程序启动及控件可见已验证;独立 `device_adapter.py info` 的只读身份结果不经过 GUI,不能作为 GUI 设备发现成功证据。参数配置仍走实际界面或已验证协议,不能猜测视频参数命令。
mainThread 为实际“端侧数据采集工具.exe”的 PyQt 原生程序。通过内部授权的分发渠道取包和手册,登录下载由使用者完成;完整解压并验证能显示主菜单。未签名或无文件版本时只能记录事实,归档 CRC/SHA256 不能代替供应方身份核验。
只读入口为“进入查询端侧数据采集功能”,可查询周期数据、拓扑和已有日志地址。实际控件定位参见 [工具路由](tool-routing.md),对象名是静态线索,必须重看本机窗口。主菜单或查询页没有 CoAP 监听不等于故障;“进入本地调试功能”、自检、开启日志上报属于不同的设备动作。不要提取程序内部鉴权信息或绕过 GUI 猜后台接口。
GUI 环境按以下次序检查:
1. 宿主是否提供原生 Windows 控制。只有浏览器能力时,不能操作 Windows 客户端;这是控制能力缺口,不是客户端未安装。
2. 当前目标窗口是否仍有效、位于可交互会话、可观察控件/截图;重新选择实际窗口后再输入,不沿用旧坐标或盲按回车。
3. 应用与控制器权限是否相容。已观察的移动视联 2.3.12 manifest 要求管理员权限,普通权限控制器可能无法输入;采用产品支持的权限方案,不修改 manifest 或绕过系统边界。
4. 控制宿主本身是否失败。曾出现 `failed to write kernel assets`、捕获超时与 `coordinate input geometry is unavailable`。恢复一个已准确定位的缺失临时目录曾恢复窗口文本读取,但未修复截图/点击,之后另一次运行时仍失败。此经验不是可普遍自动执行的修复脚本,不能猜目录或复制其他会话资产。
保存工作及原始错误后,可以按宿主支持方式重载相关运行时或重启应用,再复测;不能保证重启解决。相同权限窗口也发生过截图超时,移动视联权限差异不能解释全部故障。多显示适配器只有待查线索,不能据此禁用显卡、远控、显示驱动或改系统安全设置。未恢复控制时,转为人工界面操作加证据交接,并标注未完成 GUI 自动化。
## 10. 网站、登录与专用依赖
客诉系统、联楹(连楹)、移动视联采用“人工登录 → 观察业务页和目标权限 → 继续自动操作”。先连接使用者实际已登录的浏览器/客户端会话,不能打开一个新空会话后判断整台电脑未登录。账号、密码、验证码、短信及协议由使用者完成;代理不代填、不读取账号统计表、不导出 cookie。当前授权范围明确后,登录后的查询及取证无需逐步再确认。
报告分别写“等待人工登录”“登录状态未确认”“已登录但目标权限不足”“控制通道故障”。`queued` 的打开请求不是页面已显示;无法观察浏览器也不是登录失败。历史见过登录页仅说明当时入口可达,不保证当前权限。
老 DM、软探针、算法 OTA 与其他内部后台按实际产品、环境和文档配置。找不到入口/权限时只阻塞依赖它们的阶段,不拿客诉网站代替全部后台。路由器从当前测试环境明确入口,修改前保存参数并准备回读/恢复;能访问登录页不代表配置已验收。`firmware_encrypt` 仍需要符合原用例 SDK 版本要求的程序和说明,旧 SDK 或 Binwalk 都不能替代。
## 11. Artemis 1.5.2、MCP 与修复基线
本 Skill 不携带 Artemis 主程序、Python venv 或模型密钥。团队试用的可复现基线为 **Artemis v1.5.2,提交 `bdc75d0c657c5c2707b4c6e352eed6a1f5c14fff`,以及单独的观察任务修复补丁**。补丁适用性检查、应用与回退见 [Artemis 补丁说明](artemis-patch.md);不得给其他版本盲套补丁,也不能仅更新 Skill 就认为 Artemis 已修复。
在批准的 Artemis 源码/发行目录中,按该版本 README 部署。1.5.2 的 Windows 正式入口为 `start.bat` / `start-cn.bat`,支持 `-SetupOnly`;这些脚本会检查或下载依赖并安装/更新 Codex MCP,属于环境变更,不是只读命令。已有可用环境则直接核对项目 venv、版本和配置,避免无因重装。
```powershell
Set-Location 'D:/TeamTools/Artemis'
.\start-cn.bat -SetupOnly
uv run artemis doctor
uv run artemis mcp --help
uv run artemis mcp --install codex
```
准备环境和手动 MCP 安装是按缺口选择的步骤,不要求每次都重复执行。由该项目生成本机 MCP 配置,使用项目 `.venv` 的 `python -m mcp_server` 或 `uv run artemis mcp`;不要分发开发者配置中的绝对路径。安装/更新后正常重载 MCP 或重启宿主,使新进程和工具签名生效。升级脚本会停止当前项目的服务、MCP 和任务,须在队列空闲且已保存工作时按版本说明使用;不能把升级当作运行中任务的无影响修复。
模型地址、Key 和模型名由使用者在 Artemis 本机设置或 `.env` 配置,不从聊天收集或写入 Skill。`mobile_workspace()` 核对 Android 设备和队列,首次调用 `mobile_diagnose(device_serial=...)`;仅认证异常才增加凭据验证,仅观察链异常才增加设备探测。诊断的修复选项可能重启 ADB 或调整设备锁,先根据真实失败和当前队列决定,不能习惯性全部开启。
scrcpy 诊断与实际录屏不一致时,先检查安装路径与长期驻留进程缓存。已知补丁补齐了标准安装路径;新进程识别成功后正常重载 MCP,不因旧进程仍报缺失就重复安装。ADB 设备未授权、离线、多实例或端口冲突按 doctor 的具体结果处理,不任意结束共享 ADB/模拟器进程。
最后以“只观察当前 APP 页面、保存实际文字和截图、正常结束并由 Checker 复核”的小任务验收连接。使用 [手机工作流](artemis-workflow.md) 的真实工具签名,显式选择设备;手机序列号与摄像机 SN 分开核验。历史补丁相关回归与一次真实只读观察已通过;完整源码测试仍有已记录失败,不能宣称全套通过。新电脑仍需完成自己的连接与样本任务验证,任务 `completed` 和目标级 `passed` 也不能扩展成多条摄像机业务通过。
## 12. 修复后的交接
仅记录本次实际改变:工具与版本、安装来源及摘要、解释器/DLL 位数、profile 字段、复测命令类别、执行状态、证据位置和未解决项。机器私有路径及设备资料留在本机运行记录,发布包只保留通用示例。不要带入开发机的原始日志、固件、pcap、截图、账号文件或历史任务报告。
按“运行时可用 → 本地样本通过 → 连接/登录就绪 → 业务断言取证”逐层交接。某个 GUI、平台或 SDK 仍阻塞时,继续已就绪且独立的工具环节;联合报告通过 [证据契约](evidence.md) 关联真实 Artemis 导出与外部材料,不改写原生 trace 或把环境修复成功写成业务用例通过。