🎁 福利专区全网大模型免费应用 + 新用户福利 + 注册活动入口,低成本玩转 AI

验证取证 alexzeng666/dsh-verify

DeepSeek Harness
alexzeng66613 天前有提交已提供中文文档扫描:含敏感能力

运行程序并留存退出码、日志与崩溃栈等可核对证据

29.6/100
综合分
0
GitHub 星标
—
npm 周下载
—/5
用户评分

数据截至 2026/10/23 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。

安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add alexzeng666/dsh-verify
该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:仅索引
是什么
dsh 原生插件 · dev
装得上吗
本站尚未做安装检查
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 13 天前
档位由哪些信号合成

本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。

验证判据与等级说明 →
社区实装还没有人打卡 · 装过的第一个就是你
安全扫描自动 · 静态分析源码
v2.7.0
🔵 扫描:含敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。

可执行外部命令读写/删除本地文件
查看扫描证据(共 80 处,展示前 75 条)
  • 读取本地文件
    packages/dsh-crashlab/src/dwarf.js:34
    if (existsSync(candidate)) return candidate;
  • 执行外部命令来自配置/变量
    packages/dsh-crashlab/src/dwarf.js:41
    execFile(
  • 读取本地文件
    packages/dsh-crashlab/src/dwarf.js:86
    if (!module?.path || !existsSync(module.path)) continue;
  • 执行外部命令固定命令
    packages/dsh-crashlab/src/eventlog.js:54
    execFile(
  • 读取本地文件
    packages/dsh-crashlab/src/fragment.js:32
    const text = readFileSync(file, 'utf8');
  • 写入本地文件
    packages/dsh-crashlab/src/fragment.js:64
    mkdirSync(dir, { recursive: true });
  • 写入本地文件
    packages/dsh-crashlab/src/fragment.js:65
    appendFileSync(join(dir, file), `${JSON.stringify(entry)}\n`, 'utf8');
  • 读取本地文件
    packages/dsh-crashlab/src/fragment.js:75
    if (!existsSync(path)) return [];
  • 读取本地文件
    packages/dsh-crashlab/src/fragment.js:78
    for (const line of readFileSync(path, 'utf8').split('\n')) {
  • 写入本地文件
    packages/dsh-crashlab/src/fragment.js:149
    mkdirSync(dir, { recursive: true });
  • 读取本地文件
    packages/dsh-crashlab/src/helper.js:24
    return process.platform === 'win32' && existsSync(helperPath());
  • 读取本地文件
    packages/dsh-crashlab/src/helper.js:30
    if (!existsSync(exe)) {
  • 执行外部命令来自配置/变量
    packages/dsh-crashlab/src/helper.js:34
    execFile(
  • 读取本地文件
    packages/dsh-crashlab/src/index.js:220
    if (!existsSync(dumpPath)) throw new Error(`dump not found: ${dumpPath}`);
  • 读取本地文件
    packages/dsh-crashlab/src/index.js:452
    if (existsSync(leftover) && !detail.dump_path) unlinkSync(leftover);
  • 删除本地文件
    packages/dsh-crashlab/src/index.js:452
    if (existsSync(leftover) && !detail.dump_path) unlinkSync(leftover);
  • 读取本地文件
    packages/dsh-probe/src/fragment.js:32
    const text = readFileSync(file, 'utf8');
  • 写入本地文件
    packages/dsh-probe/src/fragment.js:64
    mkdirSync(dir, { recursive: true });
  • 写入本地文件
    packages/dsh-probe/src/fragment.js:65
    appendFileSync(join(dir, file), `${JSON.stringify(entry)}\n`, 'utf8');
  • 读取本地文件
    packages/dsh-probe/src/fragment.js:75
    if (!existsSync(path)) return [];
  • 读取本地文件
    packages/dsh-probe/src/fragment.js:78
    for (const line of readFileSync(path, 'utf8').split('\n')) {
  • 写入本地文件
    packages/dsh-probe/src/fragment.js:137
    mkdirSync(dir, { recursive: true });
  • 读取本地文件
    packages/dsh-probe/src/helper.js:30
    return process.platform === 'win32' && existsSync(hostPath()) && existsSync(dllPath());
  • 读取本地文件
    packages/dsh-probe/src/helper.js:41
    if (!existsSync(host)) {
  • 执行外部命令来自配置/变量
    packages/dsh-probe/src/helper.js:58
    execFile(
  • 读取本地文件
    packages/dsh-probe/src/helper.js:95
    if (!existsSync(host)) {
  • 读取本地文件
    packages/dsh-probe/src/helper.js:100
    if (!existsSync(dll)) {
  • 执行外部命令来自配置/变量
    packages/dsh-probe/src/helper.js:123
    execFile(
  • 读取本地文件
    packages/dsh-probe/src/index.js:250
    trace_path: existsSync(tracePath) ? tracePath : undefined,
  • 读取本地文件
    packages/dsh-probe/src/index.js:260
    evidence: existsSync(tracePath) ? [tracePath] : [],
  • 读取本地文件
    packages/dsh-probe/src/index.js:452
    log_path: existsSync(logPath) ? logPath : undefined,
  • 读取本地文件
    packages/dsh-probe/src/index.js:455
    evidence: existsSync(logPath) ? [logPath] : [],
  • 读取本地文件
    packages/dsh-quota/src/fragment.js:33
    const text = readFileSync(file, 'utf8');
  • 写入本地文件
    packages/dsh-quota/src/fragment.js:71
    mkdirSync(dir, { recursive: true });
  • 写入本地文件
    packages/dsh-quota/src/fragment.js:72
    appendFileSync(join(dir, file), `${JSON.stringify(entry)}\n`, 'utf8');
  • 写入本地文件
    packages/dsh-quota/src/fragment.js:109
    mkdirSync(dir, { recursive: true });
  • 读取本地文件
    packages/dsh-quota/src/index.js:170
    const evidence = [run.stdout.path, run.stderr.path].filter((path) => Boolean(path) && existsSync(path));
  • 读取本地文件
    packages/dsh-quota/src/job.js:64
    const size = statSync(path).size;
  • 读取本地文件
    packages/dsh-quota/src/job.js:84
    return statSync(path).size;
  • 读取本地文件
    packages/dsh-timelab/src/fragment.js:30
    const text = readFileSync(file, 'utf8');
  • 写入本地文件
    packages/dsh-timelab/src/fragment.js:62
    mkdirSync(dir, { recursive: true });
  • 写入本地文件
    packages/dsh-timelab/src/fragment.js:63
    appendFileSync(join(dir, file), `${JSON.stringify(entry)}\n`, 'utf8');
  • 读取本地文件
    packages/dsh-timelab/src/fragment.js:73
    if (!existsSync(path)) return [];
  • 读取本地文件
    packages/dsh-timelab/src/fragment.js:76
    for (const line of readFileSync(path, 'utf8').split('\n')) {
  • 写入本地文件
    packages/dsh-timelab/src/fragment.js:134
    mkdirSync(dir, { recursive: true });
  • 读取本地文件
    packages/dsh-timelab/src/helper.js:17
    if (existsSync(local)) return local;
  • 读取本地文件
    packages/dsh-timelab/src/helper.js:20
    return existsSync(sibling) ? sibling : local;
  • 读取本地文件
    packages/dsh-timelab/src/helper.js:28
    return process.platform === 'win32' && existsSync(hostPath()) && existsSync(dllPath());
  • 读取本地文件
    packages/dsh-timelab/src/helper.js:37
    if (!existsSync(host)) {
  • 执行外部命令来自配置/变量
    packages/dsh-timelab/src/helper.js:46
    execFile(
  • 读取本地文件
    packages/dsh-timelab/src/index.js:203
    log_path: existsSync(logPath) ? logPath : undefined,
  • 读取本地文件
    packages/dsh-timelab/src/index.js:206
    evidence: existsSync(logPath) ? [logPath] : [],
  • 读取本地文件
    packages/dsh-verify/src/dwarf.js:34
    if (existsSync(candidate)) return candidate;
  • 执行外部命令来自配置/变量
    packages/dsh-verify/src/dwarf.js:41
    execFile(
  • 读取本地文件
    packages/dsh-verify/src/dwarf.js:86
    if (!module?.path || !existsSync(module.path)) continue;
  • 读取本地文件
    packages/dsh-verify/src/fragment.js:32
    const text = readFileSync(file, 'utf8');
  • 写入本地文件
    packages/dsh-verify/src/fragment.js:71
    mkdirSync(dir, { recursive: true });
  • 写入本地文件
    packages/dsh-verify/src/fragment.js:79
    mkdirSync(dir, { recursive: true });
  • 写入本地文件
    packages/dsh-verify/src/fragment.js:80
    appendFileSync(join(dir, file), `${JSON.stringify(entry)}\n`, 'utf8');
  • 读取本地文件
    packages/dsh-verify/src/fragment.js:90
    if (!existsSync(path)) return [];
  • 读取本地文件
    packages/dsh-verify/src/fragment.js:93
    for (const line of readFileSync(path, 'utf8').split('\n')) {
  • 读取本地文件
    packages/dsh-verify/src/index.js:145
    return statSync(path).isFile();
  • 读取本地文件
    packages/dsh-verify/src/index.js:368
    if (!existsSync(cwd)) throw new Error(`cwd does not exist: ${cwd}`);
  • 读取本地文件
    packages/dsh-verify/src/index.js:369
    if (!statSync(cwd).isDirectory()) throw new Error(`cwd is not a directory: ${cwd}`);
  • 写入本地文件
    packages/dsh-verify/src/index.js:385
    writeFileSync(scriptPath, `@echo off\r\n${cmd}\r\n`, 'utf8');
  • 读取本地文件
    packages/dsh-verify/src/index.js:459
    const evidence = [stdoutPath, stderrPath].filter((path) => existsSync(path));
  • 读取本地文件
    packages/dsh-verify/src/index.js:460
    if (existsSync(dumpPath) && run.captured) evidence.push(dumpPath);
  • 读取本地文件
    packages/dsh-verify/src/index.js:461
    if (scriptPath && existsSync(scriptPath)) evidence.push(scriptPath);
  • 读取本地文件
    packages/dsh-verify/src/png.js:34
    const buffer = readFileSync(path);
  • 读取本地文件
    packages/dsh-verify/src/runner.js:18
    if (existsSync(local)) return local;
  • 读取本地文件
    packages/dsh-verify/src/runner.js:21
    return existsSync(sibling) ? sibling : local;
  • 读取本地文件
    packages/dsh-verify/src/runner.js:25
    return process.platform === 'win32' && existsSync(helperPath());
  • 读取本地文件
    packages/dsh-verify/src/runner.js:36
    if (!existsSync(exe)) {
  • 读取本地文件
    packages/dsh-verify/src/runner.js:50
    if (existsSync(candidate)) parts[0] = candidate;
  • 执行外部命令来自配置/变量
    packages/dsh-verify/src/runner.js:69
    execFile(
扫描于 2026/10/31(1 天前) · 范围 全包扫描 · 来源 GitHub 仓库

静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。

给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

DeepSeek Harness 的验证插件——智能体说修好了,这些插件就实际跑一遍,把证据交给你。

README

由 DeepSeek 最新模型翻译生成
dsh-verify agent 编译没报错,就跟你说「改好了」。它其实不知道改没改对——你也不知道,除非自己从头再跑一遍。 这几个插件让它能查清楚,并且把查的过程留成你能核对的东西。 agent: 「配置解析器修好了,编译干净。」 你: verify_run(cmd: "build/app.exe") exit 0xC0000005 ACCESS_VIOLATION #0 parse_json src/config.c:12 ← 它刚改的那一行 #1 load_config src/config.c:22 #2 main src/main.c:34 agent: 「……它崩了,我再看。」 安装 dsh plugin --profile "$env:DSH_PROFILE" add @alexzeng666/dsh-verify Windows x64。一个包,十二个工具。四个子包是它的依赖——单独装会让工具重复注册。
展开完整文档(README 剩余 1 节)
dsh-verify

agent 编译没报错,就跟你说「改好了」。它其实不知道改没改对——你也不知道,除非自己从头再跑一遍。

这几个插件让它能查清楚,并且把查的过程留成你能核对的东西。

agent: 「配置解析器修好了,编译干净。」

你: verify_run(cmd: "build/app.exe")

exit 0xC0000005 ACCESS_VIOLATION
#0 parse_json src/config.c:12 ← 它刚改的那一行 #1 load_config src/config.c:22 #2 main src/main.c:34

agent: 「……它崩了,我再看。」

安装

dsh plugin --profile "$env:DSH_PROFILE" add @alexzeng666/dsh-verify

Windows x64。一个包,十二个工具。四个子包是它的依赖——单独装会让工具重复注册。

十二个工具

| 跑 | verify_run —— 退出码、stdout/stderr,崩了直接给调用栈 |
| 断言 | verify_assert_exit · verify_assert_stdout · verify_assert_file · verify_assert_json · verify_assert_screenshot |
| 汇总 | verify_report —— 把运行历史收成一页报告 |
| 限制 | verify_limit —— CPU / 内存 / 时长上限,超了把整个 Job 杀掉 |
| 归因 | verify_attribution —— 说清它为什么死:退出码语义、事件日志、minidump 调用栈 |
| 观察 | verify_trace —— 它调了哪些 API、传了什么参数 |
| 造假 | verify_hook —— 改掉某个 API 的返回值(12 项白名单) |
| 拨时间 | verify_timeshift —— 把目标进程的时间拨快、拨慢、拨到未来 |

证据,不是说法

每次验证都写进工作区的 .verify/:

.verify/
fragments.jsonl 一行一个 JSON,一次验证一条 timeline.jsonl started / exited / killed / crashed / attached / shifted V-001.stdout.log V-001.stderr.log V-001.dmp 崩了才有

verify_report 就是把这些读回来。于是「验过了」变成一件下周还能翻出来查的事,而不是一句你得信的话。

为什么不直接自己跑命令

可以。编译退出 0 或 1 的时候,自己跑就够了。

不够用是在这几种情况:

- 程序崩了。 shell 只给你 exit code 1;这个给你崩在哪一帧、哪一行源码。
- 命令卡死或者吃满机器。 你拿到的是上限和一次干净的终止,不是卡住的会话。
- 结论是「输出里有 X」。 这是一句断言,断言得有记录。

限制

- 只支持 Windows x64。 没有 32 位,没有别的平台。
- native helper 是预编译的,装的时候不需要编译器。自己编译要 cmake + mingw-w64,见 native/README.md。
- verify_hook 只覆盖固定的 12 个 API。 白名单之外一律报「不支持」,不会假装 hook 上了。
- 追踪 JIT 运行时要把 API 收窄。 verify_trace 走内联 hook,在 node/V8 里 hook QueryPerformanceCounter 会以 STATUS_BREAKPOINT 把目标打死。传 apis 把它排除掉,其余 API 在那边都是安全的。
- 这些工具仍然得 agent 主动调。 系统提示会催它,但没有强制力。工具能保证的是:它一旦真去验了,那个结果是实的。

包

| 包 | 提供 |
| dsh-verify | 跑、断言、汇总 —— 收网包 |
| dsh-quota | verify_limit |
| dsh-crashlab | verify_attribution |
| dsh-probe | verify_trace、verify_hook |
| dsh-timelab | verify_timeshift |
| dsh-verify-contract | 共享类型,不发布 |

每个包都能单独装。它们之间只通过 packages/dsh-verify-contract/src/index.d.ts 这一个类型契约耦合。

许可

MIT,见 LICENSE。内置的 MinHook 是 BSD-2-Clause,见 native/third_party/minhook/LICENSE.txt。
预览分享卡片长什么样 ↓alexzeng666/dsh-verify
分享 · DeepSeek Harness Hub
alexzeng666/dsh-verify

运行程序并留存退出码、日志与崩溃栈等可核对证据

回到顶部