Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
39 commits
Select commit Hold shift + click to select a range
67962af
test(fuzz): commit the crash corpus and widen CI coverage
BinFlip Aug 13, 2026
fac0545
test(fuzz): add targets for the view, blob, body and emulation paths
BinFlip Aug 13, 2026
3ee19a1
fix(metadata): validate the #~ stream and surface row parse failures
BinFlip Aug 13, 2026
422df95
fix(metadata): bound signature nesting and custom-attribute blobs
BinFlip Aug 13, 2026
3c8eecc
perf(metadata): lazy entity lists, registry indices and interned full…
BinFlip Aug 13, 2026
0488ff7
fix(metadata): reject cyclic inheritance at load time
BinFlip Aug 13, 2026
3647218
fix(assembly): bound method-body decoding to the declared extents
BinFlip Aug 13, 2026
b371214
fix(emulation): budget the heap and address space before allocating
BinFlip Aug 13, 2026
4ab63dd
fix(emulation): validate BCL hook arguments and cap derived work
BinFlip Aug 13, 2026
88a25f6
fix(emulation): correct the four exception unwind paths
BinFlip Aug 13, 2026
aa63b61
fix(emulation): isolate forked state and bound assembly loading
BinFlip Aug 13, 2026
acc3f46
fix(compiler): correct phi placement, edge copies and live intervals
BinFlip Aug 13, 2026
591a1b5
fix(x86): terminate traversal at real boundaries and bound decoding
BinFlip Aug 13, 2026
a508fe9
fix(cilassembly): one source of heap layout, honest section sizes, at…
BinFlip Aug 13, 2026
14f4475
fix(deobfuscation): gate constant folding and make truncation UTF-8 safe
BinFlip Aug 13, 2026
9f457fc
refactor(error)!: derive Clone, mark non_exhaustive, fix the error docs
BinFlip Aug 13, 2026
b9df5eb
chore(release): 0.9.0
BinFlip Aug 13, 2026
7880dc8
build: declare an MSRV and verify it in CI
BinFlip Aug 14, 2026
9edb20d
refactor: replace deprecated fetch_update with try_update
BinFlip Aug 14, 2026
165d444
fix(signatures): bound array rank before it sizes the lower-bound loop
BinFlip Aug 14, 2026
f597e4c
fix(validation): recognise compiler-generated names and report the re…
BinFlip Aug 14, 2026
8e1bfa5
fix(cleanup): keep the enclosing types of referenced nested types
BinFlip Aug 14, 2026
cf50b33
fix(compiler): combine SSA and static edges when computing reachability
BinFlip Aug 14, 2026
0a7154a
fix(deobfuscation): fold fields that are only written during initiali…
BinFlip Aug 14, 2026
677d7be
refactor(unflattening)!: resolve dispatcher edges from SSA instead of…
BinFlip Aug 14, 2026
68109ea
test(netreactor): assert structural validity rather than a survival r…
BinFlip Aug 14, 2026
57a95ac
docs(changelog): record the unflattening rewrite and the remaining 0.…
BinFlip Aug 14, 2026
1d468ec
style: apply rustfmt to the 0.9.0 changes
BinFlip Aug 14, 2026
baf880a
fix(cleanup): cascade removed parameters to the rows that name them
BinFlip Aug 14, 2026
7951c3f
fix(unflattening): leave a method flattened when the rewired form is …
BinFlip Aug 14, 2026
717e8ef
test(netreactor): skip the native-stub sample rather than judge it
BinFlip Aug 14, 2026
5e0cbed
build: raise the fuzzing RSS limit above the sanitizer working set
BinFlip Aug 14, 2026
82ad807
docs(changelog): record the parameter cascade and unflattening fixes
BinFlip Aug 14, 2026
2362bbd
fix(emulation): dispatch runtime-resolved native calls through their …
BinFlip Aug 15, 2026
7c92cf6
fix(emulation): distinguish a refused write from an unmapped address
BinFlip Aug 15, 2026
44f1fb9
fix(cleanup): withhold cleanup when a byte transform fails
BinFlip Aug 15, 2026
6e06cbb
test(netreactor): assert how many NecroBit stubs come back
BinFlip Aug 15, 2026
47c4b6d
docs(changelog): record the native dispatch and cleanup fixes
BinFlip Aug 15, 2026
67ca254
docs(changelog): set the 0.9.0 release date
BinFlip Aug 15, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
15 changes: 15 additions & 0 deletions .cargo/config.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
# Memory guard for test harnesses.
#
# Doc tests link one binary per fenced example, and `[profile.release]` sets `lto = "fat"`,
# so every one of those links is a whole-crate LTO job costing gigabytes of RAM. libtest
# defaults its concurrency to one thread per core, so a bare `cargo test --release --doc`
# on a many-core machine starts dozens of them at once and takes the host out of memory
# before any test reports.
#
# Capping here rather than only in the Makefile means the guard holds for anyone who runs
# cargo directly. Cargo's `[env]` does not override a variable that is already set, so the
# unit-test run — which is cheap per test and wants every core — opts back up to full
# parallelism by exporting `RUST_TEST_THREADS` itself; see the `test` target in the Makefile.
# An explicit `-- --test-threads=N` also still wins, which is what `make test-doc` and CI use.
[env]
RUST_TEST_THREADS = "8"
55 changes: 42 additions & 13 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -94,41 +94,48 @@ jobs:

