Skip to content

Releases: dawwinci/agile-net-devirtualizer

Release list

v1.0.1

Choose a tag to compare

@dawwinci dawwinci released this 08 Aug 19:35

Bugfix release. No CLI or output-format changes — same usage as v1.0.0.

Fixes

  • Crash safety / no local paths in error output: a malformed or unrelated
    input DLL (anything without a real Agile.NET opcode registry) could
    previously crash with an unhandled exception, and .NET's default stack
    trace embeds the build machine's own absolute file paths. The whole run is
    now wrapped in a top-level handler that reports failures by message only,
    every runtime-module resolve call during opcode-registry scanning is
    guarded, and Release builds no longer emit a .pdb at all — so there is
    nothing left that could ever surface a local path or username.
  • Lift gap: an arithmetic-helper's nested calls into the VM's own
    boxed-value accessors weren't recognized when reached through another
    runtime helper (only when called directly from a handler), causing several
    methods on some builds to fail lifting entirely.
  • Lift gap: a guard-throw check used to skip the VM's own internal
    null/type-check scaffolding could misattribute a throw reachable only
    through a nested condition to an unrelated outer check, silently
    discarding a real value — this showed up in foreach/enumerator-shaped
    methods.
  • PEVerify regression: a non-void method whose real logic was just an
    unconditional throw got a dead, argument-less ret appended after it,
    which PEVerify flags as "return value missing on the stack" even though
    the position is unreachable. Now emits default(T) there instead.
  • Build portability: a .Reverse() call on an array was, on some SDK
    versions, resolving to the void-returning Span<T> overload instead of
    LINQ's — a build failure with no code-logic cause. Now calls
    Enumerable.Reverse explicitly.

All verified against the full local regression suite (structural, PEVerify,
ILSpy quality, and runtime semantic-vector gates) with no regressions.

Contents

AgileDevirtualizer.exe/.dll plus its one dependency, AsmResolver.DotNet
(MIT) and its own dependencies. Framework-dependent build — needs the .NET 8
runtime installed.

v1.0.0

Choose a tag to compare

@dawwinci dawwinci released this 07 Aug 17:23

First public release of AgileDevirtualizer.

A generic devirtualizer for Agile.NET's VM-based method protection. Reads the
AgileDotNet.VMRuntime.dll shipped alongside a protected assembly, derives the
opcode-to-handler map and each handler's operand/execute semantics from that
DLL structurally (no hardcoded per-build opcode tables), and rewrites
virtualized method bodies back into real, verifiable CIL.

Usage

Requires the .NET 8 runtime.

AgileDevirtualizer.exe <protected.exe> <VMRuntime.dll> [output.exe] [flags]

See the README for
a worked example (virtualized vs. devirtualized), the pipeline architecture,
and the full flag reference.

Contents

AgileDevirtualizer.exe/.dll plus its one dependency, AsmResolver.DotNet
(MIT) and its own dependencies. Framework-dependent build — needs the .NET 8
runtime installed.