egodeath
このプロジェクトは識別不能難読化を実現していません。この製品を秘密を保護するために使用すべきではありません。それはリバースエンジニアリングを防ぐのではなく、抑止するために存在します。

人間とLLMの両方にとってコードの読み取りと解析を極めて困難にするように設計されたJavaScript難読化ツールです。TypeScriptで記述されています。査読済みの暗号学的難読化研究の手法を実装しています。
インストール
npm install
npm run build
CLI 使用法
# 基本使用法
node dist/index.js input.js > output.js
# ターゲットトークン予算を指定(デフォルト: 2,000,000)
node dist/index.js --target-tokens 500000 input.js > output.js
# 最小限の難読化(小さい出力)
node dist/index.js --target-tokens 10000 input.js > output.js
# 最大の肥大化(10Mトークン)
node dist/index.js --target-tokens 10000000 input.js > output.js
# 環境変数を使用
INPUT_FILE=input.js node dist/index.js > output.js
# ヘルプ
node dist/index.js --help
オプション
| オプション | デフォルト | 説明 |
|---|
--target-tokens <n> | 2000000 | トークン単位のターゲット出力サイズ。小さな入力はこの制限まで肥大化されます。大きな入力は予算内に収めるために肥大化を抑えます。 |
--help, -h | | ヘルプメッセージを表示 |
npm スクリプト
npm run build # TypeScriptをdist/にコンパイル
npm run start # 難読化ツールを実行(input.jsを読み込む)
npm run test # テストスイートを実行
npm run obfuscate-package # npmパッケージとの互換性テストを実行
プログラム API
const { obfuscate } = require('./dist/obfuscator');
const code = 'function add(a, b) { return a + b; }';
const obfuscated = obfuscate(code);
// オプション付き
const obfuscated = obfuscate(code, { targetTokens: 500000 });
変換パイプライン
難読化ツールは4つのフェーズで20の変換を適用します。各段階は前の段階に基づいて構築されます。
フェーズ1: セキュリティ & アンチ解析事前変換
フェーズ2: 構造的事前変換
フェーズ3: 識別子パス
フェーズ4: 事後変換
デッドコード注入
デッドコードは複数ポイントで2つの生成戦略とともに注入されます:
| 戦略 | ソース | 説明 |
|---|
| テンプレートベース | transforms/deadCodeInjection.ts | 9つのテンプレートタイプ: ループ累積、配列構築、オブジェクト操作、文字列連結、ネスト条件、try/catch、whileカウントダウン、switch計算、ビットチェーン。テンプレートは実際のスコープ変数を参照します。 |
|
デッドコード注入ポイント:
- CFFデッドスイッチケース(関数ごとに約30%追加、予算に応じてスケーリング)
- 不透明述語elseブランチ
- 非CFF関数内のスタンドアロンデッドブロック(予算制御)
研究論文の参考文献
いくつかの変換は査読済みの暗号学的難読化研究に触発されています:
検証ツール
2つの検証ツールが難読化品質を測定します。src/verification/にあります:
Null回路テスト (verification/nullCircuitTest.ts)
実際の関数と「null」関数(同じ形状で何もしない)を難読化し、14の構造的メトリクスを比較してそれらがどの程度区別可能かをスコアリングします。類似性が高いほど難読化が良好です。
import { runNullCircuitTest } from './verification/nullCircuitTest';
const result = runNullCircuitTest(realCode, paramCount, stmtCount, threshold, targetTokens);
console.log('Similarity:', result.similarity); // 0.0-1.0
難読化不可能関数テスト (verification/unobfuscatableTests.ts)
論文1の不可能性証明からの7つのテストケースで、難読化されたコードから秘密を抽出しようと試みます:
import { runAllTests, printSummary } from './verification/unobfuscatableTests';
console.log(printSummary(runAllTests(10000)));
テスト: ポイント関数(パスワード)、マジックナンバー、カナリア文字列、埋め込みキー、URL、正規表現パターン、制御フローシグネチャ。
出力サイズの予算
--target-tokensオプションは、デッドコード注入(主要なボリュームレバー)をスケーリングする肥大化予算を介して出力サイズを制御します。予算ゲート付き変換:
| 予算比率 | 有効な変換 |
|---|
| > 3 | アンチデバッグ、トリップワイヤ、CFF、不透明述語、カンママージ |
| > 5 | プロキシ関数、プロパティキーエンコード、ノイズ注入、自己完全性 |
| > 8 | コンテキストウィンドウ枯渇 |
| > 10 | グローバル変数エンコード |
デッドコード乗数は1倍(比率30)から150倍(比率1500+)の範囲で、デッドスイッチケースと不透明述語ブランチの数とサイズを制御します。
プロジェクト構造
src/
index.ts CLIエントリポイント
obfuscator.ts メインパイプラインオーケストレーター(20変換)
options.ts 予算システムとオプション
types.ts AST型定義
random.ts ランダムUnicode名生成(6〜16文字、16スクリプト範囲)
ast.ts ASTノードファクトリ関数
keywords.ts 動的キーワード発見(globalThis + windowパッケージ)
globals.ts グローバル状態管理(nullプロトタイプマップ)
substitute.ts 識別子置換ユーティリティ
declarations.d.ts モジュール型宣言
passes/
firstPass.ts 識別子カタログ化
secondPass.ts 識別子置換 + 文字列エンコード
thirdPass.ts ダミーパラメータ注入
transforms/
antiDebug.ts eval("debugger")トラップ + setIntervalループ
tripwires.ts パンクチャードプログラム秘密入力チェック [論文 4]
noiseInjection.ts LPNに着想を得た算術ノイズ [論文 7]
controlFlowFlattening.ts while/switch + モジュラー算術ディスパッチ [論文 3]
opaquePredicates.ts 15の常に真/偽数学述語
proxyFunctions.ts コールグラフ平坦化ディスパッチャ
contextExhaustion.ts 三項/voidノイズ(LLMコンテキスト埋め用)
commaExpressions.ts カンマ演算子による文マージ
globalVariableEncoding.ts グローバル用eval+replace
propertyKeyEncoding.ts スコープごとのレジストリを持つ計算プロパティアクセス
numberEncoding.ts 11のビット単位/算術エンコード戦略
selfIntegrity.ts 改ざん防止実行時チェック [論文 10]
stringArrayExtraction.ts 連鎖XOR + 疎位置エラー [論文 2, 9]
deadCodeInjection.ts テンプレート + 突然変異ベースデッドコード [論文 3]
verification/
nullCircuitTest.ts デッドコード品質スコアリング [論文 10]
unobfuscatableTests.ts 秘密抽出テストケース [論文 1]
__tests__/ 21スイートにわたる300以上の単体テスト
tools/
obfuscate-package.ts Webpackベースのnpmパッケージ互換性テスト
tests/
input*.js 元のテスト入力ファイル
テスト
# すべてのテストを実行
npm test
# 特定のテストスイートを実行
npx jest controlFlowFlattening
npx jest tripwires
npx jest noiseInjection
# npmパッケージに対するテスト(リポジトリをクローン、webpackバンドル、難読化、テスト実行)
npm run obfuscate-package # 10パッケージすべて
npm run obfuscate-package -- minimist semver # 特定のパッケージ
互換性テストツール
tools/obfuscate-package.tsツールは、実際のnpmパッケージに対して難読化ツールをテストします:
- パッケージのgitリポジトリをクローン
- すべての依存関係をインストール(テスト用のdevDependenciesを含む)
- ビルドスクリプトがある場合はパッケージをビルド
- webpackを使用してライブラリのメインエントリポイントを単一のCommonJSファイルにバンドル
- バンドルファイルに難読化ツールを実行
- ライブラリのメインエントリを難読化されたバンドルに置き換え
- ライブラリ自身のテストスイートを難読化バージョンに対して実行
出力場所
| パス | 内容 |
|---|
dist/obfuscated/<package>/bundle.js | 各パッケージの難読化されたwebpackバンドル |
dist/obfuscated/report.json | バンドルサイズ、難読化ステータス、テスト出力を含む完全なJSONレポート |
ライセンス
MIT - 著作権 2026 Nicholas Starke