Регистровая VM
Переключите 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
});
