Resource
Die quellengebundene Architektur beginnt bei einer eingebetteten Resource.
Resourcegröße, Entropie und Zugriffspfad gemeinsam prüfen.
PrimärquellengebundenMalware Analysis / Artefakt: decrypt_payload.py · SHA-256 d44d008e7203…
Technische Quellenanalyse des konfigurierbaren Windows-Loaders: Resource-Format, mehrstufige Entschlüsselung, Anti-Analyse, Ausführungswege, Persistenz und belastbare defensive Signale.
Keine eigene Sample- oder Telemetrieanalyse; keine unabhängige Bestätigung von C2, Payload-Verteilung, Infektionsweg oder Attribution.
Die stärkste Spur ist nicht ein Screenshot aus einem Bericht, sondern das Format im Extractor: Footer, XOR-Stufe und AES-GCM bilden eine überprüfbare Kette. Einen 2CLoader-Binärfund hatten wir dagegen nicht.
d44d008e720351ba346aef227934800568721e9babbb2aa77c4c21a13abd7f2baa8b55c63411a0ec691b4023cfdf6a81e48e1641Ein Footer und eine feste Magic markieren die eingebettete Konfiguration. Der Bericht bindet diese Struktur an den veröffentlichten Companion-Code.
Rolling XOR, ein zweiter XOR-Schritt und AES-GCM bilden die dokumentierte Entschlüsselungskette; optionale Xpress-Huffman-Dekompression folgt danach.
Je nach Konfiguration wählt der Loader unterschiedliche Ausführungs- und Persistenzpfade. Ohne Sample bleibt deren tatsächliche Nutzung ausdrücklich offen.
Erklärendes Schema, keine Live-Telemetrie und kein Audit-Score. Die Einordnung und ihre Grenzen stehen im Artikel.
Der Analysepfad dieses Berichts. Jeder Knoten zeigt, was belegt ist, wo Detection ansetzen kann und wo die Aussage endet.
Die quellengebundene Architektur beginnt bei einer eingebetteten Resource.
Resourcegröße, Entropie und Zugriffspfad gemeinsam prüfen.
PrimärquellengebundenEin Footer mit fester Kennung beschreibt die Lage der Konfiguration.
Strukturkennung und Offsetbeziehungen validieren.
PrimärquellengebundenMehrere dokumentierte Dekodierungs- und Entschlüsselungsschritte bereiten den Payload vor.
Primitive, Reihenfolge und Pufferübergaben erfassen.
PrimärquellengebundenOptionale Dekompression hängt von der gelesenen Konfiguration ab.
API-Nutzung mit Konfigurationszweig verbinden.
PrimärquellengebundenDie Quelle beschreibt alternative Ausführungswege; ihre Nutzung in einem konkreten Sample bleibt offen.
Speicher-, Prozess- und Persistenzsignale pro Pfad trennen.
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_2CLoader_Footer_Candidate {
meta:
author = "Ruhrdigital Studio"
scope = "synthetic structural hunt; not family attribution"
strings:
$footer_magic = { 2C 3D 4E 5F }
condition:
uint16(0) == 0x5a4d and filesize > 0xDC and $footer_magic in (filesize-0xDC..filesize-1)
}title: 2CLoader-style scheduled task persistence candidate
status: experimental
logsource:
product: windows
category: process_creation
detection:
task_tool:
Image|endswith: '\\schtasks.exe'
CommandLine|contains|all:
- '/create'
- '/sc'
- 'onlogon'
suspicious_name:
CommandLine|contains: 'SecurityHealthService.exe'
condition: task_tool and suspicious_name
falsepositives:
- Legitimate software using the same filename or task pattern
level: mediumThreatLabz veröffentlichte am 30. September 2026 eine technische Analyse von 2CLoader und ein Python-Werkzeug zur Payload-Extraktion. Diese Untersuchung liest beide Primärquellen gegeneinander: Welche Struktur ist im Werkzeug tatsächlich kodiert, welche Verhaltensaussagen stammen ausschließlich aus der Sample- und Telemetrieanalyse von ThreatLabz, und welche defensiven Konsequenzen lassen sich daraus ableiten?
Es lag uns kein 2CLoader-Sample vor. Der Begleitcode wurde nicht mit Malware ausgeführt. Aussagen über Laufzeitverhalten, ausgelieferte Familien und Infrastruktur bleiben deshalb ausdrücklich der Primärquelle zugeschrieben.
d44d008e720351ba346aef227934800568721e9babbb2aa77c4c21a13abd7f2bOffizielles ThreatLabz-Begleitwerkzeug, fixiert auf Commit aa8b55c6; für diese Analyse nur statisch gelesen.
Bericht und Begleitcode bilden zwei verschiedene Evidenzebenen. Der Bericht beschreibt beobachtete Samples, Ausführungsoptionen und Kampagnentelemetrie. Das Werkzeug implementiert die Resource-Suche, Footer-Struktur und Entschlüsselungsfolge. Ohne Originalsample lässt sich diese Implementierung hier nicht gegen einen konkreten Build wiederholen.
Die Karte trennt veröffentlichten Bericht, reproduzierbaren Werkzeugstand und das nicht vorhandene Malware-Sample.
Eine Dateireferenz belegt kein Laufzeitverhalten. Dokumentierte Aufbereitung ist keine erneute Ausführung.
Zwei öffentliche Primärquellen; kein lokales Malware-Artefakt.
Verhaltens-, Sample- und Telemetrieaussagen der Primärquelle.
Der Primärbericht verlinkt den ThreatLabz-Decryptor; Commit und Datei wurden fixiert.
Hashgebundener offizieller Parser und Decryptor.
Der Primärbericht verlinkt den ThreatLabz-Decryptor; Commit und Datei wurden fixiert.
Ohne Sample wurde keine Extraktion, Entschlüsselung oder Dekompression ausgeführt.
Keine eigene Binär-, Laufzeit- oder C2-Evidenz.
Ohne Sample wurde keine Extraktion, Entschlüsselung oder Dekompression ausgeführt.
Grenze: Die Veröffentlichung eines Decryptors beweist seine Funktionsfähigkeit nur für die von ThreatLabz geprüften Stände, nicht für jede Variante.
Das öffentliche Werkzeug erwartet am Ende der PE-Resource exakt 0xDC Byte Konfiguration. Ein Magic-Wert markiert den Footer; Größenfelder trennen Hauptpayload, optionale Zusatzdatei und optionale Nachricht. Weitere Felder steuern Persistenz, Anti-Analyse, Zielprozess, Schlafzeit und den geplanten Task.
Das ist defensiv relevant: Der Footer verbindet statisch sichtbare Struktur mit späterem Verhalten. Ein einzelner Magic-Wert wäre als Erkennung zu fragil; zusammen mit PE-Resource-Lage, plausiblen Größenbeziehungen und den nachfolgenden Prozessaktionen wird er belastbarer.
SHA-256 d44d008e720351ba346aef227934800568721e9babbb2aa77c4c21a13abd7f2bdef parse_footer(footer_bytes: bytes) -> configfooter:
if struct.unpack_from("<I", footer_bytes, 0)[0] != FOOTER_MAGIC:
fail()
dwords = struct.unpack("<55I", footer_bytes)
return configfooter(
magic=dwords[0],
fl=dwords[1],
final_payload_size=dwords[2],
aes_gcm_nonce_size=dwords[3],
aes_gcm_tag_size=dwords[4],
aes_gcm_nonce=footer_bytes[0x14:0x20],
aes_gcm_tag=footer_bytes[0x20:0x30],
sha256_seed_xor2=footer_bytes[0x30:0x40],
sha256_seed_xor1=footer_bytes[0x40:0x50],
sum_of_bytes_checksum=dwords[20],
persistence=dwords[21],
opt_flag=dwords[22],
optional_payload_size=dwords[23],
optional_message_size=dwords[24],
xor_add_after_rolling_xor=footer_bytes[0x64],
xor_key_after_rolling_xor=footer_bytes[0x65],
rolling_xor_seed=footer_bytes[0x66],
unk_67=footer_bytes[0x67],
sleeptime=dwords[26],
beacon_id=footer_bytes[0x6C:0x7C],
target_executable_name_used_in_injection=footer_bytes[0x7C:0xBC],
bt=dwords[47],
pn=footer_bytes[0xC0:0xD0],
unk_D0=dwords[52],
scheduled_tasks_trigger_interval_hours=dwords[53],
decompressed_buffer_size=dwords[54],
)
Originalzeilen der Quelldatei. Erklärung wählen, um den Bereich zu markieren.
Die dokumentierte Verarbeitung ist eine feste Kette: Resource finden, Rolling XOR anwenden, zweite XOR-Stufe anwenden, Schlüssel aus Konfiguration und Code-Hash ableiten, AES-GCM authentifiziert entschlüsseln und optional Xpress Huffman dekomprimieren. Erst danach werden Hauptpayload, optionale Zusatzdatei und Nachrichtenblock getrennt.
AES-GCM ist hier kein Schutz für das Opfer, sondern schützt die eingebettete Payload vor einfacher statischer Extraktion. Gleichzeitig schafft der authentifizierte Tag einen harten Prüfschritt: falsche Schlüsselableitung oder veränderte Daten brechen die Kette.
SHA-256 d44d008e720351ba346aef227934800568721e9babbb2aa77c4c21a13abd7f2bdef extract_decode_and_write(pe_path: str | Path, out_dir: str | Path):
resource = find_footer_resource(pe_path)
footer = resource["footer"]
out_dir = Path(out_dir)
out_dir.mkdir(parents=True, exist_ok=True)
section_sha256_seed = compute_section_sha256_seed(pe_path)
stage1 = decode_resource_stage(resource["body"], footer.rolling_xor_seed)
stage2 = xor_decrypt_payload(bytearray(stage1), footer.xor_add_after_rolling_xor, footer.xor_key_after_rolling_xor)
aes_key = generate_aes_key(footer, section_sha256_seed)
aes_plaintext = aes_gcm_decrypt(stage2, footer, aes_key)
final_buffer = decompress_final_payload(aes_plaintext, footer)
main_payload, dropped_payload, message_block = split_body_parts(final_buffer, footer)
Originalzeilen der Quelldatei. Erklärung wählen, um den Bereich zu markieren.
ThreatLabz beschreibt VM-, Debugger-, Timing- und Benutzeraktivitätsprüfungen. Besonders relevant ist die Kopplung an die Entschlüsselung: Eine Timingprüfung kann den SHA-256-Zwischenwert verändern und dadurch einen falschen AES-Schlüssel erzeugen. Das erzeugt keinen separaten sichtbaren Abbruch, sondern lässt die Payload-Kette kryptografisch scheitern.
Daneben soll 2CLoader über indirekte Systemaufrufe und Inline-Trampoline die Sicht von User-Mode-Sicherheitsprodukten und der nachgeladenen Payload beeinflussen. Die Wirkung dieser Mechanismen wurde hier nicht dynamisch nachgemessen.
Der Primärbericht beschreibt speicherbasierte .NET-Ausführung, manuelles LoadPE im eigenen Prozess und RunPE in einem angehaltenen Zielprozess. Konfigurationsflags können Fallbacks zwischen den nativen Wegen steuern. Optional kommen eine zweite abgelegte Datei und eine Täuschungsnachricht hinzu.
Persistenz kann über Run, RunOnce, Startup-Ordner, geplante Aufgaben, den Registry-Wert Load oder UserInitMprLogonScript erfolgen. Für die Verteidigung ist nicht die einzelne Methode entscheidend, sondern die zeitliche Kette aus neuer Autostart-Konfiguration, verdächtigem Prozessstart beziehungsweise Prozessmanipulation und anschließendem Beacon-Verkehr.
Ein belastbares Modell sollte drei Ebenen verbinden. Erstens statisch: PE-Resource mit passendem Footer-Magic, plausiblen Größenbeziehungen und Optionsfeldern. Zweitens Hostverhalten: neue Persistenz plus Prozessmanipulation oder speicherbasierte CLR-Ladung. Drittens Netzwerk: zeitnaher HTTP-POST eines neu gestarteten, nicht erwarteten Prozesses.
Das folgende Sigma-Beispiel ist ein defensives Korrelationsmodell für einen besonders aussagekräftigen Persistenzzweig. Es wurde hier nicht mit einer Sigma-Engine validiert und muss an Produktfelder, legitime Softwareverteilung und lokale Namenskonventionen angepasst werden.
title: 2CLoader-style scheduled task persistence candidate
status: experimental
logsource:
product: windows
category: process_creation
detection:
task_tool:
Image|endswith: '\\schtasks.exe'
CommandLine|contains|all:
- '/create'
- '/sc'
- 'onlogon'
suspicious_name:
CommandLine|contains: 'SecurityHealthService.exe'
condition: task_tool and suspicious_name
falsepositives:
- Legitimate software using the same filename or task pattern
level: medium
Zeilennummern gelten für diesen Ausschnitt. Erklärung wählen, um den Bereich zu markieren.
ThreatLabz beobachtete 2CLoader vor allem in Verbindung mit Vidar und Remus sowie zusätzlich XWorm. Das beschreibt Auslieferungsbeziehungen in den untersuchten Kampagnen. Es beweist weder, dass dieselbe Partei Loader und Payloads entwickelt, noch dass jede künftige 2CLoader-Variante dieselben Familien verteilt.
Ebenso sind Dateiname, MessageBox-Text, Zielprozess oder einzelne C2-Indikatoren keine belastbare Betreiberidentität. Dieser Bericht übernimmt deshalb keine Akteurszuordnung.
Bericht und offizieller Decryptor stimmen in den strukturellen Kernaussagen überein: Footer-Größe und Magic, dreiteilige Resource, gestufte Entschlüsselung, codegebundene Schlüsselableitung und optionale Dekompression. Die Primärquelle ergänzt Anti-Analyse, Persistenz, Ausführungsoptionen und Kampagnenbeobachtungen.
Nicht belegt ist eine eigene Reproduktion an einem Sample. Deshalb bewertet diese Untersuchung die Architektur und ihre defensiven Konsequenzen, nicht die Funktionsfähigkeit eines konkreten Samples oder die Vollständigkeit aller Varianten.
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.
Zscaler ThreatLabz — 2CLoader technical analysis ↗ThreatLabz tools — decrypt_payload.py (commit aa8b55c6) ↗2CLoader verbindet Payload-Schutz, Analyseabwehr, flexible Ausführung und Persistenz in einer konfigurierbaren Zwischenschicht. Gerade diese Breite erzeugt aber mehrere miteinander verknüpfbare Signale: Resource-Struktur, Entschlüsselungsparameter, Autostart-Änderung, Prozessmanipulation und Statusverkehr. Der stärkste defensive Ansatz korreliert diese Ebenen, statt einen einzelnen Namen, Hash oder Magic-Wert als Familienbeweis zu behandeln.
Gespräch starten