Dokumentation
/
VM-Obfuskierung
/

Registerbasierte VM

Registerbasierte VM

Pro
v7.12.0+

Schalten Sie die VM auf ein registerbasiertes Ausführungsmodell um — für schnellere Laufzeit und eine VM-Gestalt, die sich von der Standardvariante unterscheidet.

Die Option vmRegisterBased schaltet die VM von ihrem standardmäßigen stapelbasierten Bytecode auf ein registerbasiertes Ausführungsmodell um. In manchen Fällen verbessert das die Laufzeit-Performance der VM um etwa 15-20 %, zum Preis eines geringfügig größeren obfuskierten Bundles.

Stapelbasiert vs. registerbasiert

Eine stapelbasierte VM hält Operanden auf einem impliziten Stapel: jeder Wert wird abgelegt, von der nächsten Instruktion verbraucht und das Ergebnis wieder abgelegt. Eine registerbasierte VM adressiert ihre Operanden stattdessen direkt, sodass dieselbe Arbeit mit weniger Instruktionen und ohne Push/Pop-Verkehr dazwischen ausgedrückt wird. Daher kommt der Laufzeitgewinn — und auch, warum der Bytecode leicht wächst, denn jede Instruktion muss nun angeben, welche Register sie liest und schreibt, statt sie implizit auf dem Stapel zu lassen.

Keines der beiden Modelle ändert, was Ihr Code tut oder was die VM schützt. Es sind zwei Kodierungen derselben virtualisierten Logik; registerbasiert tauscht einfach ein wenig Größe gegen ein wenig Geschwindigkeit.

Wann man sie einsetzt

Greifen Sie dazu, wenn die VM-Laufzeitkosten zählen. Virtualisierter Code ist konstruktionsbedingt langsamer als reines JavaScript, daher lohnen sich auf einem heißen Pfad — einer Animationsschleife, einem Handler pro Frame, einer engen Parsing-Routine — die ~15-20 %, die der registerbasierte Executor sparen kann, trotz des größeren Bundles. Bei selten laufendem Code ist der Größenaufwand meist nicht gerechtfertigt.

Sie variiert außerdem die Gestalt der VM. Weil sie einen strukturell anderen Bytecode und Executor erzeugt, trägt die Ausgabe einen unverwechselbareren Fingerabdruck als die standardmäßige stapelbasierte VM. Wenn die ausgelieferte VM anders aussehen soll als die verbreitete stapelbasierte — damit sie für generische, musterbasierte Analysen weniger wiedererkennbar ist —, ist dies eine Möglichkeit, sie zu verändern.

Wie es intern funktioniert

Dies ist kein nativer registerbasierter Compiler. Den Bytecode erzeugt weiterhin der reguläre stapelbasierte Compiler genau wie ohne die Option; eine separate Transformationsstufe schreibt diesen Bytecode dann in die registerbasierte Form um. Die praktische Folge: alles andere an der VM-Obfuskierung — Targeting, Bytecode-Kodierung, die Dispatcher-Optionen — verhält sich gleich, weil registerbasiert nachgelagert zu all dem sitzt.

Voraussetzungen

  • Erfordert vmObfuscation — diese Option formt nur die VM um, die vmObfuscation erzeugt.
  • Obfuscator-Version 7.12.0 oder neuer.

Beispiel

JavaScriptObfuscator.obfuscate(code, {
    vmObfuscation: true,
    vmRegisterBased: true
});