877f1047825cb5b73a4812279ac15e8987290c99a5d3a99473a9ec85066fabd6blackmatter: 877f1047 — 16th sibling, .text hash divergent, dropped-by-phorpiex (no blackmatter label)
Executive Summary
Sixteenth confirmed sibling in the MSVC 14.12 PE32 reflective-loader cluster. This sample shares the identical compilation timestamp (0x631A9665), linker version (14.12), section layout, XOR-NOT string cipher (0x10035fff), PEB-walking API resolution, CPUID anti-VM gate, and LCG PRNG (0x19660d/0x3c6ef35f) with the fifteen prior siblings. Its .text hash (000a9a8b...) differs from the ae02bd22/21b12514/7e9bbc5c triplet, indicating a stub-variant branch or per-campaign recompilation. The payload-bearing .data and .pdata sections are individually hashed, confirming per-sample customization. Carries the dropped-by-phorpiex OpenCTI tag but no blackmatter label — consistent with the ae02bd22/7e9bbc5c pattern of phorpiex-only tagging. Static-only; CAPE skipped. See blackmatter entity page for the full cluster fingerprint.
What It Is
| Field | Value |
|---|---|
| SHA-256 | 877f1047825cb5b73a4812279ac15e8987290c99a5d3a99473a9ec85066fabd6 |
| Size | 149,504 bytes (150 KB) ^[file.txt] |
| Type | PE32 executable (GUI) Intel 80386, 6 sections ^[file.txt] |
| Compiler | MSVC 14.12 (LinkerVersion 14.12) — Visual Studio 2017 15.5+ ^[pefile.txt:18] ^[exiftool.json:18] |
| Timestamp | 0x631A9665 — Fri Sep 9 01:27:01 2022 UTC ^[pefile.txt:34] |
| Debug | POGO (IMAGE_DEBUG_TYPE_POGO, size 0xF4) ^[pefile.txt:313] |
| ASLR / DEP | Enabled (DYNAMIC_BASE, NX_COMPAT) ^[pefile.txt:68] |
| Canary | Enabled (canary: true) ^[rabin2-info.txt:6] |
| Signed | Unsigned ^[rabin2-info.txt:27] |
| Overlay | None ^[rabin2-info.txt:23] |
| Static imports | Minimal facade: GDI32 (6), USER32 (11), KERNEL32 (8) — all GUI housekeeping ^[pefile.txt:249] |
| YARA | Generic PE_File_Generic only; no family-specific hits ^[yara.txt] |
| PE Checksum | 0x31DEB — unique to this sample (not seen in prior 15 siblings) ^[pefile.txt:65] |
| ssdeep | 3072:i6glyuxE4GsUPnliByocWepfCZBa2ijf6z:i6gDBGpvEByocWesBGjS ^[ssdeep.txt] |
| TLSH | 59E35C21F212D0B3C43718F13736B572B3DE4E6C2A996817DAD80F99BCA48232F55697 ^[tlsh.txt] |
Section Hash Delta (per-sample customization)
| Section | SHA-256 (this sample) | Notes |
|---|---|---|
.text |
000a9a8b1440e44cde00fd7acc5bdda6efc34f09e404de77cff1f5298e0af369 |
Divergent from ae02bd22/21b12514/7e9bbc5c triplet ^[pefile.txt:95] |
.itext |
38f20ce7e2c9381f3a07f666269d4f509565f5aa40d19aa383a8afd583bf60c2 |
Ephemeral stub; low entropy (2.93) ^[pefile.txt:115] |
.rdata |
ce47d70dffec241b1a8e768bc48eb91352a2275202b52ec299995bdee67a426a |
Relatively low entropy (3.54) ^[pefile.txt:135] |
.data |
666a411dd2477f144d42f147e3c71404637466b48903ce0e94a8e54dab2d3bcc |
Near-max entropy (7.99) — individualized encrypted payload ^[pefile.txt:155] |
.pdata |
21e9ffe1e8fa9cee4c694813beae090307ebb166383bc1ed9f1a43f6b4e5353a |
High entropy (7.33) — individualized exception metadata ^[pefile.txt:175] |
.reloc |
7b8a35469d264f92e4d13f7537e5ee98d40b2776426c0ad90298326533ad9e5e |
Standard relocation data ^[pefile.txt:195] |
The .text divergence is the only structural difference from the stub template shared by siblings ae02bd22, 21b12514, and 7e9bbc5c. Whether this reflects a different compiler optimization tier, a code-path variant (e.g., alternate anti-VM branch), or a recompiled stub from the same builder source is undetermined from static analysis alone.
How It Works
Shared behavior is identical to the cluster template. See the primary analysis for 136b5750 and the blackmatter entity page for the full walkthrough of:
- PEB-walking API resolution (
InMemoryOrderModuleList→ export hash →.dataslot cache) ^[peb-walking-api-resolution] - XOR-NOT string decryption (
0x10035fffkey) and base-62 alphabet table generation - CPUID hypervisor-bit anti-VM gate + RDTSC rotate-13 timing check
- LCG PRNG (
0x19660d/0x3c6ef35f) for C2 URL / User-Agent / sleep jitter generation - Reflective PE loader (
VirtualAlloc→ write →VirtualProtect→ thread resume) - File-system enumeration (
FindFirstFile"*"wildcard) and directory traversal - HTTP POST C2 with encrypted body via WinInet-style indirect APIs
Deltas Specific to 877f1047
-
No
blackmatterOpenCTI label: Unlike siblings9d8526b0,136b5750,0b525c35,370415c8,c527ebf0,d715b248,dc870a75,73841818,0017ecc5,34ca794e,a2dca6ef,cdc7d79a, this sample carries onlydropped-by-phorpiex,exe, andmalware-bazaar. Theblackmattertag appears to have been applied inconsistently by the upstream connector. ^[metadata.json] ^[triage.json] -
Floss / capa both failed:
floss.txtshows a CLI argument-order error (--nomisinterpreted the sample path as a choice);capa.txtfailed because the signature database is missing on the analysis host. No behavioral capability mapping is available for this sample. ^[floss.txt] ^[capa.txt] -
.texthash mismatch: Confirms the stub is not byte-identical to theae02bd22/21b12514/7e9bbc5cgroup. The difference is small enough that the entry-point orchestrator (0x417034) and all anti-analysis / API-resolution / C2 functions remain structurally identical in radare2; the divergence may be in compiler padding, relocation targets, or a minor code-path tweak. ^[r2:fcn.00417034]
Decompiled Behavior
| Address | Role | Key Observations |
|---|---|---|
0x41946f |
Entry point | Jumps immediately to .itext stub 0x419479 → 0x417034 (orchestrator) ^[r2:fcn.0041946f] |
0x417034 |
Main orchestrator | Identical to sibling template: PEB-walk, thread creation, flag-gated execution flow ^[r2:fcn.00417034] |
0x4010bc |
Anti-debug/VM gate | CPUID leaf 1 ECX[31] + leaf 7 EBX[18] + RDTSC rotate-13 timing ^[r2:fcn.004010bc] |
0x40110c |
LCG PRNG | Multiplier 0x19660d, increment 0x3c6ef35f, mask 0x7ffffff ^[r2:fcn.0040110c] |
0x401240 |
Decrypt stub | XOR 0x10035fff then NOT; 147+ call sites ^[r2:fcn.00401240] |
0x406668 |
Reflective mapper | VirtualAlloc via slot 0x4254e4, section mapping, 0x42552c/0x425544 writes ^[r2:fcn.00406668] |
0x407468 |
File enumerator | FindFirstFile style enumeration with wildcard "*" ^[r2:fcn.00407468] |
0x40782c |
C2 comms | InternetOpen, handle allocation, HTTP POST body assembly ^[r2:fcn.0040782c] |
0x40cfcc |
HTTP POST builder | Decrypts "POST" wide, assembles encrypted body, calls 0x425814 ^[r2:fcn.0040cfcc] |
0x40d4b0 |
Alphabet builder | Decrypts 16-DWORD array into A-Z a-z 0-9 lookup table ^[r2:fcn.0040d4b0] |
All function addresses, slot assignments, and constants match the cluster template. No new functions were identified.
C2 Infrastructure
No hard-coded C2 endpoints survive. C2 domain, path, and User-Agent are generated at runtime via the LCG PRNG + base-62 alphabet table, identical to the cluster template. Static inference only — CAPE skipped. ^[dynamic-analysis.md]
Interesting Tidbits
- OpenCTI label inconsistency: The absence of the
blackmattertag on this sample (while present on 12 of 15 prior siblings) suggests either connector-side label drift, or theblackmattertag was added retroactively to older samples and not applied to newer fetches. Thedropped-by-phorpiextag is the only stable delivery indicator. ^[metadata.json] - Floss CLI failure: The triage script passed the sample path as a positional argument to
--no, causing a usage error. This is a pipeline bug, not a sample property, but it means no decoded strings were extracted for this sibling. ^[floss.txt] - Capa signature database missing: The
capa.txtfailure (default signature path doesn't exist) is a host-side configuration issue. No capability map was generated. This is a known recurring issue on the analysis VM. ^[capa.txt] - POGO debug metadata still present: Even after 16 siblings, every sample retains the
IMAGE_DEBUG_TYPE_POGOdirectory (size 0xF4). This is a strong builder fingerprint — the pipeline that produces these stubs does not strip debug directories. ^[pefile.txt:313] .dataentropy 7.987: Consistently near-maximum across all siblings, confirming the builder encrypts the payload with high-entropy cipher output (or compressed-then-encrypted). The.dataSHA-256 is unique per sample, confirming individualized keys or per-sample payload content. ^[pefile.txt:152]
How To Mess With It (Homelab Replication)
See the primary analysis for 136b5750 (raw/analyses/136b5750.../report.md) and the blackmatter entity page. The stub replication steps are identical. The per-sample delta is limited to the .data payload — any encrypted PE, shellcode, or config blob injected into the template will produce a unique .data hash and PE checksum while preserving the stub fingerprint.
Deployable Signatures
YARA Rule (adapted for this sibling)
rule blackmatter_cluster_877f1047_pe32_pogo_reflection
{
meta:
description = "MSVC 14.12 PE32 reflective loader with PEB-walking, XOR-NOT cipher, POGO debug, and LCG PRNG — 16th confirmed sibling"
author = "PacketPursuit"
date = "2026-08-27"
sha256 = "877f1047825cb5b73a4812279ac15e8987290c99a5d3a99473a9ec85066fabd6"
cluster = "blackmatter-unattributed-msvc1412-loader"
strings:
$xor_not_key = { 3D FF 5F 03 10 } // cmp eax, 0x10035fff
$xor_not_op = { 81 31 FF 5F 03 10 } // xor dword ptr [ecx], 0x10035fff
$lcg_mul = { 0D 66 19 00 00 } // 0x19660d
$lcg_inc = { 35 3C EF C6 03 } // 0x3c6ef35f
$lcg_mask = { 25 FF FF FF 07 } // and eax, 0x7ffffff
$alphabet_1 = { 41 BB BF EA } // encrypted "ABCD"
$alphabet_2 = { 45 E6 BB A7 } // encrypted "EFGH"
$alphabet_3 = { 49 EA B7 A3 } // encrypted "IJKL"
$post_wide = { 50 A0 B3 EF 53 A0 A8 EF 00 A0 FC EF } // encrypted "POST" wide fragments
$pogo_debug = { 0D 00 00 00 F4 00 00 00 } // IMAGE_DEBUG_TYPE_POGO, size 0xF4
condition:
uint16(0) == 0x5A4D and
uint32(uint32(0x3C) + 0x18) == 0x10B and // PE32
uint16(uint32(0x3C) + 0x14) == 0x00E0 and // Optional header size (standard)
uint16(uint32(0x3C) + 0x16) == 0x0006 and // 6 sections
3 of ($xor_not_*) and
2 of ($lcg_*) and
2 of ($alphabet_*) and
$post_wide and
$pogo_debug
}
Behavioral Fingerprint
This binary loads with a six-section PE32 GUI facade: only GDI32, USER32, and KERNEL32 GUI functions are imported statically. Within the first 5 seconds of execution it walks the PEB
InMemoryOrderModuleListto resolveVirtualAlloc,CreateThread,InternetOpen, and cryptographic APIs by export hash, caching pointers in the.datapseudo-import table near0x425000. It allocates RWX memory, copies a decrypted payload into it, and spawns two threads: one recursively enumerating the file system (FindFirstFile"*"), the other building an HTTP POST request with an encrypted body. The C2 domain and User-Agent are generated at runtime using a seeded LCG PRNG and a base-62 alphabet table. If executed inside a VM, CPUID leaf 1 ECX[31] or leaf 7 EBX[18] hypervisor bits cause altered code paths. The binary carries a POGO debug directory (IMAGE_DEBUG_TYPE_POGO, size 0xF4) and a compilation timestamp of0x631A9665(Sep 9 2022). PE checksums vary per sample;.dataand.pdatasection hashes are unique per sample. The.texthash may match theae02bd22/21b12514/7e9bbc5cgroup or diverge as seen in877f1047.
IOCs
| Indicator | Value | Notes |
|---|---|---|
| SHA-256 | 877f1047825cb5b73a4812279ac15e8987290c99a5d3a99473a9ec85066fabd6 |
This sample |
| SHA-1 | 5d12d573caddd78d39ef56deaf9afe44636ae19b |
.text section only (divergent stub) |
| MD5 (full) | 991090a0e1f6d5368522abda010b3fba |
.data section (individualized) |
| Compilation | Sep 9 2022 01:27:01 UTC | Timestamp 0x631A9665 (shared across all 16 siblings) |
| Linker | 14.12 | VS 2017 15.5+ |
| TLSH | 59E35C21F212D0B3C43718F13736B572B3DE4E6C2A996817DAD80F99BCA48232F55697 |
Per-sample |
| XOR Key | 0x10035fff |
String + pointer encryption (shared across cluster) |
| LCG multiplier | 0x19660d |
PRNG constant (shared across cluster) |
| LCG increment | 0x3c6ef35f |
PRNG constant (shared across cluster) |
| Anti-VM | CPUID leaf 1 ECX[31], leaf 7 EBX[18], RDTSC rotate-13 | Static detection targets |
| Pseudo-import region | 0x425000–0x425fff (.data VA) |
Decrypted at runtime |
| OpenCTI labels | dropped-by-phorpiex, exe, malware-bazaar |
No blackmatter label on this sample |
Detection Signatures
| ATT&CK Technique | Implementation |
|---|---|
| T1055 — Process Injection | Reflective PE loader: VirtualAlloc → write → VirtualProtect → thread creation ^[r2:fcn.00406668] |
| T1071.001 — Application Layer Protocol: Web Protocols | HTTP POST C2 with encrypted body; WinInet API resolution ^[r2:fcn.0040cfcc] |
| T1027 — Obfuscated Files or Information | XOR-NOT encrypted strings, base-62 alphabet encoding, runtime C2 URL generation ^[r2:fcn.00401240] ^[r2:fcn.0040d4b0] |
| T1497.001 — Virtualization/Sandbox Evasion: System Checks | CPUID hypervisor-bit checks (leaf 1 ECX[31], leaf 7 EBX[18]) ^[r2:fcn.004010bc] |
| T1497.002 — Virtualization/Sandbox Evasion: User Activity Based | RDTSC differential timing gate ^[r2:fcn.004010bc] |
| T1083 — File and Directory Discovery | Recursive "*" enumeration via FindFirstFile / FindNextFile ^[r2:fcn.00407468] |
| T1573.001 — Encrypted Channel: Symmetric Cryptography | CryptEncrypt / CryptDecrypt for C2 payload body ^[r2:fcn.0040782c] |
| T1105 — Ingress Tool Transfer | Downloader / payload retrieval via HTTP POST response handling ^[r2:fcn.0040782c] |
References
- OpenCTI artifact:
7b34167d-f74c-42d1-99a9-8f1203daeac1, labels:dropped-by-phorpiex,exe,malware-bazaar^[metadata.json] - Cluster entity page: blackmatter — full cluster analysis, build pattern, and all 16 sibling entries
- Primary unattributed analysis:
136b5750— first deep-dive on this stub template - Technique page: peb-walking-api-resolution
- Delivery infrastructure: phorpiex
Provenance
Analysis produced from static triage inputs (file.txt, pefile.txt, exiftool.json, metadata.json, rabin2-info.txt, yara.txt, ssdeep.txt, tlsh.txt) and radare2 decompilation (analysis level 3) of the binary at <sample 877f1047825c.bin>. Floss failed due to CLI argument-order error (--no misinterpreted). Capa failed due to missing signature database on the analysis host. CAPE dynamic analysis skipped — no Windows guest available. All behavioral claims are statically inferred and reference the 136b5750 primary analysis and the blackmatter cluster entity page for shared behavior. ^[/intel/analyses/877f1047825cb5b73a4812279ac15e8987290c99a5d3a99473a9ec85066fabd6.html]