Ein Leitfaden: Code Verschleierung Reverse-Engineering

Veröffentlicht: 2021-11-17

Zahlen zur Code-Verschleierung sind einer der beliebtesten Ansätze für die Anwendungssicherheit, um das Hacken von Anwendungen zu verhindern. Es ist eine der am häufigsten vorgeschlagenen AppSec-Bemühungen von Sicherheitsspezialisten auf der ganzen Welt, und es kümmert sich oft um die sehr minimalen Sicherheitsanforderungen Ihrer Anwendung. Diese Strategie wird häufig als wichtiger Abwehrmechanismus gegen Hacking-Versuche eingesetzt und schützt vor typischen Bedrohungen wie Code-Injection, Reverse Engineering und Manipulation der persönlichen Daten von Kunden und Anwendungsbenutzern.

Verschleierung des Codes?

Die Praxis, ausführbare Dateien so zu verschleiern, dass sie nicht mehr verständlich, verständlich oder praktisch sind, wird als Code-Verschleierung bezeichnet. Der Quellcode wurde so verschleiert, dass er unverständlich und für Dritte nur schwer greifbar, geschweige denn ausführbar ist. Die Benutzeroberfläche des Endbenutzers oder die beabsichtigte Ausgabe des Codes sind von der Unklarheit nicht betroffen. Es ist nur ein vorsorglicher Schritt, um den Code für potenzielle Hacker, die Zugriff auf den ausführbaren Code einer Software haben, unbrauchbar zu machen.

Warum ist es notwendig, Code zu verschleiern?

Die Verschleierung von Code ist besonders wichtig für Open-Source-Software, die einen erheblichen Nachteil in Bezug auf die Hackbarkeit zum persönlichen Vorteil hat. Entwickler garantieren, dass das geistige Eigentum ihres Produkts vor Sicherheitsrisiken, illegalem Zugriff und der Entdeckung von Anwendungsfehlern geschützt ist, indem sie das Reverse Engineering eines Programms erschweren.

Unabhängig von der Art der verwendeten Verschleierungstechnik schränkt dieser Ansatz gefährlichen Quellcode ein und gewährleistet unterschiedliche Ebenen der Programmsicherheit. Die Zeit-, Kosten- und Ressourcengründe sprechen alle dafür, Ihren Code aufzugeben, wenn er verschleiert ist, da der dekompilierte Code unlesbar gemacht wird.

Techniken zur Code-Verschleierung

Verschleierung funktioniert auf verschiedenen Ebenen: Sie kann auf der Ebene der semantischen/lexikalischen Codestruktur oder auf der Ebene der Datenstruktur/des Kontrollflusses implementiert werden. Verschleierungsstrategien unterscheiden sich auch je nach Aktion im Code. Im Wesentlichen bestimmt das Sicherheitsteam in Zusammenarbeit mit dem Entwicklungsteam die Art der Verschleierung, die für den Code verwendet werden soll.

Verschleierung sollte umbenannt werden.

Bei diesem Ansatz werden Variablen verwirrend benannt, so dass der eigentliche Zweck ihrer Nutzung geschickt verschleiert wird. Decompiler haben Schwierigkeiten, den Kontrollfluss zu verstehen, da Methoden und Variablen mit verschiedenen Schreibweisen und Nummern umbenannt werden. Diese Verschleierungsmethode wird häufig verwendet, um Anwendungscode für Java-, .NET- und Android-Plattformen zu verschleiern. Dies wird als Layout-Verschleierung klassifiziert, da es direkt auf den Quellcode abzielt, um eine Schutzschicht für die Anwendung bereitzustellen.

Verschleierung von Daten

Diese Methode konzentriert sich auf die im Code verwendeten Datenstrukturen und macht es dem Hacker unmöglich, auf das wahre Ziel des Programms zuzugreifen. Dies kann eine Änderung der Art und Weise beinhalten, wie Daten von der Software im Speicher gespeichert werden und wie diese Daten verarbeitet werden, um das Endergebnis zu erzielen. Dieses Verfahren kann auf verschiedene Arten durchgeführt werden:

1. Verschleierung der Aggregation
Dadurch ändert sich die Art und Weise, wie Daten in der Software gespeichert werden. Arrays könnten beispielsweise in mehrere Sub-Arrays unterteilt werden, auf die dann im gesamten Programm verwiesen werden könnte.

2. Verschleierung der Datenspeicherung
Dies wirkt sich auf die Art und Weise aus, wie Daten im Speicher gespeichert werden. Entwickler können beispielsweise zwischen lokalem und globalem Variablenspeicher wechseln, um die wahre Natur des Variablenverhaltens zu verschleiern.

