はじめに
「Babel Encrypt」プラグインは、Babel Obfuscator の Ultimate エディションに含まれているコンポーネントです。Enterprise エディションの場合は、別途購入する必要があります。このプラグインは「BabelEncrypt.dll」というアセンブリファイルとして提供され、Babel のコマンドラインツールとそのまま組み合わせて使用できます。使用するには、次のようにコマンドラインでプラグインファイルのパスを指定します。
babel myapp.exe --plugin BabelEncrypt.dll --stringencryption customここで myapp.exe は、難読化するターゲットアセンブリです。文字列暗号化の引数「[custom]」は、組み込みの文字列暗号化アルゴリズムの代わりに、プラグインが提供するアルゴリズムを Babel に使用させるために必要です。
プラグインの引数
Babel Encrypt Plugin は、次の省略可能な引数を受け取ります。
password <string>文字列データの暗号化に使用するパスワードを設定します。暗号化には Triple DES アルゴリズムが使用されます。指定しない場合は、ランダムなパスワードが生成されます。
iterations <number>実行する暗号化パスの数です(既定値:1)。
minStringLength <number>文字列の長さが指定した値より短い場合、その文字列は暗号化されません。このオプションを 0 に設定すると、長さにかかわらずすべての文字列が暗号化されます。これが既定の動作です。0 より大きい値を設定すると、短い文字列を暗号化の対象から除外でき、用途によってはパフォーマンスの向上などの利点が得られることがあります。なお、文字列の最小長に設定する値は、アセンブリに適用される難読化のレベルに直接影響します。
minHashStringLength <number>HASH アルゴリズムで暗号化する文字列の最小長を設定します(既定値:15)。
useLocalVars <true|false>復号メソッドを呼び出すためにローカル変数を作成するかどうかを指定します(既定値:false)。既定ではこのオプションは「false」で、復号メソッドはメソッドのローカル変数を使わずに呼び出されます。「true」に設定すると、復号メソッドはメソッドのローカル変数を使って呼び出されます。これにより、コードをさらにスクランブルし、難読化されたアセンブリの保護を強化できます。復号時にメソッドのローカル変数を使用すると、実行経路がより複雑で予測しにくくなるため、コードの理解とリバースエンジニアリングが難しくなります。ただし、メソッドのローカル変数によって、コードの実行に必要なメモリ使用量と処理時間が増えることがあるため、難読化されたアセンブリのパフォーマンスに影響する場合もあります。
extraControlFlow <true|false>このオプションは、セキュリティのレベルを高め、暗号化された文字列が簡単にリバースエンジニアリングまたはデコンパイルされないように保護するためのものです。有効にすると、暗号化された文字列を含むメソッドに追加の制御フロー難読化が適用され、コードがさらにスクランブルされて理解しにくくなります。既定の設定は通常「false」ですが、必要な難読化と保護のレベルに応じて変更できます。
checkDeobfuscators <true|false>難読化解除ツールを確認するこのオプションは、Babel Obfuscator のセキュリティ機能で、難読化されたコードのリバースエンジニアリングを防ぐのに役立ちます。
難読化解除ツールの存在を確認するかどうかを指定します。難読化解除ツールが検出されると、文字列の復号は行われず、プログラムは何も通知せずに失敗します(既定値:false)。
useCodeEncryption <true|false>文字列の復号メソッドのコードを、Babel Obfuscator のコード暗号化機能で暗号化するかどうかを指定します。このオプションは、コード暗号化が有効な場合にのみ機能します(既定値:false)。
dictionary <path|expression>指定したテキストファイルには、難読化ツールが暗号化しない文字列を決める、文字列または正規表現のリストが含まれます。ファイルは、各行が 1 つの正確な文字列または正規表現パターンを表すように構成します。難読化ツールはこの情報を使って、リストにある文字列を暗号化の処理から除外します。正規表現を使うと、より柔軟に、広い範囲の文字列を除外できます。一方、正確な文字列を指定すると、全体のパターンにかかわらず、その文字列は確実に暗号化されません。
例
Babel Obfuscator のコマンドラインからプラグインを使用する例を、いくつか次に示します。
中程度の保護
プラグインの既定の構成に加えて、難読化解除ツールの検出を有効にします。
babel myapp.exe --plugin BabelEncrypt.dll --stringencryption custom --argument checkDeobfuscators=true完全な保護
この例は、復号の呼び出し元に追加の制御フローを適用し、復号メソッドの呼び出しにローカル変数を使用して、プラグインのすべての機能を有効にする方法を示しています。
babel myapp.exe --plugin BabelEncrypt.dll --msilencryption --stringencryption custom --argument iterations=2 --argument extraControlFlow=true --argument useLocalVars=true --argument useCodeEncryption=true外部辞書の使用
テキストファイルを使って、除外する語の辞書を設定できます。各行には、除外する正確な文字列か正規表現を記述します。
babel myapp.exe --plugin BabelEncrypt.dll --stringencryption custom --argument dictionary=exclusionlist.txtテキストファイル「exclusionlist.txt」の内容:
.*@acme.com
No secret here to encryptDevOps で Babel Encrypt をセットアップする
DevOps 環境や、NuGet パッケージをサポートするその他のビルドシステムで Babel.Obfuscator NuGet パッケージを使用している場合は、Babel Encrypt プラグインをそのままビルドプロセスに組み込めます。
それには、プロジェクトファイルに次の MSBuild の記述を追加します。
<ItemGroup>
<BabelPlugin Include="$(BabelTaskDir)BabelEncrypt.dll" />
</ItemGroup>
<PropertyGroup>
<PluginsArguments>iterations=3</PluginsArguments>
</PropertyGroup>この記述を追加しておくと、DevOps 環境またはビルドシステムでビルドを開始したときに Babel Encrypt プラグインが呼び出され、Babel Obfuscator によるコードの難読化に加えて、追加の暗号化が行われます。
Babel Desktop で Babel Encrypt を設定する
コマンドラインの代わりに、Babel Desktop のインターフェイスからターゲットにプラグインを設定できます。
- キャンバスでアセンブリを選択し、その「設定」を開きます。
- 「ファイルと依存関係」で、
BabelEncrypt.dllのパスを「Plugins」に追加します。 - コマンドパレットから「エンジン プラグイン: 引数名を検出」を実行します。Babel はプラグインが宣言している引数を読み取り、「PluginsArguments」のキーを入力するので、そこに値を入力します。
- 「String Encryption」を
customに設定して、エンジンが組み込みのアルゴリズムではなく、プラグインのアルゴリズムを使用するようにします。 useCodeEncryptionを使用するには、「MSIL Encryption」も有効にします。
プラグインは、お使いのアカウントの権限でローカルのエンジンプロセス内で実行されます。信頼できるプラグイン DLL だけを追加してください。各設定は、選択したアセンブリに適用されます。プラグインが必要なターゲットごとに、この手順を繰り返してください。