Research publication. All techniques are described for defensive education and detection engineering. No deployable code, no operational parameters.

Vileblood: cryptographic process fragmentation

When a single beacon is split into micro-binaries that communicate through the Windows kernel, EDR loses the process boundary it relies on for behavioural correlation. This page documents the full architecture, the detection geometry it creates, and what still remains visible to defenders.

The threat model: monolithic beacons are trivial to correlate

Modern EDR platforms do not need a signature to fire on a Cobalt-Strike-style beacon. They only need enough suspicious behaviours inside one process inside one time window: raw sockets, remote threads, RWX allocations, encryption, exfiltration. Every action chains into a single story because one process owns the whole chain.

A monolithic beacon performs every stage inside one process MONOLITHIC BEACON PROCESS Read context plaintext Encrypt AES key Build packet URL, payload Exfiltrate HTTPS EDR sees one process holding the entire attack chain

Detection counterpart

The monolithic beacon is easy to detect because the behavioural chain is dense and local. Fragmentation does not remove the behaviour; it distributes it. The defensive question becomes: what can still be correlated when the chain crosses process boundaries through invisible IPC?

The core hypothesis

If no single process holds enough information to reconstruct the attack, and the linkage between processes is invisible to userland telemetry, then EDR behavioural correlation breaks.

The beacon is split into Engine, Crypto, and Network fragments FRAGMENTED BEACON Engine ~7 KB Reads context Strips sensitive data No key, no URL forwards via ALPC Crypto ~7 KB Receives raw context AES-256-GCM seals No plaintext, no URL forwards via ALPC Network ~24 KB Receives ciphertext Builds V2 batch No key, no plaintext HTTPS POST ALPC ALPC
FragmentSizeRoleWhat it knowsWhat it does not know
Engine~7 KBRead context, strip sensitive data, forward via ALPCPlaintext contextAES key, network destination
Crypto~7 KBReceive raw context, AES-256-GCM seal, forward via ALPCAES key, HMAC secretPlaintext meaning, URL
Network~24 KBReceive ciphertext, build V2 Segment batch, HTTPS POSTExfiltration destinationKey, plaintext

No single process holds enough information to reconstruct the full chain. A memory dump of one fragment is insufficient.

Why ALPC changes the geometry

The critical decision is not the split itself; it is the IPC mechanism. Most EDR platforms log named pipes and shared memory because they appear in the object-manager namespace. ALPC ports do not.

MechanismEDR visibilityForensic resistance
Shared memory (NtCreateSection)High — sections appear in \BaseNamedObjects\Low
Named pipes (NtCreateNamedPipeFile)High — pipes appear in \Pipe\Low
ALPC (NtAlpcCreatePort)Low — no user-visible namespace, rarely loggedHigh
ALPC port chain between loader, engine, crypto, and network ALPC MESSAGE CHAIN Loader spawns fragments Engine ALPC receive port Crypto ALPC receive port Network ALPC receive port Messages are fire-and-forget; each fragment polls its own receive port

Key insight

ALPC is the same IPC Windows system services use. It is expected, fast, and functionally invisible to most EDR telemetry. Defensive correlation must therefore move from the IPC channel itself to the side effects of spawning, timing, and the rare platforms that do log ALPC.

The cryptographic design

Two layers matter: the current AES-256-GCM binding through bcrypt.dll, and the architectural end-state of threshold proxy re-encryption.

Current binding

The Crypto fragment uses AES-256-GCM through raw bcrypt.dll FFI, not a crypto crate. A 12-byte nonce is generated per seal; a 16-byte tag authenticates the ciphertext.

nonce (12) || ciphertext || auth_tag (16)

End-state: threshold PRE

The relay re-encrypts ciphertext from one public key to another without ever decrypting it. A fully compromised relay still cannot read traffic.

operator_sk → kfrags → Worker → cfrags → beacon_pk

CONFIRMED: the current build uses AES-256-GCM through bcrypt.dll. ASSESSED: full Umbral PRE integration is gated on a no_std-friendly secp256k1/PRE stack; the structural placeholder exists but is not yet active.

Host-unique binary generation

