TW / Independent
← Research-Audits

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

HijackLoader: IDAT-Container, Module und Callstack-Tarnung

Technische Rekonstruktion des modularen Loaders: PNG-Transport, XOR/LZNT1, Syscall-Tarnung, Anti-VM und Scheduled-Task-Persistenz.

Prüfumfang
Aktuelle Modul- und Evasionsanalyse plus offizieller, älterer IDAT-Extractor als getrennte Evidenzstände.
Vorgehen
Statische Quellen- und Architekturprüfung; keine Malware beschafft, gebaut oder ausgeführt.
Material
Offizieller Extractor, lokal auf Datei-Hash und Revision fixiert.
Befund

IDAT-Reassembly, XOR und LZNT1 sind im Companion-Code nachvollziehbar; neuere Pixelvarianten und Module bleiben berichtsbasiert.

Keine unabhängige Sample-, Laufzeit-, C2- oder Kampagnenverifikation.

Analystennotiz

Was der Prüfbestand wirklich hergibt.

HijackLoader verändert Module und Tarnung schneller als statische Familienlabels mithalten. Der Extractor liefert hier den festen Punkt: Containerlogik und iDAT-Behandlung lassen sich revisionsgebunden lesen.

Evidence AnchorQuellstand geprüft
Artefakt
hijackloader_config_extractor.py
SHA-256
9649fb2daa9521361eeabe4fe15d32a24333b1be1db06ab31d3523e3e41b6310
Revision
aa8b55c63411a0ec691b4023cfdf6a81e48e1641
Analysegrundlage
Offizieller Extractor, lokal auf Datei-Hash und Revision fixiert.
Malware / Evidence Atlas

Trägerdatei → Folgepayload

Der Analysepfad dieses Berichts. Jeder Knoten zeigt, was belegt ist, wo Detection ansetzen kann und wo die Aussage endet.

5Ablaufknoten 3Detection-Artefakte 3Regelformate
Aussage

Trägerdatei

Der dokumentierte Loaderfluss beginnt bei einer präparierten Trägerdatei.

Detection-Schwerpunkt

Dateiformat, Herkunft und Startprozess verbinden.

Primärquellengebunden
Config Surface

Konfigurations-Fingerabdruck

Analyseachsen aus dem Bericht – keine Live-Konfiguration und kein universeller Familienindikator.

01
TrägerPNG container
Kernspur
02
MetadateniDAT chunk
Kernspur
03
Modulkettestaged hand-off
Kernspur
04
Persistenztask candidate
Grenze
MODEL / 2D5297D0Kernspur, Stütze und Grenze – keine Risikowerte
Detection Pack

Defensive Artefakte

Quelle, Validierung und Grenze gehören zu jeder Regel.

QuelleEigene Ableitung aus der im Bericht beschriebenen Struktur.Validierungyara-python kompiliert; synthetische Truth-Table 3/3.GrenzeContainer- und PowerShell-Muster sind Kandidaten, kein Familienbeweis.
YARARegel öffnen
Defensives Modell
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
}

Evidenzstatus Im Prüfbestand belegtPrimärquellengebundenBegrenzt oder offen

Prüfauftrag, Stand und Beleggrenze

Aktuelle Modul- und Evasionsanalyse plus offizieller, älterer IDAT-Extractor als getrennte Evidenzstände. Die Leitfrage lautet: Welche Architektur- und Verhaltensaussagen trägt dieser konkrete Prüfstand, und welche bleiben ausschließlich der Quelle zugeschrieben?

ARTIFACT MANIFEST

Dateien und Prüfsummen

threatlabz-tools/hijackloader/hijackloader_config_extractor.py
9649fb2daa9521361eeabe4fe15d32a24333b1be1db06ab31d3523e3e41b6310

Offizieller IDAT-Extractor, statisch gelesen.

Was belegt ist — und was fehlt

Primärquellen, statisch prüfbarer Code und Laufzeitbeobachtungen haben unterschiedliche Aussagekraft. Die Karte hält diese Ebenen auseinander; fehlende Eigenbeobachtung wird nicht durch Plausibilität ersetzt.

FILE / EVIDENCE MAP

Belegkette und offene Laufzeitlücke

Die Karte trennt Primärquelle, reproduzierbaren Quellstand und nicht selbst erhobene Laufzeitevidenz.

