Key Judgments
- Defenders should pivot away from import-table triage and toward wrapper structure, memory capture, and section-based hunting. The sample hides Phosphoric.dll inside a custom
.PAK0/.PAK1/.PAK2wrapper, decrypts it with an in-file 8-byte XOR key, and loads it from memory rather than through the normal Windows loader path. - The payload is modular rather than monolithic. Separate embedded PEs handle orchestration, PE infection, process injection, and networking. Partial detections will not necessarily break the full kill chain, and defenders need independent coverage across each module boundary.
- The malware spreads by modifying trusted executables with Windows resource-update APIs and then reusing those hosts as new carriers. This turns ordinary file discovery across endpoints, shared drives, and removable media into an infection surface rather than just an execution surface.
- The implant establishes durable execution through a Windows service named
WinInitServ, a SYSTEM logon task, privilege escalation through token duplication, and thread-context hijacking intoexplorer.exe. These behaviors create multiple high-signal host pivots even when C2 infrastructure remains hidden until runtime. - The wrapper uses an 8-byte repeating XOR scheme to protect the staged payload. This is sufficient to defeat casual static inspection, but once the wrapper format is recognized, analysts can decrypt and recover embedded payloads offline without recovering any external key material.
Overview
This sample is a trojanized Adobe Acrobat or Reader executable that has been backdoored with a custom multi-stage loader and a modular payload family that identifies itself as Symbiote, with a core module named Phosphoric .
Zenyard Agent produced this analysis from a structured reverse engineering extract of a PE32 Windows binary, with no prior context or labeling and no human analyst involvement. The recovered metadata confirms a 32-bit Windows target and a payload compile timestamp of 0x6980F54F, corresponding to 2026-02-02 19:04:47 UTC. The original file size and SHA-256 were not preserved in the supplied materials, so this report focuses on structural, behavioral, and module-level indicators.
The wrapper is built around three non-standard PE sections. .PAK0 contains the loader stub and in-memory PE loader. .PAK1 contains an encrypted DLL container. .PAK2 stores the first-stage XOR key material. After decryption, the payload exposes multiple embedded PE files, including Phosphoric.dll, PEStub.dll, a networking module, a process injector, and PsPInjector.dll, which implements the file infection logic.
This architecture matters because a trojanized Adobe binary is a credible entry point on enterprise endpoints, while the infection logic expands the blast radius beyond the initial host by contaminating executables on local disks, shared folders, and potentially removable media. The result is not a disposable loader but a propagation-capable backdoor that uses trusted software as both disguise and transport.
Unpacking and Execution Flow
Execution begins in .PAK0 rather than in the legitimate host program logic. The loader walks the Process Environment Block to identify its own loaded image, then locates the .PAK2, .PAK1, and .text sections by name.
API resolution is performed dynamically using FNV-1a hashing. The analysis identifies constants associated with:
- lstrcmpA
- malloc
- memcpy
These are resolved through hashed export lookups rather than static imports.
The section layout itself provides an early triage signal. .PAK1 presents as a high-entropy data region consistent with encrypted or compressed content, while .PAK2 is a large read-only section whose first bytes are used as key material rather than executable logic. This separation of ciphertext and key material is unusual in legitimate software.
The key unpacking step is straightforward. The loader reads the first eight bytes of .PAK2, obtains the value 0x80DA36201C4B18B8, and applies it as a repeating XOR key across .PAK1. The decrypted output is a PE payload identified as Phosphoric.dll, which is then mapped into memory by a custom routine described as load_pe_image. This avoids both the normal Windows loader path and a conventional static import table.
A simplified abstraction of the wrapper behavior is:
The legitimate Adobe .text section is present in the wrapped file, but the available material does not establish whether execution returns to the host application after staging the malware. If execution resumes, user-visible behavior is minimized. If not, the wrapper becomes more observable and dependent on one-time execution.
The FNV-1a constants become useful when combined into a detection pattern. A practical approach is to search for at least two of the little-endian DWORD values 3B 6E 7D 2C, F6 CB B6 CE, and FB 34 FA 6D in the same PE that also contains .PAK0, .PAK1, or .PAK2.
Infection, Injection, and Persistence Chain
The decrypted payload is a container for multiple embedded PE files with distinct roles. Phosphoric.dll exposes CallPhosphoricMain and acts as the orchestrator. PEStub.dll functions as a reusable PE loader component. Additional modules handle networking, process injection, and file infection.
The infection path is explicit. The malware enumerates logical drives, walks the file system, identifies PE executables, and modifies them using BeginUpdateResourceW, UpdateResourceW, and EndUpdateResourceW. This is the propagation mechanism rather than a secondary feature.
The analysis also shows the use of BCryptGenRandom inside the infector, although the exact randomized element is not resolved. This introduces uncertainty for detection, as per-infection variation may affect wrapper or payload characteristics.
The injector module targets explorer.exe. It enumerates threads, suspends a target thread, modifies thread context, allocates executable memory, and resumes execution. This provides a process-context pivot into a trusted Windows process.
Persistence is implemented through multiple mechanisms. The sample installs a service named WinInitServ, creates a scheduled task with a SYSTEM logon trigger, acquires SeDebugPrivilege, and performs token manipulation through DuplicateTokenEx and CreateProcessWithTokenW. The UAC bypass uses the CMSTPLUA COM class and the ICMLuaUtil interface.
Anti-Analysis Techniques
The sample uses several anti-analysis techniques that are functional rather than decorative. The most important is full runtime API resolution through FNV-1a hashing, which removes readable imports and forces analysis toward memory inspection.
The malware also encrypts staged payloads and avoids storing C2 details in plaintext. This is sufficient to defeat simple string extraction and many automated triage pipelines.
Environment checks are performed using NtQuerySystemInformation and IsDebuggerPresent. The available material confirms the presence of these checks but does not fully resolve how execution changes under detection conditions.
The embedded strings are not technically significant on their own, but they confirm intent. Messages such as "I'm Symbiote~ nice to meet you analyst! >.<" align with the broader design of camouflage within legitimate binaries, propagation through infection, and resistance to superficial analysis.
Conclusion
This sample combines a trusted Adobe host, a custom section-based wrapper, and a modular payload architecture within a single execution chain. The result is a loader that is both covert and capable of propagation through modification of legitimate executables.
The use of .PAK-based staging, runtime decryption, and modular payload separation reduces the effectiveness of static analysis and shifts focus toward wrapper structure, memory inspection, and behavioral signals.
Part 2 examines how this design extends into cryptographic routines, network behavior, and detection strategies.
Annex A: Indicators of Compromise
Annex B: YARA Hunting Rules
The first rule targets the wrapper structure rather than the final payload. It is scoped conservatively around the .PAK0 / .PAK1 / .PAK2 section layout plus recovered module or export markers. The analyst-taunt string is allowed to strengthen a match, but not to satisfy the rule by itself.
The second rule is a clustering aid for loader stubs that preserve the same FNV-resolved API operands. It should be used for hunting related wrappers, not as a stand-alone attribution signature.


.webp)
.webp)