So verstecken Sie Ihren JavaScript-Code vor View Source

So verstecken Sie Ihren JavaScript-Code

Wenn Sie mit Ihrem JavaScript-Code keine Vorsichtsmaßnahmen treffen, erleichtern Sie jedem das Leben, der ihn klonen möchte. Wenn Ihre Programmierprozesse jedoch mehr als einen Klick entfernt sind, bevorzugen Angreifer das Klonen der Software eines Mitbewerbers. Bots und andere Schurken, die das Internet nach AWS- oder Azure-Anmeldeinformationen durchsuchen, kümmern sich normalerweise nicht um verschleierten Code. Die Anmeldeinformationen der nächsten Website können auch zum Minen von Bitcoin verwendet und mit weniger Aufwand geerntet werden.

Das Verschleiern von JavaScript war früher komplex. Der Prozess ist jedoch in den letzten Jahren erheblich einfacher geworden. Heute können und sollten auch kleine Unternehmen ihren Code vor neugierigen Blicken schützen. In einigen Fällen ist das Erhalten der Sicherheit nur ein Aufruf eines Node.js-Pakets entfernt.

In den folgenden Schritten wird ein häufig verwendeter JavaScript-Verschleierer vorgestellt und einige andere Themen im Zusammenhang mit dem vorliegenden Problem behandelt.



01. Versionsprüfung

Unser JavaScript-Obfuscator befindet sich in der Node-Laufzeitumgebung. Beginnen wir mit der Überprüfung der verwendeten Versionen. Die folgende Ausgabe enthält den Versionsstatus auf der Workstation Ihres Unternehmens, der für die folgenden Schritte verwendet wird:

tamhan@tamhan-thinkpad:~$ node --version v8.12.0 tamhan@tamhan-thinkpad:~$ npm --version 6.4.1

02. Installieren Sie das Programm

Javascript-obfuscator sollte im globalen Assemblycache Ihrer Workstation installiert sein. Rufen Sie npm mit dem auf -G Parameter und vergessen Sie nicht, Superuser-Rechte bereitzustellen - der eigentliche Bereitstellungsprozess sollte in wenigen Sekunden abgeschlossen sein.

tamhan@tamhan-thinkpad:~$ sudo npm install -g javascript-obfuscator [sudo] password for tamhan: . . . + javascript-obfuscator@0.18.1 added 103 packages from 162 contributors in 4.4s

03. Erstellen Sie eine Probe

Das Testen der Verschleierung funktioniert am besten, wenn wir einen 'echten' Code haben. Beginnen wir also mit einer kleinen HTML-Webseite. Es lädt eine JavaScript-Datei namens worker.js, deklariert eine Schaltfläche und enthält ein kleines Stück Inline-Scripting. Wenn es in einen Browser geladen ist, klicken Sie auf die Schaltfläche, um ein Textfeld anzuzeigen.

function worker(){ alert(doTheTrick()); } Click Me!

04. Code hinzufügen

Worker.js beginnt mit einer Zeichenfolgenvariablen. Sie sind ein klassisches Angriffsziel. Wenn ein ROM dekodiert werden soll, sucht der Assembler normalerweise zunächst nach Tabellen mit Zeichenfolgenfolgen. Darüber hinaus wird die Verschlüsselung unter Verwendung einer Reihe von Variablen mit sehr 'sprechenden' Namen durchgeführt.

var myString = 'Hello from Future plc' function doTheTrick(){ var chiffrat; chiffrat = rot13(myString); return chiffrat; }

05. Implementieren Sie die Verschlüsselung

Da dies nicht als Verschlüsselung 101 gedacht ist, sollten wir uns für eine vergleichsweise einfache Substitutionsverschlüsselung entscheiden. ROT13 ist nicht schwierig, kann aber sehr ausführlich programmiert werden. Implementierung von Dsoares kommt mit einer Reihe von 'sprechenden' Variablen und bietet viel Nahrung für unseren Verschleierer.

