0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

JavaScriptを「粉砕」し、論理の迷宮を構築する動的保護エンジン「KinetiCrypt」の設計

0
Last updated at Posted at 2026-02-08

Webフロントエンドにおいて、クライアントサイドに配信されるソースコードの「隠匿」は、長年解決不可能な課題とされてきました。ブラウザが解釈できる形式である以上、原理的に100%の秘匿は存在しないからです。

本プロジェクト「KinetiCrypt」は、既存の難読化(Minifyや変数名置換等)の限界を突破するために開発しました。JavaScriptを「独自の暗号化バイナリ」へと自動コンパイルし、言語としての痕跡を完全に抹消することで、解析コストを物理的に極限まで引き上げる動的保護エンジンです。

1分で分る紹介記事はこちら:誰でも覗けるJavaScriptのコードを守ろうとした結果

開発の動機はWebの覇者たちが描く「防衛の極致」への挑戦でした

このプロジェクトを始めたきっかけは、YouTube(Google)やAkamai、Cloudflareといった「Webの覇者」たちが、ボット対策やDRMのために行っている高度なロジック保護技術に触れたことでした。彼らのコードは、もはや人間が読むことを拒絶しており、実行のたびに姿を変える「生きた迷宮」のようです。

その不可能を可能にする超エキサイティングな機構を自分の手で再現したい。その衝動が、このKinetiCryptというプロトタイプを誕生させました。

1. JavaScriptを「器」として再定義する設計思想

一般的な難読化ツールは、JavaScriptの文法の範囲内で「読みにくくする」に留まります。しかしKinetiCryptは、JavaScriptを単なる 「独自VM(仮想マシン)を実行するための物理レイヤー」 として定義します。

人間が記述したロジックは、サーバーサイドのPHPエンジンによって一度「解体」され、スタックベースの独自命令セットへと再構築されます。ブラウザに届くコードからは、元の関数の境界や変数の文脈、プログラミング言語としての「お作法」が完全に消失しています。

さらに本システムは、アクセスごとにオペコード(命令番号)、メモリマップ、バイト列の暗号化方式、そしてソースのスクランブル方法をすべて動的に変化させます。一度解析に成功したとしても、ページをリロードした瞬間にその知識は無効化される。まさに「動的生成ダンジョン」のようなカオスを生成します。

独自の高レベルDSLによるコンパイラ基盤

本システムの核心は、PHP上に構築された独自のコンパイラ基盤です。単なるバイト列の命令の羅列ではなく、when() や while_lt() といった流れるようなインターフェース(Fluent Interface)によるDSLを実装しました。これにより、複雑なアルゴリズムをVM命令へと直感的にコンパイルすることを可能にしています。

コンパイラ内部では以下の処理を動的に行っています:

  • 動的レジスタ割り当て: 変数ごとにランダムなメモリアドレスを割り当て、ビルドごとにメモリマップを書き換えます。
  • 不透明述語(Opaque Predicates)の挿入: 実行フローには影響しないが静的解析では判定不可能なダミーの分岐を自動挿入し、解析者の計算資源を浪費させます。
  • XTEA暗号のVMネイティブ実装: 認証データの暗号化ロジックそのものをVM命令として実装することで、暗号化アルゴリズム自体のリバースエンジニアリングを困難にしています。
// 難読化されたVMコアの構造(概念)
// 実行ごとに命令番号の意味が変わり、制御フローが平坦化される
while (_ip < _bytecode.length) {
    let _op = _bytecode[_ip++];
    switch (_op) {
        case 0xAF: // 加算命令(リクエストごとにランダムな番号へ割り当て)
            _stack.push(_stack.pop() + _stack.pop());
            break;
        case 0x66: // 報復トラップ:解析を検知した場合に発動
            if (activeTraps) _triggerReDoS();
            break;
        // ...数百のケースに分岐し、論理の追跡を遮断する
    }
}

2. 圧倒的な情報の非対称性を生む「3つの粉砕」

解析者が持つ「標準的な知識」を無力化するため、以下の3つのレイヤーでコードを粉砕します。

A. システム名の完全な抹消(Symbol Pulverization)

fetchString.fromCharCode といった標準APIは、解析者にとって重要な道標です。KinetiCryptは、これらの識別子を文字列レベルで解体し、実行時に動的なリフレクションを用いて復元します。ソースコード上に「API名」というヒントは一切残りません。

// Before
const data = String.fromCharCode(65, 66, 67);
fetch('/api/validate', { body: data });

// After (KinetiCryptによる粉砕後)
// API名は三項演算子、エスケープ、ノイズ注入によって「砂嵐」化される
self[(!1?'x':'St')+'ri'+'ng'][('fro'+'mCh'+'arCo'+'de')](65, 66, 67);
self[('f'+'et'+'ch')]((!0?'/a':'z')+'pi'+'/v'+'al'+'id'+'ate', { ... });

B. 独自VMコンパイラによる「論理のバイナリ化」

ソースコード上のif文やループといった制御構造は、すべて独自のバイトコードへとコンパイルされます。

  • Dynamic Opcode Shuffling: ビルドごとに「加算」や「分岐」を司る命令番号をシャッフル。
  • Control Flow Flattening: 本来の制御構造を解体し、巨大なディスパッチャの下で平坦化。

これにより、静的解析ツールによるパス解析を物理的に困難にします。

C. Rhythm Breaker:視覚的エントロピーの最大化

人間やAIがコードを「遠目で見たとき」に感じる規則性(Rhythm)を排除します。文字列の分割単位を1文字から5文字の間で不規則に変動させる「Length Jitter」や、Hex、Unicode、テンプレートリテラルをランダムに混在させることで、視覚的なデータ境界を抹消します。

3. 解析行為への物理的報復(Active Retaliation)

解析者が「安全な場所」からコードを覗こうとする行為を、物理的なリソース消費へと強制的に転換させます。

  1. Hexspeak Decoy: 0xFEEDBADC0DE(腐ったコードを食え)というメッセージを、ビット演算を用いた高度な鍵生成ロジックに見せかけて配置します。解析者に「ここには意味がある」と誤認させ、無益な時間を奪います。
  2. ReDoS (Regex DoS) Trap: デバッガの起動や整形(Pretty Print)を検知した瞬間、バックトラックが指数関数的に爆発する正規表現を実行。解析者のブラウザスレッドを永久にロックさせます。

4. プロフェッショナルとしてのセキュリティ・ポリシー

本プロジェクトの核心である「サーバーサイド・コンパイルエンジン」は、意図的に非公開としています。

このシステムは、フロントエンドのロジックを守るための「盾」であり、同時に「情報の非対称性」を利用した強力な「マルウェアを隠匿する武器」としての側面を持ちます。生成ロジック自体を秘匿することで、リバースエンジニアリングの自動化を不可能にし、クライアントサイドにおける究極の機密保持を実現しています。

「理解を拒絶するほどの混沌のなかにのみ、真の平穏が存在する」

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?