TW / Independent
← Research audits

Malware Analysis / Artefact: hijackloader_config_extractor.py · SHA-256 9649fb2daa95…

HijackLoader: IDAT containers, modules and spoofed call stacks

Technical reconstruction of the modular loader: PNG transport, XOR/LZNT1, syscall evasion, anti-VM and scheduled-task persistence.

Scope
Current module and evasion analysis plus an official older IDAT extractor treated as separate evidence snapshots.
Method
Static source and architecture review; no malware obtained, built or executed.
Evidence
Official extractor pinned locally by file hash and revision.
Finding

IDAT reassembly, XOR and LZNT1 are traceable in companion code; newer pixel variants and modules remain report-based.

No independent sample, runtime, C2 or campaign verification.

Analyst note

What the evidence actually supports.

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.

Evidence anchorsource snapshot checked
Artefact
hijackloader_config_extractor.py
SHA-256
9649fb2daa9521361eeabe4fe15d32a24333b1be1db06ab31d3523e3e41b6310
Revision
aa8b55c63411a0ec691b4023cfdf6a81e48e1641
Analysis basis
Official extractor pinned locally by file hash and revision.
Malware / Evidence Atlas

Carrier file → Follow-on payload

The analysis path for this report. Every node shows what is supported, where detection can start and where the claim stops.

5flow nodes 3detection artefacts 3rule formats
Claim

Carrier file

The documented loader flow begins with a prepared carrier file.

Detection focus

Join file format, origin and launch process.

Bound to primary research
Config Surface

Configuration fingerprint

Review pivots derived from the report — not a live configuration or universal family indicator.

01
CarrierPNG container
core
02
MetadataiDAT chunk
core
03
Module chainstaged hand-off
core
04
Persistencetask candidate
boundary
MODEL / 2D5297D0Core, support and boundary — not risk scores
Detection Pack

Defensive artefacts

Source, validation and limits accompany every rule.

SourceOriginal derivation from the structure described in the report.ValidationCompiled with yara-python; synthetic truth table 3/3.LimitContainer and PowerShell patterns are candidates, not family proof.
YARAOpen rule
Defensive model
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
}

Evidence status Supported by review evidenceBound to primary researchBounded or unresolved

Scope, snapshot and evidence boundary

Current 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?

ARTIFACT MANIFEST

Files and checksums

threatlabz-tools/hijackloader/hijackloader_config_extractor.py
9649fb2daa9521361eeabe4fe15d32a24333b1be1db06ab31d3523e3e41b6310

Official IDAT extractor, read statically.

What is supported — and what is missing

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.

FILE / EVIDENCE MAP

Evidence chain and open runtime gap

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.

SourceToolDerivedEvidenceMissingVerified referenceRecordedUnresolved

Evidence

Traceable source with an explicit sample gap.

Primary source

Published analysis or pinned upstream snapshot.

  • Primary source → hijackloader_config_extractor.pytechnically cross-checked · Verified reference

    File, commit and SHA-256 were pinned.

Related report section →
hijackloader_config_extractor.py

Locally hash-bound source snapshot, read statically only.

File
threatlabz-tools/hijackloader/hijackloader_config_extractor.py
SHA-256
9649fb2daa9521361eeabe4fe15d32a24333b1be1db06ab31d3523e3e41b6310
Location
1-142
  • Primary source → hijackloader_config_extractor.pytechnically cross-checked · Verified reference

    File, commit and SHA-256 were pinned.

  • hijackloader_config_extractor.py → No local malware sampleruntime unresolved · Unresolved

    The review remains static or source-bound.

Related report section →
No local malware sample

No first-party runtime, C2 or campaign telemetry.

  • hijackloader_config_extractor.py → No local malware sampleruntime unresolved · Unresolved

    The review remains static or source-bound.

Related report section →

Limit: A published observation is not an independent reproduction.

Entry and delivery chain

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.

Architecture and data flow

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.

Original code as architecture evidence

The short excerpt shows only the structure discussed in this chapter. It is not executed and does not contain a complete operational implementation.

pythonIDAT reassembly, XOR and LZNT1 in the official extractorAnalysis tool excerpt
threatlabz-tools/hijackloader/hijackloader_config_extractor.py · Lines 41-85
Show file hashSHA-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)
Read the code

Analysis resistance and persistence

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.

Capabilities, objective and impact

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.

Telemetry plan and evidence chain

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.

Detection engineering and countertesting

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.

yamlDefensive model, not engine-validatedDefensive model
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
Read the code

Alternative hypotheses and negative tests

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.

Attribution and variant risk

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.

Final assessment

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.

Findings at a glance

  • PNG is a transport shell; chunk structure, size relationships and follow-on activity provide context.
  • The modular architecture separates anti-VM, injection and persistence.
  • The official extractor is reproducibly pinned but not universal for newer variants.

Review limits

  • No independent sample, runtime, C2 or campaign verification.
  • 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.
  • Defensive models were not validated with a target engine.

Context, not evidence

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 ↗
Final assessment

Conclusion

Conclusion: structure before signature

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.

Next steps

  • Test models against synthetic positives and legitimate negatives.
  • Rebind version and evidence snapshot with every update.
  • Extend runtime claims only after first-party, lawfully available telemetry.
Basis of this judgmentHigh for directly inspectable structure; limited for runtime and campaign claims not independently reproduced.
Current module and evasion analysis plus an official older IDAT extractor treated as separate evidence snapshots.
← All research audits

Start a conversation

Discuss your project.

Start a conversation