Async Executor

Pro
v7.3.0+

VM を非同期で実行し、バイトコードの復号キーをバンドルに同梱せず実行時に取得できるようにします。

視聴する

Obfuscator.io Async Executor: Async Bytecode Key Getter and Async-Only VM Virtualization

YouTube で視聴

vmAsyncExecutor オプションは非同期の VM エグゼキューターを有効にします。その最大の利点は、vmBytecodeArrayEncodingKeyGetter が Promise を返せるようになること、すなわち 非同期キーゲッター です。これにより復号キーは、コードが最初に実行される時点で同期的に利用可能である必要がなくなり、読み込み時にネットワークリクエスト、IndexedDB、あるいは任意の非同期ソースから取得できるようになります。

バックエンドからキーを取得する手順の完全な解説は、Bytecode Array Encoding Key の外部化を参照してください。

使いどころ

完全に非同期のコードベースには強く推奨されます。 このモードでは async 関数のみが仮想化されます。同期関数は、戻り値を Promise に変えて呼び出し側を壊すことなく非同期化することはできないため、コード全体が async になっているものが最も広くカバーされます。ルートが同期の場合(例えば同期の IIFE や UMD ラッパー)でも機能します。その内部にある最も外側の async 関数が保護され、同期部分は仮想化されません(それ以外の難読化は引き続き適用されます)。

変換されるもの

最も外側の async 関数すべてが対象です(同期ラッパーの内部にネストされたものも含みます)。各チェーンにおける最も外側の async が保護の単位であり、その内部にあるものは同期・非同期を問わずすべてコンパイルに取り込まれます。同期関数と通常のジェネレーターは仮想化されません(それ以外の難読化は引き続き適用されます)。

JavaScript

スキップと警告

非同期キーゲッターが有効な場合、async ジェネレーターも仮想化されません。async ジェネレーターはイテレーターを同期的に返さなければならず、キーを待つことができないためです。デフォルトの vmTargetFunctionsMode: 'root' ではスキップは無言で行われます(選択は自動です)。ただし、何も仮想化されなかった場合は VMNoFunctionsToVirtualize が報告されます。'comment' モードでは、明示的にマークした関数が仮想化できない場合(同期関数であることが判明した場合や、非同期キーゲッター下の async ジェネレーターであった場合)に、警告が報告されます(ダッシュボード、および API レスポンスの warnings 配列)。これらの警告(VMSyncFunctionSkippedInAsyncMode、VMAsyncGeneratorSkippedInAsyncMode)は、warnings オプション(v7.8.0 以降)を使ってタイプごとに抑制できます。

root モードでは、vmWrapTopLevelInitializers が有効でも、vmAsyncExecutor はトップレベルの変数初期化式をプレーンな JavaScript のまま残し、(v7.8.0 以降)VMTopLevelInitializerNotVirtualized 警告にそれらが列挙されます。

要件

  • 非同期キーゲッターには vmBytecodeArrayEncoding が必要です。また、vmBytecodeArrayEncodingKeyGetter は vmBytecodeArrayEncodingKey と組み合わせる必要があります。難読化ツールは、両方が設定されている(または両方とも設定されていない)こと、およびゲッターが式として解析できることを検証し、そうでない場合はビルドを拒否します。
  • 難読化ツールのバージョン 7.3.0 以降。

オプションを有効にするだけでは、エグゼキューターが非同期モードに切り替わるだけです(最も外側の async 関数のみが仮想化されます)。実行時のキー取得を可能にするのはキーゲッターから Promise を返すことであり、それにはさらにキーゲッターを伴うバイトコード配列エンコードが必要です。ゲッターが Promise を返すかどうかはビルド時には確認できないため、vmAsyncExecutor がオフの状態で Promise を返すゲッターを使うと、実行時に失敗します。デコーダーがキーではなく Promise を受け取るためです。

例

JavaScript

完全に同期的なコードベースでは、仮想化の対象となるのは async 関数だけなので、ほとんど何も仮想化されません。エントリーポイントが async でない場合は、同期キーゲッターを使い、vmAsyncExecutor はオフのままにしてください。