DEV Community

Zero Heartbeat profile picture

Zero Heartbeat

404 bio not found

Joined Joined on 
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
Decompiling control flow: how Glass.NET rebuilds loops and if/else from a pile of branches

Decompiling control flow: how Glass.NET rebuilds loops and if/else from a pile of branches

Comments
10 min read
Renaming to collisions: how Nebula reuses one name across members, and why the CLR tells them apart by signature

Renaming to collisions: how Nebula reuses one name across members, and why the CLR tells them apart by signature

Comments
8 min read
Designing a license key humans can type: base32, segment grouping, and a check digit that catches typos

Designing a license key humans can type: base32, segment grouping, and a check digit that catches typos

Comments
7 min read
Decompiling anonymous types: the generated generic class behind new { a, b }

Decompiling anonymous types: the generated generic class behind new { a, b }

Comments
7 min read
One license, four runtimes: verifying the same Keyright key from .NET, Node, Python and Java

One license, four runtimes: verifying the same Keyright key from .NET, Node, Python and Java

Comments
8 min read
Obfuscating custom attributes: what the metadata keeps, what renaming breaks, and the reflection that still works

Obfuscating custom attributes: what the metadata keeps, what renaming breaks, and the reflection that still works

Comments
6 min read
Obfuscating async/await and iterators: why the state machine survives renaming (and the one binding a naive renamer breaks)

Obfuscating async/await and iterators: why the state machine survives renaming (and the one binding a naive renamer breaks)

Comments
8 min read
Verifying a license key is not free: caching the signature check without caching a stale answer

Verifying a license key is not free: caching the signature check without caching a stale answer

Comments
8 min read
Decompiling a?.b?.c: how the null-conditional operator becomes branches and one shared skip label

Decompiling a?.b?.c: how the null-conditional operator becomes branches and one shared skip label

Comments
7 min read
Decompiling a switch on strings: the hidden hash jump table the compiler builds

Decompiling a switch on strings: the hidden hash jump table the compiler builds

Comments
8 min read
Licensing a .NET CLI tool: headless activation, KEYRIGHT_LICENSE, and runners with no "Register" dialog

Licensing a .NET CLI tool: headless activation, KEYRIGHT_LICENSE, and runners with no "Register" dialog

Comments
8 min read
Decompiling C# events: the CompareExchange loop behind += and -=

Decompiling C# events: the CompareExchange loop behind += and -=

Comments
8 min read
Obfuscating an assembly your tests still have to pass: InternalsVisibleTo and friend assemblies

Obfuscating an assembly your tests still have to pass: InternalsVisibleTo and friend assemblies

Comments
6 min read
A license is a capability token: Keyright entitlements as ASP.NET Core authorization policies

A license is a capability token: Keyright entitlements as ASP.NET Core authorization policies

Comments
6 min read
Decompiling params collections: where did my array go?

Decompiling params collections: where did my array go?

Comments
6 min read
Obfuscating a WinForms app without losing your designer resources

Obfuscating a WinForms app without losing your designer resources

Comments
7 min read
One license, many clocks: per-entitlement expiry with Keyright

One license, many clocks: per-entitlement expiry with Keyright

Comments
7 min read
Decompiling the new lock: when the compiler stops calling Monitor

Decompiling the new lock: when the compiler stops calling Monitor

Comments
6 min read
Obfuscating an Avalonia app: compiled bindings, the ViewLocator convention, and what the XAML compiler already made rename-safe

Obfuscating an Avalonia app: compiled bindings, the ViewLocator convention, and what the XAML compiler already made rename-safe

Comments
11 min read
Deactivating a license and moving it to a new machine: receipts, offline proofs, and transfer limits

Deactivating a license and moving it to a new machine: receipts, offline proofs, and transfer limits

Comments
11 min read
Decompiling operator overloads: op_ names, checked operators, and the conversions that only compile as operators

Decompiling operator overloads: op_ names, checked operators, and the conversions that only compile as operators

Comments 1
10 min read
Obfuscating a plugin host without breaking the plugin contract

Obfuscating a plugin host without breaking the plugin contract

Comments 1
9 min read
When a VM gets cloned: detecting duplicate activations in node-locked licensing

When a VM gets cloned: detecting duplicate activations in node-locked licensing

Comments
9 min read
Decompiling ref fields and scoped: how C# 11 ref structs look in IL

Decompiling ref fields and scoped: how C# 11 ref structs look in IL

Comments
8 min read
Obfuscating a gRPC service without breaking the contract on the wire

Obfuscating a gRPC service without breaking the contract on the wire

Comments
7 min read
Turning on license enforcement without locking out your customers: audit mode first

Turning on license enforcement without locking out your customers: audit mode first

Comments
9 min read
Decompiling init-only setters and required members: the modreq and attributes that make them

Decompiling init-only setters and required members: the modreq and attributes that make them

Comments
7 min read
Obfuscating an ASP.NET Core app: controllers, DI, model binding, and what must stay public

Obfuscating an ASP.NET Core app: controllers, DI, model binding, and what must stay public

Comments
12 min read
Versioning your license payload: adding claims without breaking the clients already in the field

Versioning your license payload: adding claims without breaking the clients already in the field

Comments
12 min read
loading...