1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
[]
= "running-process-probe"
= true
= true
= true
= true
= true
= true
= "Sidecar / file-hook tier for running-process (#539 follow-up #551)"
# Published, because `running-process`'s `probe` feature depends on it and
# cargo requires every dependency of a published crate to resolve from the
# registry. Leaving this false is why `cargo publish -p running-process`
# fails today with "dependency `running-process-probe` does not specify a
# version".
= true
# Slice 1 scaffold: the helper binary is an inert placeholder that prints
# its version banner. Real injection vehicles (DLL/dylib + retour-rs /
# LD_PRELOAD / DYLD_INSERT_LIBRARIES) land in slices 4–6 of #551.
#
# CRITICAL: this crate is the ONLY place injection symbols may live. The
# main `running-process` crate must stay clean of `CreateRemoteThread`,
# `dlopen` of interposer libraries, etc. — static AV exposure mitigation
# per the original #539 design. Enforced via `objdump`/`dumpbin` assertion
# in PR 2 (embed-and-extract machinery).
[[]]
= "running-process-probe-agent"
= "src/bin/helper.rs"
[]
= []
# Opt-in feature flag for the embed-and-extract machinery (slice 2 of
# #551). When `off`, the crate compiles to an empty stub — consumers
# don't pay the binary-size cost or expose any sidecar symbols.
# When `on`, the cache + extract functions (`helper_cache_dir`,
# `extract_helper_blob`) are exposed and the dependencies on `dirs`
# + `blake3` come along. Slice 2b will wire `include_bytes!` of the
# actually-built helper binary; today the function is generic over
# the blob bytes so the build-dep chain can be deferred without
# changing the API.
= ["dep:dirs", "dep:blake3"]
[]
# Slice 2 adds the cache + extract machinery dependencies, both gated
# behind the off-by-default `embed-helper` feature so consumers that
# don't opt in pay zero binary-size + zero static-AV-surface cost.
= { = "6", = true }
= { = "1.8.7", = true }
# The probe_diag.v1 schema (#630) is always compiled — it is the crate's
# wire, not an opt-in. `prost` is non-optional; the "no injection symbols"
# invariant constrains the MAIN crate, not this one, and the interposer
# crates don't depend on this crate so they pay nothing.
#
# Must stay in this cross-platform `[dependencies]` table. It previously sat
# below the `[target.'cfg(target_os = "windows")'.dependencies]` header,
# which silently scoped it to Windows — the crate then built here but failed
# every Linux/macOS lane with "could not find `prost`".
= "0.14"
# #635: typed snapshot errors.
= { = true }
= "0.13"
# #636: cross-platform SIGSEGV/SIGBUS/SIGILL/SIGFPE/SIGABRT/SEH
# interception. The callback only copies into a fixed buffer and performs one
# OS write; all allocation and stack capture happens on a sampler thread.
= "0.7"
= "0.4"
[]
# #635 cooperative capture uses realtime signals/ucontext on Linux and Mach
# thread APIs on macOS. This must be a normal dependency: snapshot capture is
# production code, not only a test seam.
= "0.2"
# Parse unwind sections only after every captured thread is running again.
# Keeping parsers out of the signal/suspend window is the safety boundary.
= { = "0.36", = false, = ["read", "std"] }
[]
# libc exposes thread_info but not the suspend/state/Mach-VM APIs or
# architecture state structs needed for cooperative capture.
= "0.4"
# Slice 6d adds the Windows-side injection vehicle
# (`CreateRemoteThread(LoadLibraryW, dll_path)`). Gated on
# `target_os = "windows"` so the rest of the workspace doesn't pull
# `windows-sys` in on non-Windows hosts.
[]
= "0.2"
= { = "0.61", = [
"Win32_Foundation",
"Win32_Security",
"Win32_System_Diagnostics_Debug",
"Win32_System_Kernel",
"Win32_System_IO",
"Win32_System_LibraryLoader",
"Win32_System_Memory",
"Win32_Storage_FileSystem",
"Win32_System_SystemInformation",
"Win32_System_Threading",
] }
# #635: cooperative all-thread capture. `processthreadsapi` for
# Suspend/Resume/GetThreadContext, `tlhelp32` to enumerate our own threads,
# `memoryapi` to bound the stack copy at the committed region. Deliberately NO
# `dbghelp`: its process-global lock has no place in a capture path that runs
# with threads suspended.
= { = "0.3", = [
"handleapi",
"memoryapi",
"processthreadsapi",
"psapi",
"tlhelp32",
"winnt",
] }
[]
= "0.14"
= "0.9"
[]
# `tempfile` for tests that exercise the cache-extract machinery
# against per-test directories instead of the shared
# `helper_cache_dir()` (which would race across parallel tests).
= "3"
= "0.2"
# Framing primitives for the wire round-trip tests. The probe wire reuses
# the broker's framing codec rather than re-deriving the 16 MiB cap.
= { = "../running-process", = false, = [
"client",
] }
= "1"
[]
= true