- name: Run tests (Linux - full)
if: runner.os == 'Linux'
run: cargo test --workspace --release --lib --features z3 --verbose
run: cargo test --workspace --release --features z3 --lib --bins --tests --verbose

- name: Run tests (macOS/Windows - skip expensive tests)
if: runner.os != 'Linux'
run: cargo test --workspace --release --lib --features z3,skip-expensive-tests --verbose
run: cargo test --workspace --release --features z3,skip-expensive-tests --lib --bins --tests --verbose

- name: Run doc tests (Linux only)
if: runner.os == 'Linux'
run: cargo test --workspace --release --doc --features z3
run: cargo test --workspace --release --doc --features z3 -- --test-threads=4

- name: Check documentation
env:
RUSTDOCFLAGS: "-Dwarnings"
run: cargo doc -p dotscope --all-features --no-deps

# Ensures the crate compiles and tests pass without legacy-crypto feature (Linux only)
# Compiles and tests without the legacy-crypto feature (Linux only). Pinned to the declared
# MSRV so this job also guards `rust-version`; the workspace check covers the default-feature
# path, which `--no-default-features` alone would not.
minimal-features:
name: Minimal Features
name: Minimal Features & MSRV
runs-on: ubuntu-latest

steps:
- name: Checkout code
uses: actions/checkout@v7

- name: Install Rust toolchain
uses: dtolnay/rust-toolchain@stable
uses: dtolnay/rust-toolchain@1.95.0

- name: Setup Rust cache
uses: Swatinem/rust-cache@v2
with:
key: minimal-features

- name: Check compilation (default features, whole workspace)
run: cargo check --workspace --all-targets

- name: Check compilation (no default features)
run: cargo check -p dotscope --no-default-features

- name: Run tests (no default features)
run: cargo test -p dotscope --no-default-features --release --verbose
run: cargo test -p dotscope --no-default-features --release --lib --bins --tests --verbose

# Fuzzing on pushes to main or PRs targeting main
fuzzing:
Expand All @@ -154,19 +161,41 @@ jobs:
with:
key: fuzz-quick

- name: Build fuzz target
run: cargo +nightly fuzz build --release cilobject
- name: Build fuzz targets
run: cargo +nightly fuzz build --release
working-directory: dotscope/fuzz

# Every target gets the committed crash corpus. The inputs are PE-shaped, so they are
# directly meaningful to `cilobject`/`assemblyview` and act as structured starting material
# for the blob and body targets rather than starting them from scratch.
- name: Seed corpora from committed regressions
run: |
for t in cilobject assemblyview signatures customattributes methodbody emulation; do
mkdir -p "dotscope/fuzz/corpus/$t"
cp dotscope/tests/samples/fuzz-regressions/* "dotscope/fuzz/corpus/$t/" || true
done

- name: Run quick fuzz test
run: timeout 60 cargo +nightly fuzz run cilobject --release -- -max_total_time=50 || true
run: |
for t in cilobject assemblyview signatures customattributes methodbody emulation; do
echo "::group::fuzz $t"
timeout 60 cargo +nightly fuzz run "$t" --release -- \
-max_total_time=40 -timeout=25 -rss_limit_mb=2048 || true
echo "::endgroup::"
done
working-directory: dotscope/fuzz

- name: Check for crashes
run: |
if [ -d "dotscope/fuzz/artifacts/cilobject" ] && [ "$(ls -A dotscope/fuzz/artifacts/cilobject)" ]; then
echo "Fuzzing found crashes!"
ls -la dotscope/fuzz/artifacts/cilobject/
found=0
for t in cilobject assemblyview signatures customattributes methodbody emulation; do
if [ -d "dotscope/fuzz/artifacts/$t" ] && [ "$(ls -A "dotscope/fuzz/artifacts/$t")" ]; then
echo "Fuzzing found crashes in $t:"
ls -la "dotscope/fuzz/artifacts/$t"
found=1
fi
done
if [ "$found" = "1" ]; then
exit 1
fi

Expand Down
Loading
Loading