Eine Dateireferenz belegt kein Laufzeitverhalten. Dokumentierte Aufbereitung ist keine erneute Ausführung.

QuelleWerkzeugAbleitungBelegFehlendReferenz geprüftDokumentiertUngeklärt

Beleglage

Nachvollziehbare Quelle mit expliziter Sample-Lücke.

Primärquelle

Veröffentlichte Analyse beziehungsweise gepinnter Upstream-Stand.

  • Primärquelle → hijackloader_config_extractor.pytechnisch gegengeprüft · Referenz geprüft

    Datei, Commit und SHA-256 wurden fixiert.

Zugehöriges Berichtskapitel →
hijackloader_config_extractor.py

Lokal hashgebundener, nur statisch gelesener Quellstand.

Datei
threatlabz-tools/hijackloader/hijackloader_config_extractor.py
SHA-256
9649fb2daa9521361eeabe4fe15d32a24333b1be1db06ab31d3523e3e41b6310
Fundstelle
1-142
  • Primärquelle → hijackloader_config_extractor.pytechnisch gegengeprüft · Referenz geprüft

    Datei, Commit und SHA-256 wurden fixiert.

  • hijackloader_config_extractor.py → Kein lokales Malware-SampleLaufzeit offen · Ungeklärt

    Die Prüfung bleibt statisch beziehungsweise quellengebunden.

Zugehöriges Berichtskapitel →
Kein lokales Malware-Sample

Keine eigene Laufzeit-, C2- oder Kampagnentelemetrie.

  • hijackloader_config_extractor.py → Kein lokales Malware-SampleLaufzeit offen · Ungeklärt

    Die Prüfung bleibt statisch beziehungsweise quellengebunden.

Zugehöriges Berichtskapitel →

Grenze: Eine veröffentlichte Beobachtung ist keine eigene Reproduktion.

Eintritt und Lieferkette

Der ältere dokumentierte Pfad versteckt verschlüsselte Stufen in PNG-IDAT-Chunks; neuere Varianten können Daten in Pixelstrukturen ablegen. Das Trägerbild ist deshalb kein Beweis für Harmlosigkeit, aber auch ein ungewöhnliches PNG allein kein Loadernachweis.

Architektur und Datenfluss

Der öffentliche Extractor liest Chunkgrößen, setzt die verschlüsselte zweite Stufe zusammen, wendet einen XOR-Schlüssel an und dekomprimiert mit LZNT1. Der Loader selbst verteilt Aufgaben auf Module wie ANTIVM, MUTEX, CUSTOMINJECT und Persistenzmodule. Format- und Modulstand müssen getrennt versioniert werden.

Originalcode als Architekturbeleg

Der kurze Auszug zeigt nur die im Kapitel benannte Struktur. Er wird nicht ausgeführt und enthält keine vollständige operative Implementierung.

pythonIDAT-Reassembly, XOR und LZNT1 im offiziellen ExtractorAnalysewerkzeug-Auszug
threatlabz-tools/hijackloader/hijackloader_config_extractor.py · Zeilen 41-85
Datei-Hash anzeigenSHA-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)
Code lesen

Analyseabwehr und Persistenz

ThreatLabz beschreibt Heaven’s-Gate-artige Übergänge, direkte x64-Syscalls und gefälschte EBP-Stackframes, um die Herkunft sensibler Aufrufe zu verschleiern. Anti-VM-Prüfungen und Prozessblocklisten ergänzen diese Technik; keine davon ist allein eindeutig.

Fähigkeiten, Ziel und Wirkung

HijackLoader ist primär eine Auslieferungs- und Ausführungsplattform. Beobachtete Folgelasten variieren; deshalb darf der Fund des Loaders nicht automatisch Eigenschaften oder Attribution der späteren Payload übernehmen.

Telemetrieplan und Beweiskette

Belastbare Erkennung verbindet Bildcontainer-Anomalien mit LZNT1/XOR-Rekonstruktion, Modulmetadaten, ungewöhnlichen Syscall-Stacks und neuer Scheduled-Task-Persistenz. Das Modell unten deckt nur den Persistenzzweig ab und benötigt Umgebungsbaselines. Für eine belastbare Untersuchung werden Prozess-GUID und vollständige Elternkette, Nutzer und Sitzung, Befehlszeile, Signatur- und Hashstatus, Datei- und Registryänderungen, DNS-/Verbindungsziele sowie nachgelagerte Zugriffe auf sensible Daten in einer gemeinsamen Zeitleiste erhalten. Zeitnähe ist dabei ein Belegparameter, keine bloße Visualisierung. Fehlende Sensorabdeckung wird pro Stufe markiert, damit ein nicht sichtbares Ereignis nicht fälschlich als nicht erfolgt gilt.

