Trägerdatei
Der dokumentierte Loaderfluss beginnt bei einer präparierten Trägerdatei.
Dateiformat, Herkunft und Startprozess verbinden.
PrimärquellengebundenMalware Analysis / Artefakt: hijackloader_config_extractor.py · SHA-256 9649fb2daa95…
Technische Rekonstruktion des modularen Loaders: PNG-Transport, XOR/LZNT1, Syscall-Tarnung, Anti-VM und Scheduled-Task-Persistenz.
Keine unabhängige Sample-, Laufzeit-, C2- oder Kampagnenverifikation.
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.
9649fb2daa9521361eeabe4fe15d32a24333b1be1db06ab31d3523e3e41b6310aa8b55c63411a0ec691b4023cfdf6a81e48e1641Der Analysepfad dieses Berichts. Jeder Knoten zeigt, was belegt ist, wo Detection ansetzen kann und wo die Aussage endet.
Der dokumentierte Loaderfluss beginnt bei einer präparierten Trägerdatei.
Dateiformat, Herkunft und Startprozess verbinden.
PrimärquellengebundenPayloadbestandteile liegen in einer verschachtelten Bilddatenstruktur.
Ungewöhnliche Chunkstruktur und Parserzugriff korrelieren.
PrimärquellengebundenDie dokumentierten Stufen rekonstruieren weitere Module im Speicher.
Speicherschreib- und Schutzwechsel als Sequenz prüfen.
PrimärquellengebundenDer Loader übergibt Kontrolle an ein separates Modul.
Sprungziel, Threadstart und Modulgrenzen erfassen.
PrimärquellengebundenDie Identität eines Folgepayloads muss pro Kampagne belegt werden.
Loader-Telemetrie nicht als Payload-Erkennung ausgeben.
Begrenzt oder offenAnalyseachsen aus dem Bericht – keine Live-Konfiguration und kein universeller Familienindikator.
Quelle, Validierung und Grenze gehören zu jeder Regel.
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, InitiatingProcessSHA256Aktuelle 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?
9649fb2daa9521361eeabe4fe15d32a24333b1be1db06ab31d3523e3e41b6310Offizieller IDAT-Extractor, statisch gelesen.
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.
Die Karte trennt Primärquelle, reproduzierbaren Quellstand und nicht selbst erhobene Laufzeitevidenz.
Eine Dateireferenz belegt kein Laufzeitverhalten. Dokumentierte Aufbereitung ist keine erneute Ausführung.
Nachvollziehbare Quelle mit expliziter Sample-Lücke.
Veröffentlichte Analyse beziehungsweise gepinnter Upstream-Stand.
Datei, Commit und SHA-256 wurden fixiert.
Lokal hashgebundener, nur statisch gelesener Quellstand.
Datei, Commit und SHA-256 wurden fixiert.
Die Prüfung bleibt statisch beziehungsweise quellengebunden.
Keine eigene Laufzeit-, C2- oder Kampagnentelemetrie.
Die Prüfung bleibt statisch beziehungsweise quellengebunden.
Grenze: Eine veröffentlichte Beobachtung ist keine eigene Reproduktion.
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.
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.
Der kurze Auszug zeigt nur die im Kapitel benannte Struktur. Er wird nicht ausgeführt und enthält keine vollständige operative Implementierung.
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)
Originalzeilen der Quelldatei. Erklärung wählen, um den Bereich zu markieren.
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.
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.
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.
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.
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
Zeilennummern gelten für diesen Ausschnitt. Erklärung wählen, um den Bereich zu markieren.
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.
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.
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.
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 ↗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.
Gespräch starten