仮想マシンによる JavaScript 難読化
JavaScript 難読化ツール
JSVeil は JavaScript を独自のバイトコードに変換し、生成した仮想マシンで実行します。元の動作を保ちながら、ブラウザー上のコードの解析・複製・改変を難しくします。
今すぐ試すconst project = {
name: "JSVeil",
greeting: "Hello",
excited: true
};
function createFormatter(settings) {
const prefix = settings.greeting + ", ";
let calls = 0;
return function (name) {
const label = String(name).trim() || "friend";
calls += 1;
let suffix = "";
if (settings.excited) {
for (let i = 0; i < calls && i < 3; i++) {
suffix += "!";
}
} else {
suffix = ".";
}
return prefix + label + suffix;
};
}
const greet = createFormatter(project);
console.log(greet(project.name));
(function/* JSVeil */ He(Y,d){const Q=d.Object,ee=d.Array,T=d.Function,fe=d.Reflect,S=d.Error,G=d.TypeError,ae=d.ReferenceError,Bt=d.RegExp,dt=d.BigInt,Ft=d.atob,bt=d.String.fromCharCode,Z=fe.apply,Ut=fe.construct,B=Q.defineProperty,Je=Q.getOwnPropertyDescriptor,F=Q.freeze,E=Math.imul,we=T.prototype.toString,ge=T.call.bind(T.call),Ne=T.call.bind(d.String.prototype.charCodeAt),kt=T.call.bind(ee.prototype.slice),Re=T.call.bind(ee.prototype.push),he=T.call.bind(ee.prototype.pop),qt=T.call.bind(ee.prototype.lastIndexOf),X=T.call.bind(WeakMap.prototype.get),me=T.call.bind(WeakMap.prototype.set);function ye(e){let t=2166136261;for(let n=0;n<e.length;n++)t=E(t^Ne(e,n),16777619);return t>>>0}const ve={},Qe=new WeakMap;let Xe=0;B(ve,"v",{get(){return Xe++,7}}),me(Qe,ve,9);const Ye=ve.v^7|Xe^1|X(Qe,ve)^9|E(2147483647,3)^2147483645,z=ye(Z(we,He,[]))^Ye,Ae=d.atob(Y[0]);let $=Y[1]^z;const Ce=new Uint8Array(Ae.length);for(let e=0;e<Ae.length;e++)$^=$<<13,$^=$>>>17,$^=$<<5,Ce[e]=Ne(Ae,e)^$&255;function Ze(e,t){if(!t)return e;if(t<0||t>134217728)throw new S;const n=new Uint8Array(t);let o=0,r=0;function i(f){if(f===15){let u;do{if(o>=e.length)throw new S;u=e[o++],f+=u}while(u===255)}return f}for(;o<e.length;){const f=e[o++],u=i(f>>>4);if(o+u>e.length||r+u>t)throw new S;if(n.set(e.subarray(o,o+u),r),o+=u,r+=u,o===e.length)break;if(o+2>e.length)throw new S;const c=e[o++]|e[o++]<<8;if(!c||c>r)throw new S;const a=i(f&15)+4;if(r+a>t)throw new S;if(a<=c)n.set(n.subarray(r-c,r-c+a),r),r+=a;else for難読化に失敗しました
入力
example.js出力
// 処理結果がここに表示されます。
処理後にコピーまたはダウンロードできます。JSVeil について
JSVeil は、仮想マシン(VM)を使って JavaScript を難読化するツールです。コードの解析やリバースエンジニアリングを難しくし、必要に応じて保護機能を設定できます。
無料版
30 KB まで無料です。
難読化のカスタマイズ
コードの難読化方法や実行時の制限を設定できます。各オプションは個別に有効にできます。
カスタムシード
シードは難読化時のランダムな変換に使われます。ソース、設定、コンパイラーのバージョン、シードが同じなら、同じ結果を再現できます。
オフの場合、難読化するたびに暗号学的に安全なランダムシードが自動生成されます。
グローバル識別子の変更
対象となるグローバル変数や関数の名前を変更し、元のコード構造を読み取りにくくします。
有効にする前に、HTML、別のスクリプト、公開 API からこれらの名前を参照していないか確認してください。
偽の制御フロー
ダミーの分岐を追加し、実際の処理経路を追いにくくします。
出力サイズや実行時間が増える可能性があります。初期状態はオフです。必要に応じて有効にしてください。
実行環境のチェック
有効にすると、自動化ツール、jsdom、Node.js などの環境での実行を制限します。
ブラウザーでのみ実行できます。
ドメイン制限
単一・複数のホスト名と、サブドメインのワイルドカードに対応します。国際化ドメイン名は ASCII 表記に変換されます。
*.example.com に example.com 自体は含まれません。必要なら別途追加してください。
開発者ツールの検出
開発者ツールが開かれているか定期的にチェックします。初期値は 1,500 ミリ秒ごとです。
検出すると、実行時の保護機能が作動します。
VM のタイムアウト検出
有効にすると、デバッグなどによって保護されたコードの実行が長時間中断していないかを確認します。初期設定では、15 秒以上の中断を検出するたびに 1 回と数え、合計 2 回に達すると、その VM でのコードの実行を停止します。
判定に使うのは長い中断の回数で、コードの合計実行時間ではありません。1 回と数える中断の長さと、実行を停止するまでの回数は変更できます。
コンソール出力の無効化
難読化されたスクリプトの実行時に、コンソール出力を無効にします。
本番環境でログが不要な場合に使えますが、不具合の調査は難しくなります。
デバッグ対策
debugger 文を定期的に実行し、デバッグを妨げます。初期値は 1,000 ミリ秒ごとです。
よくある質問
JSVeil とは何ですか?
JSVeil は、仮想マシン(VM)を使って JavaScript を難読化するツールです。コードの解析やリバースエンジニアリングを難しくし、必要に応じて保護機能を設定できます。
JavaScript の VM 難読化とは何ですか?
保護するコードを独自のバイトコードに変換し、JavaScript で書かれた仮想マシン(VM)で実行する難読化手法です。出力ファイルにはバイトコードと VM が含まれます。元の処理を読み解くには VM の動作も理解する必要があるため、コードの解析やリバースエンジニアリングが難しくなります。
ソースコードは保存されますか?
保存しません。ソースコードは今回の難読化処理にのみ使用し、処理後は保持しません。
無料で使えますか?
はい。30 KB までの JavaScript ファイルを無料で難読化できます。お手元のコードで気軽にお試しください。
より強力な難読化や、より大きなファイルへの対応が必要な場合は?
ご要望は までお寄せください。プロジェクトに合わせたカスタム対応についてご相談いただけます。