~/wiseowlsoftware/demeanor $
Photo of Brent Rector, author of Demeanor for .NET
Brent Rector — author of Demeanor, the original .NET obfuscator.
Five decades in software: mainframes, minis, PCs, cloud, and AI.
Based in San Diego.
EST. 1999 · THE ORIGINAL .NET OBFUSCATOR

.NET obfuscation that just works. Now with an AI copilot.

.NET compiles to IL. IL decompiles to readable source. Your algorithms, license checks, and business logic are exposed. Demeanor makes them unreadable. One NuGet package. One build property. Done.

Demeanor knot logo
YOUR CODE
public class PricingEngine
{
    private readonly decimal _baseDiscount;
    private decimal _lastTotal;

    public decimal DiscountRate => _baseDiscount;
    public string EngineName => "Standard";
    public event EventHandler<decimal>? PriceChanged;

    public decimal CalculateTotal(int quantity, decimal unitPrice)
    {
        var subtotal = ComputeSubtotal(quantity, unitPrice);
        var discount = ApplyDiscount(subtotal);
        var total = subtotal - discount;
        _lastTotal = total;
        NotifyPriceChanged(total);
        return total;
    }

    public decimal GetLastTotal() => _lastTotal;

    private decimal ComputeSubtotal(int quantity, decimal unitPrice)
        => quantity * unitPrice;
    private decimal ApplyDiscount(decimal subtotal)
        => subtotal * _baseDiscount;
    private void NotifyPriceChanged(decimal total)
        => PriceChanged?.Invoke(this, total);

    public override string ToString()
        => $"PricingEngine(discount={_baseDiscount})";
    public override bool Equals(object? obj)
        => obj is PricingEngine p && _baseDiscount == p._baseDiscount;
    public override int GetHashCode() => _baseDiscount.GetHashCode();
}
COMMUNITY
public class PricingEngine
{
    private readonly decimal m_a;
    private decimal b;
    private EventHandler<decimal>? c;

    public decimal DiscountRate => m_a;
    public string EngineName => "Standard";
    public event EventHandler<decimal>? PriceChanged;

    decimal a(int a, decimal a) => (decimal)a * a;
    decimal a(decimal a) => a * m_a;
    void a(decimal a) => c?.Invoke(this, a);

    public decimal CalculateTotal(int quantity, decimal unitPrice)
    {
        decimal num = a(quantity, unitPrice);
        decimal num2 = a(num);
        decimal num3 = (b = num - num2);
        a(num3);
        return num3;
    }

    public decimal GetLastTotal() => b;

    public override string ToString()
        => $"PricingEngine(discount={m_a})";
    public override bool Equals(object? obj)
        => obj is PricingEngine p && m_a == p.m_a;
    public override int GetHashCode() => m_a.GetHashCode();
}

Public API preserved for compatibility. Internal helpers all collapse to a — three methods, three parameters per method, all named the same. Real ILSpy output.

ENTERPRISE
public class a
{
    private decimal m_a;
    private decimal m_b;
    private EventHandler<decimal> m_c;

    decimal  () => this.m_a;
    string  () => b.a("\u0003\r\u00cd\u00c60\u001c\u00c2\u00c8");

    decimal  (int a, decimal a)
    {
        decimal num =  (a, a);
        decimal num2 =  (num);
        decimal result = (this.m_b = num - num2);
         (result);
        return result;
    }

    decimal  () => this.m_b;

    decimal  (int a, decimal a) => (decimal)a * a;
    decimal  (decimal a) { d.a(); return a * this.m_a; }
    void  (decimal a) => this.m_c?.Invoke(this, a);

    public virtual string a() { /* CFG-flattened */
        return b.a("\u00df\u0094\u001f\u00df..."); }
    public virtual bool b(object a) { d.a(); /* state machine */ }
    public virtual int c() { d.a(); return this.m_a.GetHashCode(); }
}

Type renamed. Methods named with literal whitespace — invalid C# at the parser. Strings encrypted. Anti-tamper + anti-debug injected. CFG flattened. Real ILSpy output.

$ dotnet build
Build succeeded.
0 errors.
$ dotnet build
CS0100: The parameter name 'a' is a duplicate
CS0111: Type 'PricingEngine' already defines a member called 'a'
Build FAILED. 2 errors.
$ dotnet build
CS1001: Identifier expected
CS1525: Invalid expression term 'decimal'
CS1003: Syntax error, ',' expected
CS1002: ; expected
CS0106: The modifier 'public' is not valid for this item
Build FAILED. 47 errors.
Since 1999 No phone-home Per-company licensing Win / Linux / Mac

Fully supported since 1999. Rebuilt for .NET 10.

The first .NET obfuscator — written from internal Microsoft “Lightning” builds before .NET was publicly announced. Demeanor v6 is a complete ground-up rewrite in modern C# 14, designed for how developers actually work today.

No more installers.

Prior versions of Demeanor required an MSI installer and a Visual Studio extension. Demeanor v6 is a Native AOT global tool: dotnet tool install -g WiseOwl.Demeanor puts demeanor on PATH (and on first run auto-installs the companion WiseOwl.Inspector tool so inspect is on PATH too) and self-wires Claude Code. Then either /obfuscate in Claude or demeanor init in any project — Release builds obfuscate themselves.

One price, your whole team.

Per-company licensing. Every developer, every CI server, every build machine — one license. No seat counting, no machine locking, no activation server, no phone-home.

An MCP server for your AI agent. Industry first.

Demeanor ships a Model Context Protocol server with 20 tools — audit, inspect, dry-run, deobfuscate, report. Drive the whole workflow from Claude Code (or any MCP client). The setup that used to take days takes one conversation. Optional. Runs locally over stdio. No network. No phone-home. Works fully without an AI agent. Learn more →

Smarter than ever.

Demeanor v6 has built-in intelligence that automatically detects EF Core entities, Blazor parameters, WPF data bindings, JSON serialization, and 16 more framework patterns. Edge cases that used to require manual intervention are handled automatically. See tested results →

Platform-agnostic, like .NET itself.

.NET applications run everywhere. So does Demeanor. Ships as a self-contained native binary for Windows, Linux, and macOS — nothing to install, no runtime dependencies. Use it anywhere you use .NET.

Get Started → Compare → All Protection Techniques →

Transparent pricing. No sales calls.

Per-company licensing — every developer in your organization is covered. No seat counting, no machine locking, no activation server.

Full feature matrix & comparison →