a497a066fe94fbfad7361eee98b725cc0c32be13bd0c1742d010a98c97a483d7unclassified-dotnet-bitmap-stego-loader: a497a066 — 21-bitmap maritime-lure sibling, Feb 2020 build
Executive Summary
Seventh confirmed sibling of the .NET bitmap-stego loader cluster. PE32 GUI assembly compiled 29 Feb 2020, embedding 21 encrypted 76×76×24 bitmap payloads in .rsrc — the highest bitmap count among confirmed siblings and matching the early-cluster baseline. Masquerades as a maritime shipping document (vessel's_mainiculars.exe). RijndaelManaged + SHA256 strings, SoapHttpClientProtocol network surface, and heavy alphanumeric name mangling. Static-only; no runtime C2 recovered. ^[file.txt]
What It Is
- SHA-256:
a497a066fe94fbfad7361eee98b725cc0c32be13bd0c1742d010a98c97a483d7 - Filename:
vessel's_main_particulars.exe^[metadata.json] - Size: 1,031,168 bytes (1.0 MB)
- Format: PE32 executable (GUI) Intel 80386 Mono/.Net assembly, 3 sections ^[file.txt]
- Timestamp: Sat Feb 29 14:36:14 2020 UTC (leap-day build) ^[rabin2-info.txt]
- Framework: .NET Framework 4.6 (assembly version 1.0.0.0) ^[strings.txt:3731]
- Linker: Version 8.0 (Visual Studio / MSBuild toolchain) ^[exiftool.json]
- Family: Confirmed sibling of unclassified-dotnet-bitmap-stego-loader (n=7). Static-only analysis.
How It Works
Masquerade & Social Engineering
The filename vessel's_main_particulars.exe targets maritime/shipping-sector victims — a procurement or logistics employee expecting a vessel specification sheet. The VS_VERSIONINFO block carries fabricated nonsense strings: company name H?<??;>=AE:FC9C8BEJ, product name 75D49;EJ?CEGCFBD, internal name done.exe, version 10.21.32.8. ^[exiftool.json] This is consistent with the cluster's pattern of random-alphanumeric version-info masquerade. ^[entities/unclassified-dotnet-bitmap-stego-loader.md]
Bitmap-Stego Payload Hiding
Binwalk identifies 21 PC bitmap structures (76×76×24) inside .rsrc, spaced at ~17.5 KB intervals starting at offset 0x904C9. ^[binwalk.txt] Each bitmap is the same dimensions as the earliest cluster siblings (4bf14434, f6b5bdd5), but this sample exceeds f230118d (16 bitmaps at 88×88) and d4d106f8 (8 bitmaps at 136×136). The 76×76×24 format is the cluster's original baseline.
Strings confirm System.Drawing.Bitmap references paired with System.Resources.ResourceReader / RuntimeResourceSet — the loader extracts bitmaps from embedded .resources streams at runtime, decrypts them, and reconstructs the inner payload. ^[strings.txt:271,882]
Encryption Chain
RijndaelManaged— symmetric block cipher for payload decryption ^[strings.txt:2451]SHA256— likely key derivation or integrity check ^[strings.txt:1619]CreateDecryptor/CreateEncryptor— confirms managed crypto API use ^[strings.txt:3337,3338]System.Security.Cryptographynamespace referenced ^[strings.txt:3664]
No DeflateStream or System.IO.Compression strings present — unlike sibling f230118d which added a deflate layer. This sample uses a simpler AES/Rijndael-only decryption chain. ^[strings.txt]
Network Surface
System.Net.Sockets^[strings.txt:3428]System.Net^[strings.txt:3482]SoapHttpClientProtocol^[strings.txt:3747]IPHostEntry/GetHostEntry^[strings.txt:3763,3764]
The SoapHttpClientProtocol reference suggests SOAP-over-HTTP C2 or payload staging, shared with siblings f74d8a51 and f6b5bdd5. Sibling d4d106f8 dropped SOAP in favor of System.Net.Http. No hardcoded URLs, IPs, or domains recovered statically.
Reflective Loading
Assembly.Load, Invoke, GetMethod, and GetExecutingAssembly strings present; capa confirms T1620 Reflective Code Loading. ^[capa.txt] The decrypted inner payload is likely a .NET assembly loaded in-memory without disk write.
GUI Shell
Rich WinForms control surface: DataGridView, TreeView, ComboBox, ToolStrip, GroupBox, TabControl, etc. ^[strings.txt:2566-3406] Unlike siblings f74d8a51 (OBD2/service-record GUI) and f230118d (engineering-procurement UI), this sample shows no domain-specific UI strings beyond the filename. The GUI shell may be a generic scaffold or the obfuscator stripped meaningful names.
Decompiled Behavior
Ghidra analysis queued but incomplete at time of writing (background import pending for binary /a497a066fe94fbfad7361eee98b725cc0c32be13bd0c1742d010a98c97a483d7.bin-d1804e). Radare2 confirms the entry point at 0xFD3CE and the standard .NET mscoree.dll!_CorExeMain bootstrap. ^[rabin2-info.txt] No native code of interest; all threat logic lives in obfuscated IL. Decompilation deferred until Ghidra analysis completes.
C2 Infrastructure
No recoverable C2 IOCs from static analysis. No hardcoded URLs, domains, IPs, mutex names, or pipe names. Payload logic is ciphertext inside bitmaps; C2 is runtime-resolved from the decrypted inner assembly. If detonated, network IOCs would surface from the unpacked payload, not the outer loader.
Interesting Tidbits
- Leap-day build timestamp — Feb 29 2020 is unusual; may be fabricated or coincidental, but it places this as the second-earliest known cluster build after
f6b5bdd5(also Feb 2020). ^[rabin2-info.txt] - 21 bitmaps — ties the record for highest count in the cluster, matching the early-build baseline before later siblings began shrinking and enlarging bitmap dimensions. ^[binwalk.txt]
- Namespace
7Spqmq3WQ_s4j— random alphanumeric mangling consistent across cluster; every sibling has a unique namespace. ^[strings.txt:2834] - No
DeflateStream— the decryption chain here is simpler than the AES+Deflate variant seen inf230118d. ^[strings.txt] SoapHttpClientProtocolpersistence — this sample retains the SOAP reference lost in the most recent sibling (d4d106f8), suggesting the cluster's C2 stack shifted over time. ^[strings.txt:3747]- Maritime lure novelty — first confirmed shipping/marine-themed filename in the cluster; prior siblings used purchase-order, quote, payment, and engineering-document lures. ^[metadata.json]
How To Mess With It (Homelab Replication)
Toolchain
- Visual Studio 2019 / MSBuild (Linker 8.0 compatible)
- .NET Framework 4.6 target
- C# WinForms project with embedded
ResourceReaderstreams
Build recipe
- Create a C# WinForms app. Add 20+ small bitmap resources (76×76×24) to
.resx. - Encrypt a second-stage .NET assembly with AES-256-CBC.
- Embed ciphertext into bitmap pixel data (e.g., low-order bit or direct byte overwrite after BMP header).
- At runtime:
ResourceManager.GetObject("bitmap_name")→ extract pixel bytes → AES decrypt →Assembly.Load(byte[])→MethodBase.Invoke. - Obfuscate with an off-the-shelf .NET obfuscator (name mangling + string encryption).
Verification
Run capa against the reproducer. Target hits: T1620 Reflective Code Loading, T1027 Obfuscated Files, T1083 File Discovery, T1082 System Information Discovery.
Deployable Signatures
YARA
rule UnclassifiedDotNetBitmapStegoLoader {
meta:
description = ".NET bitmap-stego loader cluster — encrypted payload in embedded 76x76 bitmap resources"
author = "PacketPursuit"
date = "2026-07-08"
hash = "a497a066fe94fbfad7361eee98b725cc0c32be13bd0c1742d010a98c97a483d7"
strings:
$resreader = "System.Resources.ResourceReader" ascii wide
$bitmap = "System.Drawing.Bitmap" ascii wide
$rijn = "RijndaelManaged" ascii wide
$sha256 = "SHA256" ascii wide
$soap = "SoapHttpClientProtocol" ascii wide
$net_sock = "System.Net.Sockets" ascii wide
$create_dec = "CreateDecryptor" ascii wide
$create_enc = "CreateEncryptor" ascii wide
$pe_magic = { 4D 5A }
condition:
$pe_magic at 0 and
$resreader and $bitmap and
($rijn or ($create_dec and $create_enc)) and
($soap or $net_sock) and
filesize < 2MB
}
Behavioral hunt query (Sigma-like)
title: .NET Bitmap-Stego Loader Execution
detection:
selection:
- ImageLoaded|contains:
- 'System.Drawing.dll'
- 'System.Resources.dll'
- CommandLine|contains:
- '.exe'
bitmap_load:
- ImageLoaded|endswith: 'System.Drawing.dll'
- ImageLoaded|endswith: 'System.Resources.dll'
network:
- InitiatedConnection:
- DestinationPort: 80
- DestinationPort: 443
condition: selection and bitmap_load and network | within 5m
IOC list
| Indicator | Value | Note |
|---|---|---|
| SHA-256 | a497a066fe94fbfad7361eee98b725cc0c32be13bd0c1742d010a98c97a483d7 |
Outer loader |
| Filename | vessel's_main_particulars.exe |
Maritime lure |
| Internal name | done.exe |
VS_VERSIONINFO |
| Version | 10.21.32.8 |
Fabricated |
| Company name | H?<??;>=AE:FC9C8BEJ |
Nonsense masquerade |
| Bitmap count | 21 | 76×76×24 in .rsrc |
| ssdeep | 24576:4B51WEhFMxO+Nm5olKEKUoT3Hxka72pK:4B57hFMXNSooTT |
Cluster fingerprint |
| tlsh | 3E25DF101E872FA5D6BA0F78C0631458B3F8D49763DAE7AB3ED840F49A63F81CA45526 |
Behavioral fingerprint statement
This binary is a .NET Framework PE32 GUI executable with a fabricated version-info block. On launch it loads System.Drawing and System.Resources to access embedded bitmap resources (typically 20+ 76×76 BMPs). It derives an AES/Rijndael key (likely via SHA256 KDF), decrypts pixel data or appended ciphertext from the bitmaps, and reflectively loads the resulting .NET assembly via Assembly.Load + Invoke. Network activity, if present, manifests as SOAP HTTP or raw TCP via System.Net.Sockets. No meaningful plaintext C2 is visible in the outer binary.
Detection Signatures
capa → ATT&CK mapping
| capa Capability | ATT&CK Technique |
|---|---|
| encrypt data using AES via .NET | T1027 Obfuscated Files or Information |
| invoke .NET assembly method (2 matches) | T1620 Reflective Code Loading |
| compiled to the .NET platform | — |
| find data using regex in .NET | T1083 File and Directory Discovery |
| get common file path (2 matches) | T1083 File and Directory Discovery |
| get hostname (2 matches) | T1082 System Information Discovery |
| get session user name (3 matches) | T1033 System Owner/User Discovery |
| create directory (4 matches) | — (file staging) |
| check if directory exists (4 matches) | T1083 File and Directory Discovery |
| write file in .NET (4 matches) | — (persistence/file staging) |
| suspend thread | — (anti-debug / process manipulation) |
References
- unclassified-dotnet-bitmap-stego-loader — Cluster entity page
- dotnet-manifest-resource-decryption — Concept page
- bitmap-steganography-payload-delivery — Concept page (if exists)
- MalwareBazaar entry via OpenCTI connector (artifact
fa4196dd-9238-44cd-8a75-28aac783c24e)
Provenance
Analysis derived from:
file.txt(file type) —filev5.45exiftool.json(VS_VERSIONINFO) — ExifTool v12.76pefile.txt(PE headers) — pefile v2023.2.7strings.txt(static strings) — GNUstringscapa.txt(capabilities) — Mandiant capa v7.0.1binwalk.txt(embedded artefacts) — binwalk v2.3.3rabin2-info.txt(radare2 headers) — radare2 v5.9.4floss.txt(decoded strings) — flare-floss v3.1.1 (failed: invalid CLI args)metadata.json/triage.json(corpus metadata)dynamic-analysis.md— CAPE skipped (no Windows guest)- Ghidra queued import (incomplete at time of analysis)
- radare2 direct inspection (rabin2 strings, header info)
All claims cite source file and line number where applicable.