protector-lab-overlay
Protector Lab (plab) is a commercial Windows PE packer / protector that encrypts the real payload into a large AES-256-GCM overlay appended to the end of the PE file. The outer stub is a MinGW-w64 or MSVC C++ binary that decrypts and optionally injects the payload at runtime.
Detection / Fingerprint
- Magic headers embedded near the end of the file:
PLABOV21— overlay version markerPLABPKG2— package bundle markerplab.overlay.bundle.v1— string in.rdataplab.inner.pkg.v1— inner package string ^[sample 2b2293a0/strings.txt:146,1618,1747,1755]
- Payload encoding string:
payloadEncoding=aes-256-gcm-v2^[sample 2b2293a0/strings.txt:1689] - Imports:
bcrypt.dllwith AES-GCM, SHA256, and key-generation APIs ^[rabin2-info.txt] - Compiler strings:
GNU C23 15.2.0 -march=nocona ... -fno-stack-protector(MinGW builds) ^[sample 2b2293a0/strings.txt:2585] - Manifest tokens:
anti_debug_level,polymorphism_level,guard_plan— parsed from embedded JSON ^[sample 2b2293a0/strings.txt:4545-4548]
Implementation Patterns
The stub performs the following steps (observed via symbol names from the mangled C++ RTTI):
parse_manifest_from_json— reads build-time configurationvalidate_anti_debug_level_token/validate_polymorphism_level_token— confirms guard settingsstub_deterministic_seed— derives a per-build seed used for key generationderive_inner_aes_key/derive_overlay_aes_key— key-derivation using SHA256verify_package_and_decode_payload— AES-GCM decrypt + authenticatestub_execute_guard_plan_or_throw— transfers control to the decrypted payload
The overlay is located by reading the PE file from disk (GetModuleFileNameW) and scanning backwards for PLABOV21.
Reproduce on your own VMs
- Build a MinGW-w64 console executable with
-O2 -fno-stack-protector. - Implement a function that calls
BCryptOpenAlgorithmProviderforBCRYPT_AES_ALGORITHM, setsBCRYPT_CHAIN_MODE_GCM, generates a 256-bit key withBCryptGenerateSymmetricKey, and encrypts your payload. - Append the ciphertext + 16-byte GCM tag +
PLABOV21footer to the end of your compiled.exe. - In the stub, locate the footer, read backwards to get the ciphertext, derive the key from a hardcoded seed, decrypt with
BCryptDecrypt, and jump to the result. - Add optional
IsDebuggerPresent/ PEB checks for anti-debug realism.
Verification: Run strings on the resulting binary and confirm plab.overlay.bundle.v1, BCryptOpenAlgorithmProvider AES, and PLABOV21.
Defensive Countermeasures
- Look for the
PLABOV21/PLABPKG2magic in PE overlays at file-offset tail. - Monitor
bcrypt.dllusage combined withCreateProcessW+VirtualAllocExin a short time window. - Memory forensics: dump the decrypted payload from the child process after the overlay decryption routine runs.
Pages where observed
- remusstealer — entity page
/intel/analyses/2b2293a0cd9ff8648a95a9a46e6999c9e9961fc281ff5d0b698a22755974c621.html