DEV Community

Zero Heartbeat profile picture

Zero Heartbeat

404 bio not found

Joined Joined on 
Upgrade a self-hosted Keyright instance safely: migrations, zero downtime, rollback

Upgrade a self-hosted Keyright instance safely: migrations, zero downtime, rollback

Comments
7 min read
Decompile a single-file or self-contained .NET app with Glass.NET

Decompile a single-file or self-contained .NET app with Glass.NET

Comments
6 min read
Diagnosing a protected .NET build in production: logs, PDBs and stack traces

Diagnosing a protected .NET build in production: logs, PDBs and stack traces

Comments
7 min read
Obfuscating a multi-project .NET solution: one consistent protection strategy

Obfuscating a multi-project .NET solution: one consistent protection strategy

Comments
9 min read
Protecting your Keyright activation endpoint from abuse and key-sharing

Protecting your Keyright activation endpoint from abuse and key-sharing

Comments
7 min read
Extract and read embedded resources from a .NET assembly with Glass.NET

Extract and read embedded resources from a .NET assembly with Glass.NET

Comments
7 min read
Obfuscating a .NET app that uses AutoMapper, MediatR and FluentValidation

Obfuscating a .NET app that uses AutoMapper, MediatR and FluentValidation

Comments
8 min read
Building a Nebula keep-list: what to exclude from renaming (and why)

Building a Nebula keep-list: what to exclude from renaming (and why)

Comments
8 min read
Back up and recover a self-hosted Keyright instance

Back up and recover a self-hosted Keyright instance

Comments
6 min read
Run self-hosted Keyright fully air-gapped, with no outbound internet

Run self-hosted Keyright fully air-gapped, with no outbound internet

Comments
6 min read
Understand unfamiliar third-party .NET code with Glass.NET

Understand unfamiliar third-party .NET code with Glass.NET

Comments
6 min read
See what a .NET assembly depends on and calls with Glass.NET

See what a .NET assembly depends on and calls with Glass.NET

Comments
6 min read
Obfuscating a .NET Worker Service: protecting a headless background worker

Obfuscating a .NET Worker Service: protecting a headless background worker

Comments
10 min read
Running Self-Hosted Keyright Across Multiple Nodes for High Availability

Running Self-Hosted Keyright Across Multiple Nodes for High Availability

Comments
7 min read
Diff two versions of a .NET assembly with Glass.NET

Diff two versions of a .NET assembly with Glass.NET

Comments
6 min read
Did your obfuscation actually work? Check it in Glass.NET

Did your obfuscation actually work? Check it in Glass.NET

Comments
5 min read
A SmartAssembly alternative in 2026

A SmartAssembly alternative in 2026

Comments
4 min read
Migrating from Homegrown License Keys to Keyright Without Breaking Customers

Migrating from Homegrown License Keys to Keyright Without Breaking Customers

Comments
7 min read
Fail-closed licensing in .NET: what your app does when it cannot check

Fail-closed licensing in .NET: what your app does when it cannot check

Comments
6 min read
Anti-tamper in .NET: making a patched assembly fail on its own terms

Anti-tamper in .NET: making a patched assembly fail on its own terms

Comments
6 min read
Decompiling yield return: rebuilding iterator blocks from IL

Decompiling yield return: rebuilding iterator blocks from IL

Comments
6 min read
Rotating a licensing signing key without breaking the field

Rotating a licensing signing key without breaking the field

Comments
5 min read
String encryption in .NET: where the key hides and why it matters

String encryption in .NET: where the key hides and why it matters

Comments
6 min read
Decompiling async/await: rebuilding the state machine .NET hid from you

Decompiling async/await: rebuilding the state machine .NET hid from you

Comments
6 min read
Offline and air-gapped licensing in .NET: validating without a network

Offline and air-gapped licensing in .NET: validating without a network

Comments
6 min read
Control-flow flattening in .NET: turning methods into a dispatcher

Control-flow flattening in .NET: turning methods into a dispatcher

Comments
5 min read
Decompiling C# expression trees: the lambda that became a tree of factory calls

Decompiling C# expression trees: the lambda that became a tree of factory calls

Comments
12 min read
Obfuscating a type you serialize with Newtonsoft.Json: [JsonProperty] is the contract, and TypeNameHandling''s $type is a landmine

Obfuscating a type you serialize with Newtonsoft.Json: [JsonProperty] is the contract, and TypeNameHandling''s $type is a landmine

Comments
9 min read
Decompiling C# string interpolation and interpolated string handlers

Decompiling C# string interpolation and interpolated string handlers

Comments
9 min read
Obfuscating code that uses dynamic: the runtime binder looks members up by name, so a renamed property is a RuntimeBinderException

Obfuscating code that uses dynamic: the runtime binder looks members up by name, so a renamed property is a RuntimeBinderException

Comments
9 min read
Site licenses: binding one Keyright key to the customer''s domain instead of a machine, and what that binding can and cannot prove

Site licenses: binding one Keyright key to the customer''s domain instead of a machine, and what that binding can and cannot prove

Comments
10 min read
Decompiling nullable value types: int? is a struct, a lifted operator is a HasValue check, and the box that erases Nullable<T>

Decompiling nullable value types: int? is a struct, a lifted operator is a HasValue check, and the box that erases Nullable<T>

Comments
9 min read
Obfuscating a type you serialize with System.Text.Json: [JsonPropertyName] is the contract, the renamed property is not

Obfuscating a type you serialize with System.Text.Json: [JsonPropertyName] is the contract, the renamed property is not

Comments
7 min read
What HTTP status does a failed license check deserve? 402, 403, Problem Details, and a header the client can read

What HTTP status does a failed license check deserve? 402, 403, Problem Details, and a header the client can read