function rot13(str) { var re = new RegExp('[a-z]', 'i'); var min = 'A'.charCodeAt(0); var max = 'Z'.charCodeAt(0); var factor = 13; var result = ''; str = str.toUpperCase(); for (var i=0; i

06. Erste Verschleierung

Das Durchführen eines Verschleierungslaufs des Codes ist einfach. Aufrufen Javascript-Obfuscator und übergeben Sie einen Punkt, um das Programm anzuweisen, alle im aktuellen Arbeitsverzeichnis gefundenen Dateien zu bearbeiten. Dies zeigt das Ergebnis auf der IBM Workstation des Autors:

tamhan@tamhan-thinkpad:~/FutureObfuscate/ code$ javascript-obfuscator .

07. Ausgabe umleiten

Das Auslösen der Dateien direkt in den Containerordner ist ineffizient, da die Namen geändert werden müssen, bevor sie verwendet werden können. Ein besserer Weg beinhaltet die Verwendung der Ausgabe Parameter. Wenn Javascript-Obfuscator Wenn das Programm es findet, generiert es einen Unterordner im aktuellen Arbeitsverzeichnis und speichert dort die Ergebnisse seiner Arbeit.

tamhan@tamhan-thinkpad:~/FutureObfuscate/code$ javascript-obfuscator . --output ./obfusca

08. Analysieren Sie die Ergebnisse

So verstecken Sie Ihren JavaScript-Code: Ergebnisse

wie man in Photoshop von cmyk zu rgb wechselt
Es ist schrecklich, aber es könnte schlimmer sein

Tauchen Sie in den Ordner 'obfusca' ein und öffnen Sie die neue Version von worker.js, um Ihre Augen auf den Gräuel zu richten, der mit diesem Schritt gezeigt wird. Die Formatierung des Codes wurde stark entstellt. Die Methodennamen blieben jedoch unverändert, da sie für externe Aufrufe benötigt werden. Außerdem befinden sich die Zeichenfolgen jetzt in einem Array, in dem ein Angreifer sie bequem ernten kann.

var a0_0xb9e2=['Hellox20fromx20Future x20plc','[a-z]','test','charCodeAt'];

09. Verhindern Sie das Ernten von Fäden

Javascript-obfuscator enthält eine Auswahl von String-Mangling-Algorithmen, die mithilfe von konfiguriert werden können --string-Array-Codierung . Beachten Sie, dass das Ausgabeverzeichnis vor jedem Aufruf geleert werden muss, da das Vergessen dazu führt, dass die Ausgabedateien aus dem vorherigen Lauf 'rekursiv' verschleiert werden.

tamhan@tamhan-thinkpad:~/FutureObfuscate/code$ javascript-obfuscator . --output ./obfusca --string-array-encoding base64

10. Sehen Sie sich die Ergebnisse noch einmal an

Zu diesem Zeitpunkt sieht die Ausgabe unseres Obfuscators anders aus - das Array oben in der Datei ist jetzt viel weniger lesbar. Dies löst jedoch nicht alle Probleme. Wenn Sie einige Verschleierungszyklen durchführen, erhalten Sie möglicherweise einen ähnlichen Aufschlag wie in diesem Schritt:

var a0_0x31e5=['bGVuZ3Ro','dGVzdA==',' ZnJvbUNoYXJDb2Rl','Y2hhckNvZGVBdA==',' dG9VcHBlckNhc2U=']; . . . . . . var myString='Hellox20fromx20Futurex20plc'

11. Randomisierung verstehen

Obfuscators arbeiten in einem Druckfeld zwischen hoher Leistung und Codeschutz. Eine Möglichkeit, das Problem anzugehen, besteht darin, Elemente zu randomisieren. Die zur Laufzeit teuren Verschleierungen werden nicht allen Knoten hinzugefügt, sondern nur einer Teilmenge. Die Erkennung, ob Knoten betroffen sind oder nicht, erfolgt normalerweise über einen Zufallszahlengenerator, dessen Empfindlichkeit eingestellt werden kann.

12. Gehen Sie den Saiten nach

Der oben erwähnte Zufallszahlengenerator gibt Zahlen im Bereich von null bis eins aus. Wenn die Anzahl größer als der Schwellenwert ist, findet die Änderung nicht statt. Rahmen stringArrayThreshold Ein Wert von eins bedeutet, dass alle Zahlen kleiner als der Schwellenwert sind, wodurch sichergestellt wird, dass jede einzelne Zeichenfolge entstellt wird.

tamhan@tamhan-thinkpad:~/FutureObfuscate/code$ javascript-obfuscator . --output ./obfusca --string-array-encoding base64 --stringArrayThreshold 1

13. Injizieren Sie zufälligen Code

Analysetools wie JSNice profitieren von einer kleinen Codebasis. Angesichts der Tatsache, dass Javascript-Obfuscator den Code ohnehin in einen AST zerlegt, spricht nichts gegen das spontane Einfügen von 'Müllcode'. Da diese Funktion zu erheblichem Aufblähen führt, müssen Entwickler sie manuell über die beiden nebenstehenden Parameter aktivieren:

--dead-code-injection --dead-code-injection-threshold

14. Genieße das Chaos

Den Obfuscator mit beiden ausführen --Dead-Code-Injection true und --Dead-Code-Injection-Schwelle 1 set führt zu einer Dateigröße von ca. 2,5KB. Der Versuch, den Code zu verfeinern, führt zu einer fast unverschlüsselbaren Wand aus meist tautologischem JavaScript.

15. Ändern Sie den Programmablauf aggressiv

Das Aufteilen von Code in einen AST ermöglicht tiefgreifende Transformationen. Einstellen der controlFlowFlattening Das Attribut true gibt dem Programm an, dass es Funktionsaufrufe deaktivieren kann. Dies führt zu einer erheblichen Erweiterung des generierten Codes. Beachten Sie, dass die Ergebnisse einen Leistungseinbruch von 150 Prozent bewirken können.

16. Ärgern Sie den Debugger

Artefakte aus dem Debuggen sind das weltweit größte Geschenk an Hacker. Ein paar Aufrufe von console.log () und seinen Freunden können einem Angreifer wertvolle Informationen darüber geben, was im Programm passiert - ein gutes Beispiel wäre das gezeigte Snippet:

function doTheTrick() { var chiffrat; console.log('Preparing to encrypt chiffrat'); chiffrat = rot13(myString); console.log('Returning chiffrat'); return chiffrat; }

17. Bewerten Sie technische Probleme

Wir können versuchen, das Programm mit dem folgenden Befehl erneut zu verschleiern. Es deaktiviert die String-Caching-Funktion und sollte die Konsolenprotokollierung über die Umleitung deaktivieren.

tamhan@tamhan-thinkpad:~/Desktop/ DeadStuff/2018Nov/FutureObfuscate/code$ javascript-obfuscator . --output ./obfusca --string-array-encoding false --disableConsoleOutput true

18. Spielen Sie Katz- und Mausspiele

Obfuscator- und Browser-Anbieter kämpfen lange und erbittert um die Debugger-Funktion. Aus diesem Grund funktionieren 'aggressive' Maßnahmen, wie die Konsolenumleitung der Programmflussunterbrecher, die mit diesem Schritt gezeigt werden, normalerweise nicht lange.

debugProtection: false, debugProtectionInterval: false,

19. Schnelle Online-Verschleierung

Die Installation des gesamten Node.js-Pakets zur Verschleierung einer oder zweier Dateien ist sinnlos. Besuch obfuscator.io um auf eine Online-Version des Programms zuzugreifen, das sich in Ihrem Browser befindet. Mit den Kontrollkästchen und den Kombinationsfeldern unterhalb der Haupteingabe können Sie das Programmverhalten wie in den obigen Schritten beschrieben ändern.

20. Erfahren Sie mehr

So verstecken Sie Ihren JavaScript-Code: Weitere Informationen

Klicken Sie hier, um alle benötigten Parameter anzuzeigen

Das Entwicklerteam führt eine relativ detaillierte Dokumentation, in der erläutert wird, wie die verschiedenen Befehlszeilenparameter miteinander interagieren. Einfach besuchen Kopf hier Wenn die oben gezeigte Ausgabe der Kurzhilfe Ihnen nicht dabei hilft, Ihr Ziel zu erreichen.

21. Der Todfeind eines Verschleierungsers

So verstecken Sie Ihren JavaScript-Code: JS Nice

Verwendung des Farbersetzungswerkzeugs in Photoshop CC
JS Nice ist eine einfache Möglichkeit, Ihren Code unlesbar zu machen

Die ETH Zürich bietet einen Entschärfungsservice an jsnice.org . Es verwendet neuronale Netze und eine Wissensdatenbank, die aus vorhandenem Code besteht, um Variablennamen zu bestimmen. Während das Auffrischen der Formatierung normalerweise ziemlich gut funktioniert, sind einige der Namen - wie z pixelSizeTargetMax in der Verschlüsselungsroutine, die diesen Schritt begleitet - kann ziemlich amüsant sein.

function rot13(PL0) { /** @type {!RegExp} */ var insufficientRegExp = new RegExp (a0_0x395d('0x1'), 'i'); var pixelSizeTargetMax = 'A' ['charCodeAt'](0); var zeroSizeMax = 'Z'['charCodeAt'](0); /** @type {number} */ var minh = 13; /** @type {string} */ var out = '';

Generate, die preisgekrönte Konferenz für Webdesigner, kehrt vom 24. bis 25. April nach NYC zurück! Um Tickets zu buchen, besuchen Sie www.generateconf.com

Generate, die preisgekrönte Konferenz für Webdesigner, kehrt vom 24. bis 25. April nach NYC zurück! Um Tickets zu buchen, besuchen Sie www.generateconf.com

Dieser Artikel wurde ursprünglich in Ausgabe 283 des Creative Web Design Magazins veröffentlicht Webdesigner . Ausgabe 283 hier kaufen oder Abonnieren Sie hier den Web Designer .

Zum Thema passende Artikel: