Analyse von mit Themida und VMprotect geschützter Malware: Ist es wirklich so schwer?
Malware-Autoren verwenden Schutzmechanismen wie Themida und VMProtect in der Hoffnung, dass sie Analysten vollständig daran hindern, Proben rückgängig zu machen.
Diese Schutzprogramme können ausgeklügelte Techniken einsetzen, um bösartige Funktionen zu verstecken: Code-Virtualisierung, Verschleierung, Anti-Debugging, Komprimierung und Verschlüsselung. (Wir werden später im Artikel sehen, warum wir „können“ gesagt haben.)
Verhindern Themida und VMProtect also wirklich immer, dass etwas Interessantes aus bösartigen Proben extrahiert wird, wie C2-Server, Strings oder analysierbarer Code?
Um diese Frage zu beantworten, haben die Forscher von ANY.RUN Malware-Samples aus verschiedenen Familien analysiert, die Themida und VMProtect verwenden, und die spezifischen Schutzmechanismen verglichen, die sie einsetzen.
Forschungsergebnisse
Unsere Analyse ist ziemlich detailliert. Um den Überblick zu behalten, wählen wir einen etwas ungewöhnlichen Ansatz und beginnen mit den Ergebnissen.
Die folgende Tabelle zeigt unsere Ergebnisse für sechs Malware-Familien, die alle Protektoren verwenden. In der Tabelle sind sie von der geringsten bis zur größten Schwierigkeit bei der Analyse geordnet.
Komprimiert/ verschlüsselt |
Virtualisierung | Verschleierung | Anti-Debug | Verschlüsselung im Dump |
||
Strings | С2 | |||||
Arkei (VMP) | + | – | Nur Entpacker | – | – | – |
RisePro (Themida) | + | – | Nur Entpacker | – | + | – |
RisePro (VMP) | + | – | Nur Entpacker | – | + | – |
PrivateLoader (VMP) | + | – | Nur Entpacker | – | + | + |
Amadey (Themida) | + | – | Nur Entpacker | + | + | + |
Lumma (VMP) | + | – | Control flow flattening | – | – | – |
Vielleicht hast du etwas Interessantes bemerkt: Keines der Beispiele verwendet Code-Virtualisierung. Das macht die Analyse so viel einfacher! Nur in einem Beispiel ist Anti-Debugging aktiviert. Der Malware-Code selbst ist größtenteils ungeschützt, abgesehen von den ersten Phasen der Komprimierung und Entschlüsselung. Und während fast alle Beispiele verschlüsselte/verschleierte Zeichenketten haben, verschleiern nur zwei ihre C2-Server.
Melde dich für ein kostenloses ANY.RUN-Konto an und analysiere bösartige Dateien und Links ohne Limit! |
RisePro
RisePro ist ein Dieb, der seit 2022 bekannt ist und als Malware-as-a-Service verbreitet wird. Es ist bekannt, dass er verschiedene Schutzmechanismen verwendet – es gibt Beispiele, die mit Themida und VMProtect gefunden wurden.
RisePro mit Themida
Von allen Schutztechniken, die Themida bietet, werden in diesem Beispiel nur komprimierte/verschlüsselte Abschnitte, Junk-Code und API-Wrapping verwendet. Darüber hinaus wurden der Junk-Code und das API-Wrapping nur in der Entpackungsroutine verwendet.
Wir haben keine Anti-Debugging-Tricks gefunden und auch keine Code-Virtualisierung bemerkt.
Unser erstes Ziel ist es, den Schadcode zu extrahieren und zu sehen, wie gut er sich analysieren lässt. Dafür brauchen wir den x64dbg Debugger und ein paar Minuten Zeit.
Nachdem wir das Beispiel in den Debugger geladen und seinen Einstiegspunkt erreicht haben, müssen wir einen Haltepunkt beim Laden einer System-DLL setzen.
Als Nächstes lassen wir das Programm laufen, bis es den Haltepunkt erreicht (drücke F9), und können dann das entpackte Beispiel für eine weitere statische Analyse ausgeben:
Jetzt, da wir den Dump haben, können wir beurteilen, wie gut er sich analysieren lässt. Wie wir sehen werden, ist der Code recht gut lesbar. Der folgende Code lädt zum Beispiel einen verschlüsselten String auf den Stack und ruft eine Funktion auf, um ihn zu entschlüsseln:
Dieser Code erzeugt schließlich diese Zeichenkette:
Allerdings ist immer noch eine gewisse Verschleierung im Spiel – die verschlüsselte Zeichenkette wird nirgendwo gespeichert, sondern mit Hilfe von Anweisungen auf den Stack geschoben. Das wirft die Frage auf: Wurde diese Verschleierung von Themida vorgenommen oder war sie schon vor dem Packen im Beispiel vorhanden?
Diese Frage werden wir etwas später beantworten.
Wir können auch versuchen, den Dump nach etwas Interessantem zu durchsuchen. Im folgenden Beispiel können wir mit dem ImHex Hex-Editor und regulären Ausdrücken den C2-Server finden.
RisePro mit VMProtect
Das Entpacken des VMProtect-Beispiels läuft ähnlich ab. Nachdem die erste System-DLL geladen ist, entpacken wir sie und sehen das gleiche Bild – der C2-Server ist direkt im Dump zu sehen, zusammen mit gut lesbarem Code.
Der Code, der denselben String („CreateDirect3dd11DeviceFromDXGIDevice“) auf den Stack schiebt, sieht dem Schnipsel, den wir im Themida-Beispiel gesehen haben, sehr ähnlich. Daraus können wir schließen, dass die String-Schutzfunktionalität zu RisePro selbst gehört, nicht zum Protector.
Das VMProtect-Beispiel verwendet auch keine Code-Virtualisierung.
Du wirst feststellen, dass sich die C2-Server in den beiden Beispielen zwar unterscheiden, ihre Offsets vom Beginn des Segments aber identisch sind, trotz der unterschiedlichen Protektoren. Das Gleiche gilt für den Code, der den String schiebt und entschlüsselt – die Offsets stimmen überein.
Andere Familien
Neben RisePro werden ähnliche Protektoren auch von Familien wie PrivateLoader, Amadey, Arkei und Lumma verwendet. In jedem Fall wird die Virtualisierungsfunktion ignoriert – die Protektoren werden als einfache Packer verwendet, die die Analyse kaum behindern.
Fordere eine 14-tägige kostenlose Testversion von ANY.RUN an, um alle Sandbox-Funktionen zu testen! |
PrivateLoader
Schauen wir uns das Beispiel an, das mit VMProtect gepackt wurde.
Das PrivateLoader-Beispiel entpackt auf ähnliche Weise, aber im Gegensatz zu RisePro speichert es den C2-Server nicht im Dump. Stattdessen verwendet es einen einfachen XOR-Algorithmus (der nichts mit dem Protector zu tun hat), um ihn zu entschlüsseln. Um das C2 zu erhalten, musst du nur den unten stehenden Code emulieren oder ihn mit einem Debugger durchgehen.
Arkei
Das Arkei-Beispiel ist ebenfalls mit VMProtect gepackt. Nach dem Auspacken erhalten wir lesbaren Code, der die benötigten Funktionen aus den Bibliotheken lädt:
Neben anderen Strings finden wir im Dump auch die DDR-Profile (Dead Drop Resolver) für die C2-Serveradresse.
Lumma
Hier ist das Lumma-Beispiel, das wir uns ansehen werden.
Lumma ist mit VMProtect ausgestattet, und im Gegensatz zu den anderen Beispielen sind hier die Verschleierungsmechanismen aktiviert.
Der ausgepackte Code wird in einer Schleife ausgeführt:
Dies scheint die Technik der Kontrollflussverflachung zu sein. Die Funktion ist in Blöcke unterteilt, denen jeweils eine Nummer zugewiesen ist. Die Schleife wählt bei jeder Iteration aus, welcher Block als nächstes ausgeführt wird.
Inzwischen ist der C2-Server im Dump neben anderen Strings vorhanden:
Amadey
Diese Amadey-Probe ist vollgepackt mit Themida.
Bei Amadey erscheinen die Strings erst nach dem Laden der kernel.appcore.dll im Speicher. Im Gegensatz zu den vorherigen Beispielen sind hier die Anti-Debugging-Mechanismen aktiviert. Um das Laden der kernel.appcore.dll zu erreichen, musst du etwas wie TitanHide verwenden.
Danach kannst du die Datei wie in den vorherigen Beispielen auslagern.
Amadey speichert base64-kodierte Zeichenketten in verschlüsselter Form. Mit dem Dienstprogramm „Strings“ können wir sie aus dem Dump extrahieren:
Um die ursprünglichen Strings zu erhalten, müssen wir sie entschlüsseln (Amadey verwendet seinen eigenen Shuffling-Algorithmus) und von base64 entschlüsseln.
Was ist das Ergebnis?
Wir haben uns mit Themida und VMProtect gepackte Beispiele aus vielen Familien angesehen. Ist dir ein Trend aufgefallen? Fast alle lassen wichtige Funktionen wie Virtualisierung weg. Das macht das Reverse Engineering so viel einfacher! Sie verwenden Protektoren wie einfache Packer, und das verbirgt die Analyse kaum.
Wir können Folgendes sagen: Die größten Herausforderungen, die die Analyse erschweren, sind nicht die Protektoren selbst, sondern die in der Malware selbst implementierten String-Verschleierungs- und C2-Verschleierungstechniken.
Die Entschleierung von Malware ist ein ganz anderer komplexer Bereich, den wir bereits in unserem Blog behandelt haben. Über diesen Link gelangst du zu einer ausführlichen Erklärung der gängigen Verschleierungstechniken, zu Möglichkeiten, sie zu umgehen, und zu Beispielen aus der Praxis, die auf GuLoader basieren. Schau es dir an!
Über ANY.RUN
ANY.RUN hilft mehr als 400.000 Cybersecurity-Experten weltweit. Unsere interaktive Sandbox vereinfacht die Malware-Analyse von Bedrohungen, die sowohl Windows- als auch Linux-Systeme angreifen. Unsere Threat Intelligence Produkte, TI Lookup, Yara Search und Feeds, helfen dir, IOCs oder Dateien zu finden, um mehr über die Bedrohungen zu erfahren und schneller auf Vorfälle zu reagieren.
Vorteile von ANY.RUN
ANY.RUN hilft dir, Bedrohungen schneller zu analysieren und gleichzeitig die Erkennungsraten zu verbessern. Die Plattform erkennt gängige Malware-Familien mit YARA- und Suricata-Regeln und identifiziert Malware-Verhalten mit Signaturen, wenn eine Erkennung nach Familie nicht möglich ist.
Mit ANY.RUN kannst du:
- Malware in weniger als 40 Sekunden erkennen.
- Alle Aspekte des Verhaltens von Malware aufzeichnen und untersuchen.
Probiere die volle Leistung von ANY.RUN kostenlos aus
Kostenlose Testversion anfordern →
Thema:
- News