Регистровая VM

Pro
v7.12.0+

Переключите VM на регистровую модель выполнения ради более быстрого рантайма и формы VM, отличной от стандартной.

Опция vmRegisterBased переключает VM с её стандартного стекового байт-кода на регистровую модель выполнения. В некоторых случаях это повышает производительность VM во время выполнения примерно на 15-20 %, ценой немного большего обфусцированного бандла.

Стековая и регистровая модели

Стековая VM держит операнды на неявном стеке: каждое значение помещается в стек, потребляется следующей инструкцией, а результат снова помещается обратно. Регистровая VM вместо этого адресует свои операнды напрямую, поэтому та же работа выражается меньшим числом инструкций и без трафика push/pop между ними. Отсюда и выигрыш во времени выполнения — и потому же байт-код немного растёт, ведь каждая инструкция теперь должна прописывать, какие регистры она читает и пишет, а не оставлять их неявно на стеке.

Ни одна из моделей не меняет того, что делает ваш код или что защищает VM. Это две кодировки одной и той же виртуализированной логики; регистровая просто меняет немного размера на немного скорости.

Когда её применять

Прибегайте к ней, когда важна стоимость выполнения VM. Виртуализированный код по своей природе медленнее обычного JavaScript, поэтому на горячем пути — цикле анимации, обработчике на кадр, плотной процедуре разбора — те ~15-20 %, что может сэкономить регистровый исполнитель, оправдывают больший бандл. Для кода, который выполняется редко, затраты на размер обычно не оправданы.

Она также меняет форму VM. Поскольку она порождает структурно иной байт-код и исполнитель, вывод несёт более своеобразный отпечаток, чем стандартная стековая VM. Если вы хотите, чтобы поставляемая VM мало походила на распространённую стековую — чтобы быть менее узнаваемой для типового анализа по шаблонам, — это один из способов её изменить.

Как это устроено внутри

Это не нативный регистровый компилятор. Обычный стековый компилятор по-прежнему генерирует байт-код ровно так же, как и без опции; отдельный этап преобразования затем переписывает этот байт-код в регистровую форму. Практическое следствие в том, что всё остальное в VM-обфускации — таргетинг, кодирование байт-кода, опции диспетчера — ведёт себя так же, потому что регистровая модель стоит ниже по потоку от всего этого.

Требования

  • Требует vmObfuscation — эта опция лишь переформирует VM, которую создаёт vmObfuscation.
  • Версия обфускатора 7.12.0 или новее.

Пример

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