Every deployment produces host-unique binaries. The builder derives a seed from machine entropy, then derives keys, URL selection, ALPC names, and an anonymous salt through a KDF chain.

seed = SHA-256(MachineGuid || VolumeSerialNumber || ProcessorId || BootCount)

aes_key     = HMAC-SHA256(preshared_seed, seed || "vileblood:aes")
hmac_secret = HMAC-SHA256(preshared_seed, seed || "vileblood:auth")
url_index   = first-4-bytes(HMAC-SHA256(preshared_seed, seed || "vileblood:url")) mod 10
alpc_name   = first-16-bytes(HMAC-SHA256(preshared_seed, seed || "vileblood:alpc"))
anon_salt   = first-16-bytes(HMAC-SHA256(preshared_seed, seed || "vileblood:anon"))
Spawning mechanismEDR visibilityNotes
Windows Scheduled TaskLow — taskeng.exe spawning a child is normalPrimary mechanism
Service DLL inside svchost.exeVery low — svchost hosting DLLs is expectedStrongest evasion
COM surrogate (dllhost.exe)Low — dllhost is normalGood evasion
Direct spawn from extensionHigh — unusual parent-childAvoided

Detection note: the binaries are stripped, host-unique, and contain no embedded URLs or keys. Static YARA and string matching are weak against this generation model.

What EDR sees, and what it does not

The geometry shifts from single-process correlation to distributed, low-signal correlation. The defensive surface is smaller, but it is not empty.

Detection surfaceWhat EDR seesRisk level
Process spawntaskeng.exe or svchost.exe → small stripped binaryLow
Binary static analysis~7 KB stripped, minimal imports, no stringsLow
Import tablekernel32.dll + bcrypt.dll + winhttp.dllLow
ALPC port creationNtAlpcCreatePort in kernel (if logged)Very low
Network beaconingHTTPS to analytics-shaped endpoint, V2 batch structureLow
Registry readsMachineGuid, VolumeSerialNumberVery low
Single-fragment memory dumpPartial secret at mostMedium

What does not appear

  • No CreateRemoteThread or NtWriteVirtualMemory
  • No NtCreateSection or shared memory handles
  • No named pipes in \Pipe\
  • No suspicious parent-child from user applications
  • No embedded URLs or keys in any binary
  • No periodic beaconing; timing is irregular and log-normal

Detection counterpart

The residual signals are: rare ALPC telemetry, timing distribution, analytics-shaped HTTPS batches from non-browser processes, and the co-occurrence of three tiny stripped binaries on one host. EDR platforms that can correlate sparse cross-process events have the best chance; those that depend on dense single-process chains will miss it.

Build results

The architecture is implemented in Rust. The three fragments compile to no_std + alloc; the builder is a standard Rust binary that runs once on the target.

BinaryRelease sizeTargetStatus
vileblood-execution.exe~7 KB3-5 KBClose
vileblood-crypto.exe~7 KB3-5 KBClose
vileblood-network.exe~24 KB5-8 KBOversize due to WinHTTP + JSON
Test categoryCountResult
KDF chain7Passing
Data stripping6Passing
V2 batch construction4Passing
Mock ALPC send/receive3Passing
End-to-end Engine → Crypto → Network1Passing

Internal crate names appear here for provenance. No source code, builder logic, or operational parameters are published.

The honest trade-off

Vileblood is not a better beacon for every engagement. It is a different beacon for a different threat model.

DimensionMonolithic beaconFragmented implant
Build time2-4 weeks10-18 weeks
PlatformsMulti-platformWindows only
Forensic resistanceLow — single artefactHigh — no single dump reveals chain
Relay blindnessPractical (AES)Mathematical (PRE end-state)
Binary size16 KB (PowerShell)~40 KB total (3 fragments)
ReliabilityHighMedium — service failure, ALPC deadlock risk

Research ethics

All techniques are described for defensive education and detection engineering. Nothing on this page is deployable code, and every evasion discussed is paired with what still remains visible to a defender.

Conclusion

Vileblood demonstrates that process fragmentation combined with invisible IPC and runtime host-unique generation changes the EDR detection geometry. The question stops being "what is this binary doing?" and becomes "what set of low-signal events, across process boundaries, still correlates?"