3. Erhalten von Verschleierung auf Anfrage
Dieser Ansatz ändert die Reihenfolge der Daten, ohne die Funktionalität des Programm-/Codeausschnitts zu ändern. Entwickler erreichen dies, indem sie ein eigenes Modul erstellen, das für jede Instanz der Variablenreferenz aufgerufen wird.

4. Zeichenketten verschlüsseln
Diese Technik verschlüsselt alle lesbaren Zeichenfolgen, was zu unlesbarem Code führt. Wenn die Software ausgeführt wird, müssen sie zur Laufzeit entschlüsselt werden.

5. Verschleierung des Kontroll-/Codeflusses
Die Art und Weise, in der die Kontrolle von einem Teil der Codebasis auf einen anderen übertragen wird, ist entscheidend für das Festlegen des Ziels des Programms. Diesen Fluss zu verschleiern, ist häufig die profitabelste Art, den Spielfluss zu pervertieren. Diese Verschleierungsstrategie hält Hacker in Schach, indem sie es ihnen erschwert, herauszufinden, wie und warum der Code einem bestimmten Pfad folgt.

Das Einfügen von zufälligen und unerwarteten Anweisungen sowie unnötigen Case-Switch-Anweisungen (toter Code), die niemals ausgeführt würden, ist eine der am weitesten verbreiteten Methoden, um diese Verschleierungsstrategie zu erreichen. Diese Behauptungen haben keine andere Funktion, als den angegriffenen Hacker zu verwirren. Im Fall der bedingten Programmorientierung ist diese Änderung in der Reihenfolge der Programmausführungsanweisungen äußerst nützlich.

Verschleierung wird debuggt.

Debug-Informationen sind häufig nützlich, um durch Dekompilieren und erneutes Kompilieren des Quellcodes wichtige Informationen über Programmablauf und Fehler zu ermitteln. Es ist wichtig, solche identifizierenden Daten zu verbergen, indem Sie ihre Identitäten, Zeilennummern ändern oder den Zugriff auf Debug-Daten vollständig deaktivieren.

Verschleierung sollte angegangen werden.

Fehler in der Speicherprogrammierung sind bei Angriffen weit verbreitet, insbesondere in nicht speichersicheren Sprachen wie C und C++. Sicherheitslücken werden häufig durch Fehler wie unkontrollierte Array-Zugriffe verursacht. Der Adressverschleierungsansatz erschwert Reverse Engineering, da die virtuellen Adressen des Codes und der Daten des Programms jedes Mal, wenn der konvertierte Code ausgeführt wird, randomisiert werden. Infolgedessen sind die meisten Angriffe auf Speicherfehler nicht deterministisch und haben eine sehr geringe Erfolgswahrscheinlichkeit.

Personalisierte Codierung

Entwickler verwenden diesen Ansatz, um Zeichenfolgen mit einem benutzerdefinierten Algorithmus zu verschlüsseln und dann eine Decoderfunktion bereitzustellen, um den ursprünglichen Code wiederherzustellen.

Zur Laufzeit übergebene Argumente

Es ist möglich, das Programm so zu modifizieren, dass es Parameter zur Laufzeit erwartet. Um die Variablen zu entschlüsseln, muss der Benutzer sowohl den Code als auch den Entschlüsselungsschlüssel haben.

Um eine mehrschichtige Verteidigungsmethode zum Schutz von Anwendungen vor verschiedenen Sicherheitsbedrohungen zu entwickeln, kann das Sicherheitsteam mehrere Techniken gleichzeitig einsetzen.

Fazit

Zusammenfassend lässt sich sagen, dass Fehlleitung allein bei der Bekämpfung fortgeschrittener Sicherheitsbedenken unwirksam ist. Aufgrund der Verfügbarkeit von KI-Software und der Fähigkeiten von Hackern ist die Entschleierung von Code schwieriger, aber nicht unmöglich. Aus diesem Grund ist Kryptografie kein Allheilmittel für alle Bedenken hinsichtlich der Softwaresicherheit.
Das Entwicklungsteam kann je nach Sicherheitsbedarf, Art des Programms und Leistungsbenchmark verschiedene Ansätze zur Codeverschleierung verwenden, um seinen Code in einer nicht vertrauenswürdigen Umgebung zu sichern. Diese sollten unter Berücksichtigung der Vor- und Nachteile jedes Ansatzes durchgeführt werden. Andere AppSec-Initiativen wie Verschlüsselung, RASP, Vorschriften zur Vorratsdatenspeicherung usw. sollten von dieser Strategie unterstützt werden. In Kombination mit RASP-Lösungen wie AppSealing wird es zu einem wirksamen Gegenmittel für die heutigen Sicherheitsbedenken.