Carrier file
The documented loader flow begins with a prepared carrier file.
Join file format, origin and launch process.
Bound to primary researchMalware Analysis / Artefact: hijackloader_config_extractor.py · SHA-256 9649fb2daa95…
Technical reconstruction of the modular loader: PNG transport, XOR/LZNT1, syscall evasion, anti-VM and scheduled-task persistence.
No independent sample, runtime, C2 or campaign verification.
HijackLoader changes modules and camouflage faster than static family labels can keep up. The extractor provides the fixed point: container logic and iDAT handling can be reviewed at a pinned revision.
9649fb2daa9521361eeabe4fe15d32a24333b1be1db06ab31d3523e3e41b6310aa8b55c63411a0ec691b4023cfdf6a81e48e1641The analysis path for this report. Every node shows what is supported, where detection can start and where the claim stops.
The documented loader flow begins with a prepared carrier file.
Join file format, origin and launch process.
Bound to primary researchPayload components reside in a nested image-data structure.
Correlate unusual chunk structure and parser access.
Bound to primary researchThe documented stages reconstruct additional modules in memory.
Review memory writes and protection changes as a sequence.
Bound to primary researchThe loader transfers control to a separate module.
Capture jump target, thread start and module boundaries.
Bound to primary researchThe identity of a follow-on payload must be evidenced per campaign.
Do not present loader telemetry as payload detection.
Bounded or unresolvedReview pivots derived from the report — not a live configuration or universal family indicator.
Source, validation and limits accompany every rule.
rule Windows_Loader_HijackLoader_IDAT_Candidate {
meta:
author = "Ruhrdigital Studio"
scope = "synthetic container hunt; not family attribution"
strings:
$embedded_idat = { 49 44 41 54 C6 A5 79 EA }
condition:
uint16(0) == 0x5a4d and filesize < 30MB and $embedded_idat
}title: HijackLoader scheduled-task branch candidate
status: experimental
logsource:
product: windows
category: process_creation
detection:
selection:
Image|endswith: '\\schtasks.exe'
CommandLine|contains|all:
- '/create'
- '/sc'
- 'onlogon'
condition: selection
falsepositives:
- Legitimate administrative or software activity with the same isolated pattern
level: mediumDeviceProcessEvents
| where Timestamp > ago(30d)
| where FileName =~ "schtasks.exe" and ProcessCommandLine has_all ("/create", "onlogon")
| where InitiatingProcessFolderPath has "\\AppData\\"
| project Timestamp, DeviceName, ProcessCommandLine, InitiatingProcessSHA256Current module and evasion analysis plus an official older IDAT extractor treated as separate evidence snapshots. The bounded question is: which architecture and behaviour claims does this specific evidence set support, and which remain attributable only to the source?
9649fb2daa9521361eeabe4fe15d32a24333b1be1db06ab31d3523e3e41b6310Official IDAT extractor, read statically.
Primary sources, statically inspectable code and runtime observations carry different evidentiary weight. The map keeps those layers separate; missing first-party observation is not replaced by plausibility.
The map separates primary source, reproducible source snapshots and runtime evidence not collected here.
A file reference does not establish runtime behaviour. Recorded processing is not a new execution.
Traceable source with an explicit sample gap.
Published analysis or pinned upstream snapshot.
File, commit and SHA-256 were pinned.
Locally hash-bound source snapshot, read statically only.
File, commit and SHA-256 were pinned.
The review remains static or source-bound.
No first-party runtime, C2 or campaign telemetry.
The review remains static or source-bound.
Limit: A published observation is not an independent reproduction.
The older documented path hides encrypted stages in PNG IDAT chunks; newer variants can place data in pixel structures. A carrier image therefore does not prove benign content, but an unusual PNG alone does not establish the loader.
The public extractor reads chunk lengths, reassembles the encrypted second stage, applies an XOR key and decompresses with LZNT1. The loader itself divides work across modules such as ANTIVM, MUTEX, CUSTOMINJECT and persistence modules. Format and module snapshots must be versioned separately.
The short excerpt shows only the structure discussed in this chapter. It is not executed and does not contain a complete operational implementation.
SHA-256 9649fb2daa9521361eeabe4fe15d32a24333b1be1db06ab31d3523e3e41b6310 input_file.seek(resultOffsetNextByte - 4)
size = input_file.read(4)
size = struct.unpack('>I', size)[0]
configDataCheck1 = input_file.read(4)
configDataCheck1 = struct.unpack('<I', configDataCheck1)[0]
configDataCheck2 = input_file.read(4)
configDataCheck2 = struct.unpack('<I', configDataCheck2)[0]
configDataCheck3 = input_file.read(4)
xorKey = struct.unpack('<I', configDataCheck3)[0]
Size1 = input_file.read(4)
Size1 = struct.unpack('<I', Size1)[0]
print("Total size: "+hex(Size1))
currentSize = 0
size = size - 0x10
with open(r"secondstage.bin", "ab+") as output_file:
while Size1 > currentSize + size:
idat = input_file.read(4)
payload_encrypted = input_file.read(size)
output_file.write(payload_encrypted)
currentSize = currentSize + size
currentSize = currentSize & 0xFFFFFFFF
resultOffsetNextByte = findOffset(file, b'\x49\x44\x41\x54', resultOffsetNextByte+1)
input_file.seek(resultOffsetNextByte - 4 )
size = input_file.read(4)
size = struct.unpack('>I', size)[0]
size = size & 0xFFFFFFFF
remainingSize = Size1 - currentSize
input_file.seek(resultOffsetNextByte)
idat = input_file.read(4)
payload_encrypted = input_file.read(remainingSize)
output_file.write(payload_encrypted)
print("[+] Encypted second stage written to disk")
with open(r"secondstage.bin", "rb+") as operation_file:
payloadSize = Size1
decryptPayload(operation_file, xorKey, payloadSize)
print("[+] Second stage successfully decrypted")
with open(r"secondstage.bin", "rb+") as operation_file:
readBytes = operation_file.read()
decompressedData = lznt1.decompress(readBytes)
with open(r"secondstage_decompressed.bin", "wb") as last_file:
last_file.write(decompressedData)
Original source-file lines. Choose a note to highlight its range.
ThreatLabz describes Heaven’s-Gate-style transitions, direct x64 syscalls and forged EBP stack frames to obscure the origin of sensitive calls. Anti-VM checks and process blocklists add further friction; none is unique in isolation.
HijackLoader is primarily a delivery and execution platform. Observed follow-on payloads vary, so a loader finding must not automatically inherit properties or attribution from the later payload.
Defensible detection links image-container anomalies with LZNT1/XOR reconstruction, module metadata, unusual syscall stacks and new scheduled-task persistence. The model below covers only the persistence branch and requires environmental baselines. A defensible investigation preserves process GUID and full ancestry, user and session, command line, signer and hash state, file and registry changes, DNS/connection destinations and follow-on access to sensitive data in one timeline. Temporal proximity is an evidence parameter, not mere visualization. Missing sensor coverage is marked per stage so that an unseen event is not falsely treated as an event that did not occur.
Defensible detection links image-container anomalies with LZNT1/XOR reconstruction, module metadata, unusual syscall stacks and new scheduled-task persistence. The model below covers only the persistence branch and requires environmental baselines. The following model is deliberately narrow, not engine-validated and must be tested against legitimate administration and software paths.
title: HijackLoader scheduled-task branch candidate
status: experimental
logsource:
product: windows
category: process_creation
detection:
selection:
Image|endswith: '\\schtasks.exe'
CommandLine|contains|all:
- '/create'
- '/sc'
- 'onlogon'
condition: selection
falsepositives:
- Legitimate administrative or software activity with the same isolated pattern
level: medium
Line numbers refer to this excerpt. Choose a note to highlight its range.
Before assigning the family, each signal used by the model is tested independently against software deployment, administration tools, installers, browser or backup software and known internal scripts. At least one structural anchor and one temporally consistent behaviour chain must align. The extractor represents the older IDAT path and does not establish decoding of every pixel variant. Without a sample, modules, injection and persistence were not executed. A negative countercheck rejects only the tested hypothesis; it is not a general all-clear.
The extractor represents the older IDAT path and does not establish decoding of every pixel variant. Without a sample, modules, injection and persistence were not executed.
The review provides a defensible architecture and detection baseline for the named snapshot. It is not proof of current activity, complete variant coverage or a specific operator.
The Evidence Anchor at the start identifies the binary, file or revision actually used. These links provide context and reported observations; they do not substitute for local sample analysis.
ThreatLabz — New HijackLoader evasion tactics ↗ThreatLabz — HijackLoader extractor ↗The greatest defensive value comes from connecting entry, internal architecture, persistence, impact and telemetry. Individual names, hashes or IOCs remain supporting evidence, not the conclusion.
Start a conversation