Comments
8 min read
Decompiling a decimal constant: why 3.14m is not an IL constant, and the [DecimalConstant] attribute that rebuilds it

Decompiling a decimal constant: why 3.14m is not an IL constant, and the [DecimalConstant] attribute that rebuilds it

Comments
7 min read
Obfuscating a COM-visible .NET assembly: the GUID is the contract, the DispId is the contract, and the class name is the ProgID unless you pin it

Obfuscating a COM-visible .NET assembly: the GUID is the contract, the DispId is the contract, and the class name is the ProgID unless you pin it

Comments
9 min read
Obfuscating an app that registers itself by convention: assembly-scanning DI binds on type names, so renaming unregisters your services

Obfuscating an app that registers itself by convention: assembly-scanning DI binds on type names, so renaming unregisters your services

Comments
8 min read
Logging a license check: structured events an operator can read, and never the key itself

Logging a license check: structured events an operator can read, and never the key itself

Comments
7 min read
License state as a health check: mapping a Keyright license onto Healthy, Degraded and Unhealthy without restart loops

License state as a health check: mapping a Keyright license onto Healthy, Degraded and Unhealthy without restart loops

Comments
9 min read
Decompiling an array initializer: the values live in a data blob and RuntimeHelpers.InitializeArray is the only clue

Decompiling an array initializer: the values live in a data blob and RuntimeHelpers.InitializeArray is the only clue

Comments
8 min read
Obfuscating a PowerShell binary module: the cmdlet name lives in an attribute, but the parameter names are your property names

Obfuscating a PowerShell binary module: the cmdlet name lives in an attribute, but the parameter names are your property names

Comments
9 min read
One license key, three products: the product claim, suite bundles as entitlements, and the gate that lets a Lite key unlock Pro

One license key, three products: the product claim, suite bundles as entitlements, and the gate that lets a Lite key unlock Pro

Comments
9 min read
Decompiling volatile: the modreq on the field, the prefix on every access, and the Volatile.Read call that looks the same but is not

Decompiling volatile: the modreq on the field, the prefix on every access, and the Volatile.Read call that looks the same but is not

Comments
9 min read
Obfuscating a Roslyn source generator: why the generator renames freely but the attribute and the public constructor are pinned

Obfuscating a Roslyn source generator: why the generator renames freely but the attribute and the public constructor are pinned

Comments
7 min read
Clock skew in license verification: why a brand-new key fails on a slow laptop, and the leeway your verify needs

Clock skew in license verification: why a brand-new key fails on a slow laptop, and the leeway your verify needs

Comments
6 min read
Decompiling default interface methods: a method body inside an interface, the class that never overrode it, and the cast you cannot drop

Decompiling default interface methods: a method body inside an interface, the class that never overrode it, and the cast you cannot drop

Comments
6 min read
Obfuscating an F# assembly: discriminated unions, the [CompilationMapping] attribute, and what FSharp.Core reflects on

Obfuscating an F# assembly: discriminated unions, the [CompilationMapping] attribute, and what FSharp.Core reflects on

Comments
7 min read
Renewal nudges that don''t nag: driving "expires in N days" from LicenseKind, not a date in your code

Renewal nudges that don''t nag: driving "expires in N days" from LicenseKind, not a date in your code

Comments
7 min read
Decompiling exception filters: the catch (e) when (...) that becomes a filter region and the endfilter that runs it

Decompiling exception filters: the catch (e) when (...) that becomes a filter region and the endfilter that runs it

Comments
7 min read
Obfuscating readonly structs, in parameters, and ref returns: the modreqs and compiler attributes Nebula must not strip

Obfuscating readonly structs, in parameters, and ref returns: the modreqs and compiler attributes Nebula must not strip

Comments
9 min read
Verifying a Keyright license on Native AOT: no reflection, a trimmed verify path, and the public key as a ReadOnlySpan<byte>

Verifying a Keyright license on Native AOT: no reflection, a trimmed verify path, and the public key as a ReadOnlySpan<byte>

Comments
10 min read
Decompiling optional and named arguments: default values in the Constant table and the temporaries the compiler emits for reordering

Decompiling optional and named arguments: default values in the Constant table and the temporaries the compiler emits for reordering

Comments
10 min read
Obfuscating virtual and interface members: override chains, explicit implementations, and the MethodImpl table that ties them together

Obfuscating virtual and interface members: override chains, explicit implementations, and the MethodImpl table that ties them together

Comments
10 min read
Licensing a .NET component library: the developer license, the key that compiles into your customer''s app, and what the end user never sees

Licensing a .NET component library: the developer license, the key that compiles into your customer''s app, and what the end user never sees

Comments
14 min read
Decompiling fixed: pinned locals, the null-or-empty array guard, and GetPinnableReference

Decompiling fixed: pinned locals, the null-or-empty array guard, and GetPinnableReference

Comments
12 min read
Obfuscating generics: renaming type parameters, and the constraints and reflection that pin the names down

Obfuscating generics: renaming type parameters, and the constraints and reflection that pin the names down

Comments
7 min read
Choosing a signature algorithm for your license keys: Ed25519, ECDSA and RSA compared

Choosing a signature algorithm for your license keys: Ed25519, ECDSA and RSA compared

Comments
10 min read
Decompiling foreach: the enumerator, the hidden try/finally, and when it is really a for loop

Decompiling foreach: the enumerator, the hidden try/finally, and when it is really a for loop

Comments
7 min read
Obfuscating enums: why the names survive renaming, and how ToString() and switch leak them

Obfuscating enums: why the names survive renaming, and how ToString() and switch leak them

Comments
7 min read
Pinning your verification public key: the attacker who just swaps your key for theirs

Pinning your verification public key: the attacker who just swaps your key for theirs

Comments
9 min read
loading...