Detection Engineering und Gegenprüfung

Belastbare Erkennung verbindet Bildcontainer-Anomalien mit LZNT1/XOR-Rekonstruktion, Modulmetadaten, ungewöhnlichen Syscall-Stacks und neuer Scheduled-Task-Persistenz. Das Modell unten deckt nur den Persistenzzweig ab und benötigt Umgebungsbaselines. Das folgende Modell ist bewusst eng, nicht engine-validiert und muss gegen legitime Administrations- und Softwarepfade getestet werden.

yamlDefensives Modell, nicht engine-validiertDefensives Modell
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
Code lesen

Alternativhypothesen und Negativtests

Vor einer Familienzuordnung werden die im Modell verwendeten Einzelmerkmale getrennt gegen Softwareverteilung, Administratorwerkzeuge, Installer, Browser- oder Backupsoftware und bekannte interne Skripte geprüft. Mindestens ein struktureller Anker und eine zeitlich passende Verhaltenskette müssen zusammenpassen. Der Extractor bildet den älteren IDAT-Pfad ab und belegt nicht die Dekodierung jeder Pixelvariante. Ohne Sample wurden weder Module noch Injection oder Persistenz ausgeführt. Ein negativer Gegencheck verwirft nur die geprüfte Hypothese; er ist keine allgemeine Entwarnung.

Attribution und Variantenrisiko

Der Extractor bildet den älteren IDAT-Pfad ab und belegt nicht die Dekodierung jeder Pixelvariante. Ohne Sample wurden weder Module noch Injection oder Persistenz ausgeführt.

Abschließende Bewertung

Die Analyse liefert eine belastbare Architektur- und Detektionsgrundlage für den benannten Stand. Sie ist kein Beweis für aktuelle Aktivität, vollständige Variantenabdeckung oder einen bestimmten Betreiber.

Befunde im Überblick

  • PNG ist Transporthülle; Chunkstruktur, Größenbeziehungen und Folgeaktivität liefern den Kontext.
  • Die modulare Architektur trennt Anti-VM, Injection und Persistenz.
  • Der offizielle Extractor ist reproduzierbar gebunden, aber nicht universell für neuere Varianten.

Grenzen der Prüfung

  • Keine unabhängige Sample-, Laufzeit-, C2- oder Kampagnenverifikation.
  • Der Extractor bildet den älteren IDAT-Pfad ab und belegt nicht die Dekodierung jeder Pixelvariante. Ohne Sample wurden weder Module noch Injection oder Persistenz ausgeführt.
  • Defensive Modelle sind nicht mit einer Zielengine validiert.

Kontext, nicht Beleg

Der Evidence Anchor am Anfang nennt den tatsächlich verwendeten Binär-, Datei- oder Revisionsbezug. Diese Links liefern Einordnung und berichtete Beobachtungen; sie ersetzen keine lokale Sample-Analyse.

ThreatLabz — New HijackLoader evasion tactics ↗ThreatLabz — HijackLoader extractor ↗
Abschließendes Urteil

Fazit

Fazit: Struktur vor Signatur

Der höchste defensive Wert entsteht aus der Verbindung von Eintritt, interner Architektur, Persistenz, Wirkung und Telemetrie. Einzelne Namen, Hashes oder IOCs bleiben Hilfsbelege, nicht das Urteil.

Nächste Schritte

  • Modelle gegen synthetische Positivfälle und legitime Negativfälle prüfen.
  • Version und Evidenzstand bei jeder Aktualisierung neu binden.
  • Laufzeitbehauptungen erst nach eigener, rechtmäßig verfügbarer Telemetrie erweitern.
Worauf dieses Urteil beruhtHoch für direkt prüfbare Struktur; begrenzt für nicht selbst reproduzierte Laufzeit- und Kampagnenaussagen.
Aktuelle Modul- und Evasionsanalyse plus offizieller, älterer IDAT-Extractor als getrennte Evidenzstände.
← Alle Research-Audits

Gespräch starten

Projekt besprechen.

Gespräch starten