【世界一わかりやすい解説】webpack-obfuscatorを使ってTypeScriptを難読化をするには?
この記事の目次
- 初期化
ディレクトリと package.json を作成します。
[/Users/horyu] mkdir nandoku [/Users/horyu] cd nandoku [/Users/horyu/nandoku] npm init This utility will walk you through creating a package.json file. It only covers the most common items, and tries to guess sensible defaults. See `npm help init` for definitive documentation on these fields and exactly what they do. Use `npm install <pkg>` afterwards to install a package and save it as a dependency in the package.json file. Press ^C at any time to quit. package name: (nandoku) version: (1.0.0) description: entry point: (index.js) test command: git repository: keywords: author: horyu license: (ISC) WTFPL About to write to /Users/horyu/nandoku/package.json: { "name": "nandoku", "version": "1.0.0", "description": "", "main": "index.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, "author": "horyu", "license": "WTFPL" } Is this OK? (yes) [/Users/horyu/nandoku] # private: true を追加 cat <<< `jq '.+ {private: true}' < package.json` > package.json [/Users/horyu/nandoku]
- TypeScriptとWebpackのビルド環境を整える
最新版TypeScript+webpack 5の環境構築まとめ(React, Vue.js, Three.jsのサンプル付き) - ICS MEDIA を参考に作ります。
[/Users/horyu/nandoku] npm i -D webpack webpack-cli typescript ts-loader added 133 packages, and audited 134 packages in 8s 18 packages are looking for funding run `npm fund` for details found 0 vulnerabilities [/Users/horyu/nandoku] json Copy code { "name": "nandoku", "version": "1.0.0", "description": "", "main": "dist/index.mjs", "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, "author": "horyu", "license": "WTFPL", "private": true, "devDependencies": { "ts-loader": "^9.4.1", "typescript": "^4.8.4", "webpack": "^5.74.0", "webpack-cli": "^4.10.0" } }
{ "compilerOptions": { "sourceMap": true, "target": "ES5", "module": "ES2015", "strict": true, "forceConsistentCasingInFileNames": true } }
const resolve = require('path').resolve; module.exports = { mode: "production", entry: "./src/index.ts", output: { path: resolve(__dirname, "dist"), library: { type: 'module', }, }, experiments: { outputModule: true, }, module: { rules: [ { test: /\.ts$/, use: "ts-loader", }, ], }, resolve: { extensions: [".ts"], }, };
- 通常のビルドをする
適当にTSを書きます。
export function fizzbuzz(n: number): number | string { if (n % 15 === 0) { return 'FizzBuzz'; } else if (n % 3 === 0) { return 'Fizz'; } else if (n % 5 === 0) { return 'Buzz'; } else { return n; } }
import { fizzbuzz } from "./fizzbuzz"; export { fizzbuzz as MyFizzBuzz }; for (let i = 1; i <= 30; i++) { console.log(fizzbuzz(i)); }
ビルドします
[/Users/horyu/nandoku] npx webpack
- webpack-obfuscatorを導入
[/Users/horyu/nandoku] npm i -D javascript-obfuscator webpack-obfuscator
- プラグインで難読化
webpack.config.js に webpack-obfuscator プラグインを追加します。
const resolve = require('path').resolve; const WebpackObfuscator = require('webpack-obfuscator');
// webpack.config.js module.exports = { // ... (前のコード) plugins: [ // ... (前のコード) // webpack-obfuscator プラグインの設定 new WebpackObfuscator( { compact: true, controlFlowFlattening: true, controlFlowFlatteningThreshold: 0.75, deadCodeInjection: true, deadCodeInjectionThreshold: 0.4, debugProtection: false, debugProtectionInterval: false, disableConsoleOutput: true, identifierNamesGenerator: 'hexadecimal', log: false, numbersToExpressions: true, renameGlobals: false, rotateStringArray: true, selfDefending: true, shuffleStringArray: true, simplify: true, splitStrings: true, splitStringsChunkLength: 5, splitStringsMaxLength: 20, stringArray: true, stringArrayEncoding: 'base64', stringArrayIndexShift: true, stringArrayWrappersCount: 5, stringArrayWrappersChainedCalls: true, stringArrayWrappersParametersMaxCount: 5, stringArrayWrappersType: 'function', unicodeEscapeSequence: false, }, // プラグインを適用する対象のファイル ['main.js'] ), ], };
ここで、webpack-obfuscator プラグインの設定オプションを調整することができます。異なるオプションの組み合わせを試して、プロジェクトに最適な難読化設定を見つけてください。
最後に、ビルドを再実行します。
[/Users/horyu/nandoku] npx webpack
これで、指定されたファイル(ここではmain.js)が難読化されます。
難読化が正常に行われた場合、dist ディレクトリ内に main.js ファイルが生成され、その中身が難読化されたコードになります。試してみて、うまくいけば難読化が設定されているはずです。
もし何か問題があれば、エラーメッセージやコンソールの出力を確認して、問題を特定しましょう。