В Интернете есть множество случаев обфускации кода.,90%Все вышеперечисленноедаWebpack
Актуально для обработки обфускации кода.,дляVite
из Очень мало случаев,Решая путаницу в коде проекта Vite, я потратил некоторое время на поиск подходящего плагина для решения этой проблемы.,окончательный выборrollup-plugin-obfuscator
。Кроме того, в главе 4 представленыWebpack
Обработка сценариев обфускации кода.
rollup-plugin-obfuscator
из npm адрес:прямая ссылка
javascript-obfuscator
из githup адрес:прямая ссылка
rollup-plugin-obfuscator
да Rollup Инструмент сборки из плагина для JavaScript Код запутан и сжат. Его основной эффект заключается в увеличении JavaScript Код безопасности и уменьшенный размер генерируемого файла.
rollup-plugin-obfuscator
特别Подходит для фронтенд-проектов.,например веб-приложение,Для повышения безопасности клиентского кода.Обфускация не является абсолютной мерой безопасности,Опытные хакеры все равно могут попытаться расшифровать код. поэтому,Когда требуется более высокий уровень безопасности,Нужны другие меры,Например, аутентификация и шифрование на стороне сервера.
Среда проекта: Vue3+Vite
yarn add --dev rollup-plugin-obfuscator javascript-obfuscator
или
npm install --save-dev rollup-plugin-obfuscator javascript-obfuscator
Во время упаковки будет сообщено об ошибке. Вам необходимо установить следующие зависимости:
yarn add javascript-obfuscator -D
существоватьvite.config.ts
Внедрение плагинов в,и настроить
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import obfuscator from 'rollup-plugin-obfuscator';
export default defineConfig({
// base: "",
build: {
minify: 'esbuild', // по умолчанию
},
esbuild: {
drop: ['console', 'отладчик'], // Удаление пакета
},
plugins: [
vue(),
obfuscator({
global:false,
// optionsЭлементы конфигурация на самом деле javascript-obfuscator варианты, подробности см. на https://github.com/javascript-obfuscator/javascript-obfuscator.
options: {
compact: true,
controlFlowFlattening: true,
controlFlowFlatteningThreshold: 0.75,
numbersToExpressions: true,
simplify: true,
stringArrayShuffle: true,
splitStrings: true,
splitStringsChunkLength: 10,
rotateUnicodeArray: true,
deadCodeInjection: true,
deadCodeInjectionThreshold: 0.4,
debugProtection: false,
debugProtectionInterval: 2000,
disableConsoleOutput: true,
domainLock: [],
identifierNamesGenerator: "hexadecimal",
identifiersPrefix: "",
inputFileName: "",
log: true,
renameGlobals: true,
reservedNames: [],
reservedStrings: [],
seed: 0,
selfDefending: true,
sourceMap: false,
sourceMapBaseUrl: "",
sourceMapFileName: "",
sourceMapMode: "separate",
stringArray: true,
stringArrayEncoding: ["base64"],
stringArrayThreshold: 0.75,
target: "browser",
transformObjectKeys: true,
unicodeEscapeSequence: true,
domainLockRedirectUrl: "about:blank",
forceTransformStrings: [],
identifierNamesCache: null,
identifiersDictionary: [],
ignoreImports: true,
optionsPreset: "default",
renameProperties: false,
renamePropertiesMode: "safe",
sourceMapSourcesMode: "sources-content",
stringArrayCallsTransform: true,
stringArrayCallsTransformThreshold: 0.5,
stringArrayIndexesType: ["hexadecimal-number"],
stringArrayIndexShift: true,
stringArrayRotate: true,
stringArrayWrappersCount: 1,
stringArrayWrappersChainedCalls: true,
stringArrayWrappersParametersMaxCount: 2,
stringArrayWrappersType: "variable",
}
})
]
})
Список ниже да rollup-plugin-obfuscator
Список опций конфигурации плагина, каждая опция используется для настройки метода обфускации и сжатия кода. Каждый вариант описан ниже:
Элементы конфигурации | описывать |
---|---|
| Это далогическое значение, если установлено значение |
| логическое значение, если установлено значение |
| давать возможность Путаница в потоке управления,Усложнить код и поток управления.,Это усложняет понимание кода. |
| Порог запутывания потока управления,влияют на степень путаницы. |
| Если установлено значение |
| давать Возможность упрощения, используемая для удаления ненужного кода. |
| Зашифруйте массив строк, чтобы их было труднее понять. |
| Разбить строку на мелкие кусочки,Увеличьте сложность кода. |
| Управляет разделением строк и размером фрагмента. |
| вращать Unicode Массив символов для увеличения путаницы в коде. |
| Включите раздувание, при котором вставляется мертвый код, что делает код более сложным и затрудняет реверс-инжиниринг. |
| Порог внедрения мертвого кода. |
| Если установлено значение |
| Управляйте интервалом защиты от отладки. |
| Отключите вывод консоли. |
| Ограничьте запуск сценария списком доменных имен. |
| Управлять методом генерации запутанных имен идентификаторов,Например, «шестнадцатеричный». |
| Префикс идентификатора для увеличения путаницы. |
| Введите имя файла. |
| данетдавать Возможность регистрации. |
| да Нет, чтобы переименовать глобальные переменные. |
| Держите список имен идентификаторов. |
| Держите список строк. |
| Используется для генерации случайных чисел из семян. |
| Если установлено значение |
| да Следует ли создавать файлы сопоставления источников. |
| данетдавать Возможность обфускации строкового массива. |
| Массив строк из метода кодирования,Например, «base64». |
| Управляет порогом обфускации строкового массива. |
| Целевая среда, например «браузер». |
| да Нет преобразования имен ключей объектов. |
| Включите escape-последовательности Unicode. |
| Перенаправление блокировки домена изURL. |
| Привести строку из списка. |
| Имя идентификатора из кэша. |
| Словарь идентификаторов для пользовательских имен идентификаторов. |
| да Нет игнорирует импортированные из модулей. |
| Предопределенный набор параметров конфигурации,Например, «по умолчанию». |
| да Нет, чтобы переименовать свойства объекта. |
| Режим переименования свойств объекта, например «безопасный». |
| Сопоставление источника из режима. |
| да Нет вызова массива строк преобразования. |
| Преобразование вызовов строкового массива из порога. |
| Индекс строкового массива по типу,Например, «шестнадцатеричное число». |
| да Следует ли выполнять индексацию или смещение строкового массива. |
| да Нет вращения строкового массива. |
| Обертка строкового массива из количества. |
| данетдавать Возможность оболочки строкового массива из цепочки вызовов. |
| Обертка строкового массива с максимальным количеством параметров. |
| Тип оболочки строкового массива. |
Уведомление,Когда проект относительно большой,Не рекомендуется включать расширение,То естьдаdeadCodeInjection
Значениеfalse
,Никаких настроек не требуетсяdeadCodeInjectionThreshold
изценить
После упаковки,После развертывания на сервере,Ошибка консоли:Uncaught SyntaxError: Unexpected token '<'
。
После нажатия на нее появится следующее:
После запроса информации выяснилось, что возникла проблема со ссылкой на файлы статических ресурсов внутри даVue.
Код ошибки следующий:
let transWorker = new Worker(
new URL("../until/transcode.worker.js", import.meta.url)
);
Решение:Воляtranscode.worker.js
вставитьpublicВнизизstatic文件夹Вниз,Затем измените приведенный выше код:
let transWorker = new Worker(
new URL("/static/transcode.worker.js", import.meta.url)
);
Vue2используется в проектахWebpack
код混淆方案使用webpack-obfuscator
+ javascript-obfuscator
。
Webpack
из Версия先ПроверятьWebpack
из Версия,другойwebpackУстановка версииизwebpack-obfuscator
Версиядругой。
webpack4.x Используйте 2.xиз webpack-obfuscator webpack5.x Используйте 3.xиз webpack-obfuscator
yarn list webpack
var obfuscator = require('webpack-obfuscator');
module.exports = {
configureWebpack: {
plugins: [
new obfuscator({
rotateStringArray: true,
/**[] Можно настроить Исключить запутанные файлы */
}, [])
]
},
}
Более подробную информацию об элементах конфигурации можно найти в третьем разделе главы 2. Эта конфигурация почти такая же, как и выше, при использовании Vite.
{
// Сжатие, без разрывов строк
compact: true,
// данетдавать Сглаживание потока управления (возможность снижает скорость бега в 1,5 раза)
controlFlowFlattening: false,
// Вероятность приложения; в более крупных базах кода рекомендуется снизить это значение, поскольку большое количество преобразований потока управления может увеличить размер кода и снизить его скорость.
controlFlowFlatteningThreshold: 0.75,
// Случайные блоки мертвого кода (увеличенный размер запутанного кода)
deadCodeInjection: false,
// Мертвый блок кода из-за вероятности воздействия
deadCodeInjectionThreshold: 0.4,
// Эту опцию практически невозможно использовать в вкладке «Инструменты разработчика» на вкладке «Консоль».
debugProtection: false,
// Если этот флажок установлен, режим отладки принудительно включается с использованием интервалов на вкладке «Консоль», что затрудняет использование инструментов разработчика и других функций.
debugProtectionInterval: false,
// Отключите console.log, console.info, console.error и console.warn, заменив их пустыми функциями. Это усложняет использование отладчика.
disableConsoleOutput: false,
//Блокируем запутанный исходный код, чтобы он работал только на определенных доменах и/или поддоменах. Из-за этого кому-то очень сложно просто скопировать и вставить ваш исходный код и запустить его где-нибудь еще.
domainLock: [],
//Идентификатор метода путаницы шестнадцатеричный (шестнадцатеричный) искалеченный (короткий идентификатор)
identifierNamesGenerator: 'hexadecimal',
//Добавьте определенный префикс к глобальному идентификатору. Используйте эту опцию при запутывании нескольких файлов, загруженных на одной странице. Эта опция помогает избежать конфликтов между этими файлами и глобальными идентификаторами. Используйте разные префиксы для каждого файла
identifiersPrefix: '',
inputFileName: '',
// Позволяет записывать информацию на консоль.
log: false,
// данетдавать Возможность глобальной переменной и имени функции из-за путаницы
renameGlobals: false,
// Отключить обфускацию и сгенерированные идентификаторы
reservedNames: [],
// Отключить строковый литерал при преобразовании
reservedStrings: [],
// Перемещайте массив по фиксированным и случайным (генерируемым при обфускации кода) позициям. Это затрудняет сопоставление последовательности удаленных строк с их исходными позициями. Этот вариант рекомендуется использовать, если исходный код невелик, поскольку вспомогательные функции могут привлечь внимание.
rotateStringArray: true,
// После обфускации код невозможно улучшить и его необходимо настроить. cpmpat:true;
seed: 0,
selfDefending: false,
sourceMap: false,
sourceMapBaseUrl: '',
sourceMapFileName: '',
sourceMapMode: 'separate',
// Удалить строковые литералы и поместить их в специальный массив
stringArray: true,
// Закодируйте все строковые литералы в stringArray, используя base64 или rc4, и вставьте их в специальные коды, которые декодируют их обратно во время выполнения. true (логическое значение): stringArray использует закодированное значение base64; false (логическое значение): не кодирует значение stringArray; 'base64' (строка): stringArray использует закодированное значение base64; 'rc4' (строка): stringArray использует закодированное значение. rc4. Примерно на 30-50% медленнее base64, но сложнее получить начальное значение. Рекомендуется отключить unicodeEscapeSequence с опцией кодирования rc4, чтобы предотвратить очень большой запутанный код.
stringArrayEncoding: false,
// Настройка строковых литералов приведет к вставке stringArrayиз вероятности.
stringArrayThreshold: 0.75,
// Вы можете установить запутанный код в целевой среде в одно из следующих значений: Браузер;Браузер No Eval;Node
target: 'browser',
// данетдавать запутанные ключи объектавозможность
transformObjectKeys: false,
// позволятьдавать Возможность/Отключить преобразование строк в unicodeпоследовательность Выходные escape-последовательности Unicode значительно увеличивают размер кода и позволяют легко восстановить исходный вид строки. Рекомендуется только для передачи небольшого исходного кода. Возможность этого варианта.
unicodeEscapeSequence: false
}
Я участвую в третьем этапе специального тренировочного лагеря Tencent Technology Creation 2023 с эссе, получившими приз, и сформирую команду, которая разделит приз!