Deobfuskierung: Die Verschleierung rückgängig machen
Genauso wie Reverse Engineers die korrekte Tastenfolge auf dem verschlossenen Kästchen herausfinden können, können sie auch Software entschleiern - die Tricks rückgängig machen, mit denen die Logik versteckt wurde. Dazu gehört oft die Umbenennung von Variablen in etwas Sinnvolles, die Vereinfachung komplexer Codestrukturen und das Entfernen unnötiger Schritte.
Wenn ein Reverse Engineer beispielsweise eine Funktion mit dem Namen F2G findet, könnte sie oder er herausfinden, dass diese Funktion eigentlich ein Produkt zu einem Einkaufswagen hinzufügt, also benennt sie oder er diese Funktion in produkt_zu_einkaufswagen_hinzufügen um, um das Programm verständlicher zu machen. Mit der Zeit können sie mit genügend Aufwand die ursprüngliche Logik der Software rekonstruieren, genau wie beim Lösen des Rätsels des verschlossenen Kästchens.
Verschleierung kann nicht alles verbergen
Auch wenn Verschleierung den Code schwerer lesbar macht, hat sie eine grundlegende Schwäche: Ein Programm muss immer noch echte Anweisungen auf einem Computer ausführen. Egal, wie viel Code verschlüsselt ist, irgendwann muss er mit dem Betriebssystem interagieren - hier kommen die Systemaufrufe (syscalls) ins Spiel.
Ein Syscall ist eine Anfrage, die ein Programm an das Betriebssystem richtet, um grundlegende Aufgaben auszuführen, wie das Lesen einer Datei, das Senden von Daten über das Internet oder die Zuweisung von Speicher. Diese Syscalls müssen strengen, vom Betriebssystem festgelegten Regeln folgen, was bedeutet, dass sie nicht verschleiert werden können.
Dies ist eine wichtige Erkenntnis beim Reverse Engineering. Selbst wenn ein Funktionsname versteckt ist und die Logik voller unnötiger Komplexität ist, muss das Programm dennoch Syscalls ausführen, um irgendetwas Nützliches zu tun. Durch die Überwachung dieser Syscalls kann ein Reverse Engineer auf den wahren Zweck eines Programms schließen, ohne jede Zeile des verschleierten Codes verstehen zu müssen.
Zusammenhang mit .NET
Das .NET-Framework (das für C#-, VB.NET- und F#-Anwendungen verwendet wird) ist im Zusammenhang mit Obfuskation und Reverse Engineering besonders interessant, da .NET-Programme nicht direkt in Maschinencode kompiliert werden. Stattdessen werden sie in Intermediate Language (IL) kompiliert, die dann von der Common Language Runtime (CLR) zur Laufzeit ausgeführt wird.
Da .NET-Anwendungen auf IL basieren, sind sie leichter zu analysieren als nativer Maschinencode. Reverse Engineers können Tools wie dnSpy oder ILSpy verwenden, um ein .NET-Programm zu dekompilieren, und dabei oft große Teile des lesbaren Codes wiederherstellen – selbst, wenn eine gewisse Verschleierung vorgenommen wurde.
Auch wenn ein .NET-Programm stark verschleiert ist, muss es immer noch mit dem zugrunde liegenden Windows-System über P/Invoke oder Systemaufrufe interagieren. Beispielsweise muss ein Programm, das System.IO.File.ReadAllText("secret.txt") aufruft, letztendlich einen Windows-Systemaufruf wie NtReadFile aufrufen, um die Datei zu lesen, und ein Malware-Programm, das versucht, sich in einen anderen Prozess einzuschleusen, könnte System.Diagnostics.Process.Start() verwenden, was letztendlich CreateProcessW in Windows aufruft.
Verfolgen von Systemaufrufen zur Aufdeckung von Verhaltensweisen
Ein Reverse Engineer kann die Verschleierung völlig ignorieren und stattdessen Systemaufrufe überwachen, um herauszufinden, was ein Programm tut. Dies geschieht mit Tools wie:
- Process Monitor (ProcMon) - Zeigt an, mit welchen Dateien, Registry-Schlüsseln und Netzwerkverbindungen ein Programm interagiert.
- WinDbg - Ein Debugger, der laufende .NET-Anwendungen auf einer niedrigen Ebene untersuchen kann.
- API Monitor - Erfasst API-Aufrufe, die von einer .NET-Anwendung gemacht werden.
Da alle Programme irgendwann mit dem Betriebssystem interagieren müssen, kann ein Reverse Engineer Systemaufrufe verfolgen, um herauszufinden, was wirklich passiert. Bei .NET-Anwendungen ist dies sogar noch einfacher, da der Code in einer Zwischenform verbleibt, was die Dekompilierung vereinfacht.
Ganz gleich, wie gut ein Programm seine Logik zu verbergen versucht, es muss immer noch das Betriebssystem bitten, die eigentliche Arbeit zu erledigen - und genau hier kann ein Reverse Engineer ansetzen.
Warum dies wichtig ist
Reverse Engineering und Entschleierung sind aus vielen Gründen relevant, aber besonders wichtig sind sie in Bezug auf IT-Sicherheit. Um den zeitlichen Ablauf eines Cybersicherheitsvorfalls vollständig zu verstehen, ist es unerlässlich, die Funktionalitäten aller beteiligten Tools zu kennen. Dies ist nicht nur wichtig, um den Schaden oder die Datenexfiltrationsmöglichkeiten des Angriffs zu beurteilen, sondern vor allem in der Aufräumphase, um festzustellen, ob Hintertüren zurückgelassen wurden.
Wenn Sie kürzlich eine Software in Ihrem Netzwerk gefunden haben, von dem Sie vermuten, dass es bösartig sein könnte, helfen Ihnen unsere geschulten Reverse-Engineering-Expertinnen und -Experten von BDO Cyber Security gerne bei der Untersuchung und geben Ihnen Empfehlungen und Maßnahmen, die Sie auf der Grundlage der von Ihnen bereitgestellten Probe ergreifen können.