コマンドラインリファレンス
Babel Obfuscator のコマンドラインツールは、さまざまなオプションを受け付けます。各オプションの先頭には、ハイフンを 2 つ付けます。以降のセクションでは、コマンドラインで入力できる各オプションについて説明します。
その他
これらのオプションは通常、難読化の一般的な機能や、Babel Obfuscator によるターゲットアセンブリの扱い方を設定するために使用します。
—help [option]
パラメーターを付けずに「—help」と入力すると、メインのヘルプメニューが表示されます。パラメーター [option] を指定すると、Babel は指定されたコマンドの詳細なヘルプを表示します。たとえば、次のように入力します。
--help stringsすると、次の情報が出力されます。
stringencryption (nostringencryption, no-stringencryption, string-encryption, no-string-encryption, strings, no-strings)
usage: --[no]stringencryption [name]
Enable ([no]disable) string encryption (default: disabled)
When enabled, all the user strings in the target assembly will be encrypted. The
optional parameter name sets the encryption type.
hash - Compressed hash table. The strings are arranged into compressed encrypted hash table data. This algorithm ensures tamper protection.
xor - Inline xor strings.
stream - Authenticated per-string encryption, decrypted lazily. Fully managed (AOT/trim/FIPS safe).コマンドに使用できるエイリアスの一覧に続いて、コマンドの使用方法と短い説明が表示されます。
—[no]logo
このオプションは、起動時に Babel Obfuscator の著作権メッセージを表示するかどうかを制御します。省略可能なプレフィックス [no] を指定すると、著作権メッセージは表示されません。
—format <format>
11.7.0 以降で使用できます。
stdout の出力形式を選択します。指定できる値は text(既定)、json、ndjson です。json または ndjson を指定すると、babel.cli.v1 スキーマに準拠した構造化ストリームが生成され、人が読むための診断メッセージは stderr に送られます。
babel myapp.exe --format=json > result.json
babel myapp.exe --format=ndjson | jq -c 'select(.level=="error")'同じフラグで、--help と --version も機械可読な表現に切り替わります。スキーマ、例、完全なリファレンスについては、AI に適したモードのページを参照してください。
—quiet (-q)
11.7.0 以降で使用できます。
ロゴバナーを抑止し、対話型のパスワードプロンプトが入力を待ってブロックする代わりに、明示的なエラーを出してただちに失敗するようにします。無人実行やエージェントからの実行でも安全に使用できます。
babel myapp.exe --quiet --keyfile mykey.pfx --keypwd env:KEY_PWD—strict-exit
11.7.0 以降で使用できます。
意味を持つ終了コードを有効にします。0 は成功、10 は無効な引数、20 は入力が見つからない、30 は難読化の失敗、40 はライセンスの失敗、50 はキーまたは署名の失敗を表します。このフラグを指定しない場合は、従来の 0/1 の規約が維持されます。完全な表と exitReason の意味については、AI に適したモード:—strict-exit を参照してください。
—license [path|env]
省略可能な引数を指定しない場合は、使用可能なライセンスの情報を表示します。必要に応じて、ライセンスファイルのパスを指定できます。
babel --license C:\Babel\babel.licensesまたは、Babel がライセンスファイルを検索するディレクトリを指定することもできます。
ライセンスキーがある場合は、次のように env オプションを使用して Babel に渡すことができます。
babel --license env:BABEL_LICENSE_KEYここで、BABEL_LICENSE_KEY は、ライセンスキーを格納した環境変数です。
—verbose <n>
コンソール出力の詳細レベルを設定します。「<n>」は必須で、負でない整数を指定します。0 を指定すると、難読化中にメッセージは表示されません。10 より大きい数値を指定すると、Babel はデバッグ情報を表示します。
—noconfig (@)
コマンドラインの値について、既定の構成の読み込みをスキップします。指定すると、「babel.exe.config」ファイルにある既定値はすべて無視されます。
babel myapp.exe --noconfig
babel myapp.exe @—nowarn <warn list>
1 つ以上の警告メッセージの通知を抑止します。パラメーター「<warn list>」は、コンマで区切った警告 ID のリストです。Babel は、「nowarn」オプションに渡された番号の警告を、通知せずに無視します。
—[no]warnasinfo [warn list]
情報メッセージに格下げする警告のリストを指定します。「[warn list]」は、コンマで区切った警告 ID のリストで、省略できます。
—[no]warnaserror [warn list]
エラーとして扱い、難読化の処理を停止させる警告のリストを指定します。「[warn list]」は、コンマで区切った警告 ID のリストで、省略できます。
—[no]statistics [file]
難読化の統計を生成するかどうかを指定します。統計は、プログラムの終了時にログに出力するか、ファイルを指定した場合はそのファイルに保存できます。
次の追加オプションを使用できます。
full=[on/off] Whether to collect additional method statistics完全な難読化統計を有効にすると、CYC(循環的複雑度)などの、メソッドに関する追加情報が収集されます。特に型の数が多いアセンブリを処理する場合は、リソースの消費が増える可能性があります。
コンソール出力から取った難読化統計の例を次に示します。
Babel statistics:
Random seed: 6dfabc3f1a479d66
Experimental features: false
Multithread obfuscation: true
Rules phase, elapsed time 00.000s
Processed rules: 0
Agent phase, elapsed time 00.046s
Renaming phase, elapsed time 00.082s
Unicode normalization: off
Flatten namespaces: on
Overloaded renaming: off
Virtual functions: on
XAML renaming: on (res)
Symbols statistics:
76/[ 106] types: 71.70 %
0/[ 2] events: 0.00 %
82/[ 236] methods: 34.75 %
7/[ 22] properties: 31.82 %
219/[ 258] fields: 84.88 %
384/[ 624] overall: 61.54 %
Encrypt Strings phase, elapsed time 00.016s
String algorithm: hash (.NET Core)
Number of encrypted strings: 266—[no]agent (a)
このオプションは、難読化エージェントを有効または無効にします。有効にすると、エージェントはコードの静的解析を実行し、難読化されたアプリケーションの誤動作につながるおそれのある、ターゲットアセンブリのシンボルのリネームや難読化を防ぎます。
—assemblyname <option>
このオプションを使用すると、ターゲットアセンブリの名前の決め方を柔軟に指定できます。
使用できるオプションは次のとおりです。
--assemblyname name=assemblyname
--assemblyname inputfilename
--assemblyname outputfilename
--assemblyname nochange (default)既定の動作は「nochange」です。これは、アセンブリ名が元の値から変更されないことを意味します。--assemblyname オプションを指定しない場合は、この動作になります。
—[no]satellite [assembly]
サテライトアセンブリの処理を有効にします([no] を付けると無効にします)。省略可能なパラメーター「[assembly]」でファイルを指定すると、そのアセンブリファイルをターゲットアセンブリのサテライトアセンブリとして扱います。
—addsearch <path>
指定したディレクトリ「<path>」を、Babel が参照アセンブリを検索するフォルダーのリストに追加します。
パラメーター「<path>」には、複数のディレクトリに一致するワイルドカード式を指定できます。ワイルドカード式には、次の特殊文字を使用できます。
| * | 0 文字以上の任意の文字列に一致します |
| ? | 任意の 1 文字に一致します |
| ** | 任意のディレクトリに再帰的に一致します |
| [a-z] | 角かっこ内に指定した範囲の 1 文字に一致します |
| [!ab] | 角かっこ内に指定されていない任意の文字に一致します |
現在検索しているアセンブリについて、次の特殊な文字列をパス式に組み込むことができます。
| :assemblyname: | 検索しているアセンブリの名前 |
| :assemblyversion: | 検索しているアセンブリのバージョン |
| :assemblypublickeytoken: | 検索しているアセンブリの公開キートークン |
このオプションは複数回指定できます。
--addsearch .\**\lib
--addsearch .\:assemblyname:\**\netcoreapp2.0BAML バインドの経路における W00013
Babel のアセンブリリゾルバーが出力する警告 W00013(「Could not resolve assembly <assembly>」)は、通常は情報を伝えるだけのものです。ほとんどのアセンブリの、ほとんどの種類のコードでは、参照が解決されなくても難読化の出力は変わりません。Babel は、すでに読み込んだメタデータから十分な情報を得ているため、参照先のアセンブリをすべて調べなくても、リネーム、制御フロー難読化、文字列暗号化、その他の変換を実行できます。
ただし、W00013 が難読化の出力の実際の変化と結び付く具体的なケースが、少なくとも 1 つあります。それは、解決されなかったアセンブリで定義された型を参照する埋め込み BAML を含むアセンブリです。Babel は、XAML にバインドされたメンバーを検出するために BAML を読み取るとき(リネームされた XAML バインドメンバーに合わせた文字列リテラルの調整を参照)、すべての BAML 要素の CLR 型を解決する必要があります。そうした型を宣言しているアセンブリが検索パスにない場合、リゾルバーはそのアセンブリについて W00013 を出力します。すると、BAML 要素は対応するバッキングフィールドにバインドされず、フィールドには XAML バインドのフラグが付きません。その結果、後でフィールドがリネームされるときに、元の名前と一致する文字列リテラルを書き換える整合の手順が、通知なしにスキップされます。フィールドには新しい名前が付きますが、元のフィールド名を指すリテラルはすべてそのまま残るため、難読化されたアセンブリは内部で矛盾した状態になり、それらのリテラルに基づく名前ベースの実行時の検索は機能しなくなります。
埋め込み BAML を含むプロジェクトでは、難読化の実行結果を本番用として確定する前に、BAML 要素から参照される型を定義しているすべてのアセンブリに --addsearch で到達できること、およびトレースログにそれらのアセンブリに対する W00013 が出ていないことを確認してください。同じ設定は、MSBuild の Babel タスクの SearchDirectories プロパティと、Babel Desktop のプロパティパネルの「ファイルと依存関係」グループにある SearchDirectories 設定でも指定できます。
この警告の挙動が当てはまるのは、埋め込み BAML を含むプロジェクトだけです。WPF 以外のプロジェクトや、埋め込み BAML のないプロジェクトでは、W00013 は通常、情報を伝えるだけのもので、難読化の出力には影響しません。
—quickrule <rule>
クイックルールの定義を入力します。XML ルールファイルを作成せずに難読化の処理を設定したい場合は、XML ルールの代わりにクイックルールを使用できます。
クイックルールの構文:
feature[=exclude];[regex];[access];[target]各部分の意味は次のとおりです。
| feature | 対象とする機能の名前です |
| [=exclude] | 機能を無効にする場合に指定します |
| [regex] | シンボルを絞り込むための正規表現で、省略できます。既定では、難読化ツールはすべてのシンボルを対象にします。 |
| [access] | 処理するシンボルの可視性を設定します。指定できる値は Public、Protected、Internal、Private、All のいずれかです(既定は All) |
| [target] | シンボルの種類を指定します。指定できる値は Classes、Delegates、Structures、Interfaces、Enums、Events、Methods、Properties、Fields、StaticFields、Resource、All です(既定は All) |
「quickrule」スイッチは複数回指定できます。クイックルールは、コマンドラインに現れた順に、XML ルールより先に処理されます。
ターゲットアセンブリ内のパブリックシンボルをすべてリネームします。
babel myapp.exe --quickrule renaming;.*;PublicACME 名前空間内の文字列暗号化を無効にします。
babel myapp.exe --quickrule "string encryption=exclude;ACME.*;All;Methods"ACME.Licensing クラスのコード暗号化を有効にします。
babel myapp.exe --quickrule "msil encryption=on;ACME.Licensing.*"—dbghelpdlldir <path>
このオプションは Windows でのみ動作し、「dbghelp.dll」のパスを設定します。これにより、Babel Obfuscator は Microsoft シンボルサーバー からデバッグシンボルを読み込めるようになります。
—trace <regex>
完全名のシグネチャが指定した正規表現に一致するシンボルについて、難読化の追跡を有効にします。このオプションは、正規表現のデバッグに使用できます。
babel myapp.exe --trace MyNamespace.MyClass::MyMethod「MyMethod」という名前のメソッドを追跡し、その難読化の状態に関するデバッグ情報をログに出力します。
—randomseed <seed>
Babel Obfuscator の乱数ジェネレーターを初期化するシードを設定します。シードを設定すると、難読化の結果を決定的にできます。パラメーター「<seed>」には、任意の 16 進文字列を指定できます。
—use <key=value>
Babel Obfuscator の追加オプションを、キーと値のペアで設定します。
debugxaml=[on/off] Whether to enable XAML debug mode
encryption=<name> Set encryption algorithm (Aes, AesManaged, DES, TripleDES, Rijndael, RC2, XOR)
experimental=[on/off] Whether to enable experimental features
loadtomemory=[on/off] Whether to load assemblies to memory
parallel=[on/off] Whether to perform multithread obfuscation
tagassembly=[on/off] Whether to tag assembly with the BabelObfuscator attribute
obfuscationattr=[skip/keep] Skip processing or force attribute retention
logtimestamp=[on/off/fmt] Whether to add a timestamp to the log output (fmt date time format)例:
名前が Panel で始まるすべての XAML リソースに関するデバッグ情報を出力します。
babel myapp.exe --use debugxaml=Panel.* --verbose 5難読化されたアセンブリに [BabelObfuscator] 属性のタグを付けます。
babel myapp.exe --use tagassembly=onBabel Obfuscator に TripleDES 暗号化アルゴリズムを使用させます。
babel myapp.exe --use encryption=TripleDESマネージド AES アルゴリズムで保護すると、難読化されたアセンブリに挿入されるランタイムは、プラットフォームの暗号化プロバイダーを使わずに復号します。OpenSSL の FIPS 状態が壊れているコンテナーなど、そのプロバイダーを使用できないホストでも保護されたアセンブリを起動できるようにするには、これを使用します(FIPS 準拠を参照)。難読化ツールは、ビルドホストでは引き続きプラットフォームのプロバイダーで暗号化し、同じ暗号文を生成します。変わるのは、挿入される復号ルーチンだけです。
babel myapp.exe --msilencryption --use encryption=aesmanaged「experimental」オプションには、難読化ツールの機能のリストも指定できます。「all」を指定すると、まだすべての .NET プラットフォーム向けにはリリースされていない、新しい難読化アルゴリズムを使用できます。
babel myapp.exe --use experimental=allBabel で実験的な機能を有効にすると、難読化ツールはプラットフォーム固有の要件が満たされているかどうかを検証しない点に注意してください。つまり、設定したすべての難読化が、ターゲットプラットフォームに適しているかどうかにかかわらず実行されます。実験的な機能を有効にすると、エラーのリスクが高まり、アプリケーションのパフォーマンスに影響する可能性があることを念頭に置いてください。したがって、実験的な機能は慎重に、できればテスト環境だけで、起こりうるリスクを十分に理解したうえで使用することをお勧めします。
—[no]isobfuscated [action]
ターゲットアセンブリがすでに難読化されているかどうかを検出するかどうかを指定します。
指定できるアクションは次のとおりです。
- warn:警告を出して、ターゲットアセンブリの処理を続行します。
- exit:ターゲットアセンブリを処理せずに終了します。
このオプションは、ターゲットアセンブリが 2 回処理される可能性があるビルドシナリオで役立ちます。Babel はシンボル名を解析して、アセンブリがすでに難読化されているかどうかを判断します。ただし、この解析が誤った結果を返す場合もあります。そのような場合は、コマンドラインスイッチ —use の「tagassembly」オプションを使用して、アセンブリに BabelObfuscator 属性のタグを付けることをお勧めします。
入力ファイル
「入力ファイル」セクションには、追加の構成や、特定の操作に必要なデータを含む外部ファイルを Babel Obfuscator に渡すオプションがまとめられています。
—keyfile <file>
難読化されたアセンブリとローカライズされたリソース DLL に再署名するための厳密名ファイルを設定します。Babel Obfuscator は、Strong Name Key(.snk)と Personal Information Exchange(.pfx)をサポートしています。
Personal Information Exchange ファイルを使用する場合は、コマンドラインオプション「—keypwd」を追加して、.pfx ファイルのパスワードを指定してください。
—keyname <container>
キーペアがキーコンテナーに格納されている場合は、このオプションを使用してアプリケーションに再署名します。必須のパラメーター <_container>_ は、難読化されたアセンブリとローカライズされたリソース DLL の再署名に使用するキーコンテナーの名前です。
—keypwd <password>
難読化されたアセンブリに再署名するために、Personal Information Exchange(.pfx)ファイルが要求するパスワードを指定します。コマンドラインでパスワードを指定しなかった場合、Babel は難読化の処理中に、正しいパスワードの入力をユーザーに求めます。
—rules <file>
Babel が難読化の処理を設定するために使用する XML ルールファイルを設定します。このオプションは複数回指定できます。ルールファイルは、コマンドラインに入力した順に処理されます。
babel myapp.exe --rules ruleset1.xml --rules ruleset2.xml—mapin <file>
参照先のシンボルの名前を難読化するために使用する、入力用の XML マップファイルを設定します。このオプションは複数回指定できます。
babel myapp.exe --mapin library.map.xml --mapin utils.map.xml—project <file>
難読化プロジェクトファイルを指定します。
—stacktrace <file|key=value>
スタックトレースファイルの難読化を解除します。このオプションには、難読化されたスタックトレースを含むテキストファイル「<file>」と、スタックトレースの内容の難読化を解除するための XML マップファイル一式を渡す必要があります。
babel --stacktrace obfuscatedstacktrace.txt --mapin myapp.map.xml --mapin library.map.xmlこのオプションを繰り返し指定すると、スタックトレースファイルに加えて、次の key=value 設定を渡すことができます。
| 設定 | 値 | 説明 |
|---|---|---|
mode | full(既定)、compact | デコードされたフレームの詳細レベルを選択します。 |
frames | all(既定)、user | all はすべてのフレームを残します。user は Babel が生成したフレーム、つまり動的プロキシのブリッジと、それらが経由して呼び出す匿名の実行時フレームを取り除き、ソースの呼び出しチェーンだけを残します。 |
たとえば、ユーザーの呼び出しチェーンだけを残してトレースをデコードするには、次のように指定します。
babel --stacktrace obfuscatedstacktrace.txt --stacktrace frames=user --mapin myapp.map.xml出力ファイル
出力ファイル名を設定する Babel Obfuscator のオプションです。
—output <file>
難読化されたターゲットの出力ファイルパスを設定します。このオプションを指定しない場合、難読化されたターゲットは、元のアセンブリのフォルダーにある「BabelOut」サブディレクトリに保存されます。
—pdb <file>
出力 PDB ファイルのパスを設定します。このオプションは、—debug オプションが有効な場合に使用できます。
—pdbpwd <password>
デバッグ情報ファイルのパスワードを設定します。このパスワードで、PDB 内に格納されるソースコードファイル名が暗号化されます。
—logfile <file>
Babel Obfuscator の出力メッセージをログファイルに送ります。
—mapout [file]
XML マップの出力ファイル名を設定します。省略可能なパラメーター「[file]」を指定しない場合、Babel Obfuscator は、元のアセンブリ名に拡張子「.map.xml」を付けた名前を XML マップファイルに付けます。
—makeproject [file]
入力されたコマンドラインから MSBuild プロジェクトファイルを作成します。省略可能なパラメーター「[file]」を指定しない場合、Babel Obfuscator はプロジェクトファイルを「BabelOut」サブディレクトリに保存します。
プラグイン
プラグインは、Babel Obfuscator の機能を拡張する追加コンポーネントです。難読化機能を追加または変更でき、難読化の処理をより細かくカスタマイズして制御できます(Encrypt Plugin を参照)。
—plugin <file>
Babel Obfuscator のプラグインファイルのパスを設定します。このオプションは複数回指定できます。
—argument <key=value>
プラグインの引数を、キーと値のペアで設定します。このオプションは複数回指定できます。
アセンブリのマージと埋め込み
アセンブリのマージとは、複数のアセンブリを 1 つのプライマリアセンブリにまとめることです。Babel Obfuscator は、コマンドラインでプライマリアセンブリの後に指定されたすべてのアセンブリをマージして難読化することで、この処理を実行します。
—[no]copyattrs [regex]
このオプションを有効にすると、各入力アセンブリのアセンブリレベルの属性が、すべてターゲットアセンブリにコピーされます。省略可能な正規表現を指定すると、その正規表現に一致する重複した属性がマージされます。
—embed <assembly>
Babel Obfuscator は、依存関係にある複数のアセンブリをターゲットアセンブリに埋め込むことができます。埋め込みアセンブリは圧縮され、暗号化されます。埋め込みによって、ソフトウェアの配布が簡単になり、サイズも小さくなります。依存関係のアセンブリを完全に難読化する必要がない場合は、マージの代わりに使用できます。
このオプションは複数回指定できます。
babel myapp.exe --embed Library1.dll --embed Library2.dll—[no]internalize
有効にすると、マージされたアセンブリ内のすべてのパブリック型の可視性が internal(VB では Friend)に制限されます。
—[no]jsonmanifest
依存関係マニフェストの処理を有効にします([no] を付けると無効にします。既定:有効)。Babel Obfuscator は、依存関係をマージするときに、ターゲットアセンブリの「.deps.json」マニフェストファイルを更新できます。
リネーム
これらのコマンドは、シンボルのリネームを設定するために使用します。
—[no]types (t)
型のリネームを有効にするかどうかを指定します。
—[no]events (e)
イベントのリネームを有効にするかどうかを指定します。
—[no]methods (m)
メソッドのリネームを有効にするかどうかを指定します。
—[no]parameters (r)
メソッドのパラメーターのリネームを有効にするかどうかを指定します。
—[no]properties (p)
プロパティのリネームを有効にするかどうかを指定します。
—[no]fields (f)
フィールドシンボルのリネームを有効にするかどうかを指定します。
—[no]xaml [key=value]
有効にすると、XAML または BAML リソースで使用されているシンボルがリネームされます。このオプションには、「<key>=<value>」の形式で、キーと値のペアを指定できます(省略可能)。
指定できるキーと値は次のとおりです。
keys=[on/off] Whether to enable renaming of dictionary keys
res=[on/off] Whether to enable renaming of BAML/XAML resources
strip=[on/off] Whether to strip line information or white spaces
manual=[on/off] Whether to use manual symbol renaming—[no]virtual [key=value]
メソッド、プロパティ、イベントなどの仮想メンバーをリネームするかどうかを指定します。このオプションには、「<key>=<value>」の形式で、キーと値のペアを指定できます(省略可能)。
指定できるキーと値は次のとおりです。
external=[on/off] Whether to obfuscate external virtual calls—[no]overloaded [key=value]
有効にすると、Babel Obfuscator は、CLR の規則が許すかぎり、同じ型の 2 つ以上のメソッドに同じ名前を使用します。キーと値のペアを指定して、適用するオーバーロードを選択することもできます。
指定できるキーと値は次のとおりです。
methods=[on/off] Whether to overload methods
properties=[on/off] Whether to overload methods
parameters=[on/off] Whether to overload parameters—[no]flatns (n)
有効にすると、リネームされたすべての型がグローバル名前空間に移動されます。これにより名前空間の階層がフラット化され、難読化されたアセンブリには名前空間の情報が埋め込まれなくなります。
—[no]unicode [char set]
有効にすると、名前は読み取れない Unicode 文字列に置き換えられます。Unicode 正規化を無効にした場合、難読化された名前はすべて、ラテンアルファベットの小文字からなる文字列になります。必要に応じて、難読化された名前の生成に使用する文字セットを指定できます。
babel myapp.exe --unicode 0xf000-0xfe00
babel myapp.exe --unicode 10,13,a-z—namelength <n>
リネームされたシンボルの名前の最小の長さを設定します。キーと値のペアを指定して、型、メソッド、プロパティ、フィールド、イベントの最小の長さを個別に指定することもできます。
babel myapp.exe --namelength types=12 --namelength methods=3—nameprefix [prefix]
リネームされたシンボルの名前のプレフィックスを設定します。キーと値のペアを指定して、型、メソッド、プロパティ、フィールド、イベント、パラメーターのプレフィックスを個別に設定することもできます。
babel myapp.exe --nameprefix types=$Name_ --nameprefix methods=M_特殊な値「$Name」は、元のシンボル名に置き換えられます。「$Name」プレフィックスは通常、リネームの問題をデバッグするために使用します。
—[no]xmldoc [file|regex]
ターゲットアセンブリの XML ドキュメントを更新して、リネームされたシンボルをすべて取り除くかどうかを指定します。必要に応じて、XML ドキュメントファイルのパスまたは正規表現を指定できます。ファイル名または正規表現が、マージされたアセンブリの XML ドキュメントファイル名に一致する場合は、マージされたアセンブリの XML ドキュメントが、ターゲットアセンブリの XML ドキュメントにマージされます。
制御フロー難読化
制御フロー難読化は、メソッドのコードを変換して実行経路を見えにくくし、結果のフローをはるかに複雑で理解しにくいものにします。
—[no]controlflow
メソッドの制御フローを変更するために使用します。キーと値のペア「<key>=<value>」を指定して、コードのスクランブルを設定することもできます。
検証可能な IL コードを生成する場合に指定できるキーと値:
goto=[on/off] Whether to insert irrelevant branches
switch=[on/off] Whether to enable switch scrambling
case=[on/off] Whether to hide case constants
if=[on/off] Whether to enable if scrambling
call=[on/off] Whether to enable random calls
value=[on/off] Whether to use value encryption
token=[on/off] Whether to enable emission of method tokens
chain=[on/off] Whether to enable chained-state flattening (Ultimate)検証不可能な IL コードを生成する場合:
underflow=[on/off] Whether to enable stack underflowこのオプションは複数回指定できます。たとえば、次のように指定します。
babel myapp.exe --controlflow if=on --controlflow switch=on --controlflow case=on
--controlflow call=on—iterations <n>
制御フロー難読化アルゴリズムで使用する反復回数を設定します。反復回数を 0 に設定すると、制御フロー難読化は無効になります。n が大きくなるほど、各メソッドに挿入される無関係な分岐命令の数が増えます。
—[no]invalidopcodes [mode]
このオプションを使用すると、無効な MSIL オペコードが出力されます。これにより、一部のリフレクションツールは IL のメソッド本体を調べられなくなります。
このオプションを有効にすると、難読化されたアセンブリは、中間言語(IL)の検証ツールで検証できなくなります。IL として検証できないコードは x64 オペレーティングシステムでは実行できないため、難読化されたアセンブリが x64 プラットフォームを対象とする場合は、このオプションを有効にしないでください。
省略可能なパラメーター「[mode]」は、無効なオペコードの別の構成を有効にします。
enhanced: Insert additional invalid op-codes暗号化と保護
文字列暗号化やコード暗号化など、高度な難読化機能を対象とするオプションです。
—[no]msilencryption [regex]
省略可能な正規表現、または XML ルールファイルで定義した難読化ルールに一致するメソッドについて、コード暗号化を有効にするかどうかを指定します。このオプションは複数回指定できます。
—[no]stringencryption [name]
ユーザー文字列の暗号化を有効にするかどうかを指定します。省略可能なパラメーター「name」を指定して、使用する暗号化アルゴリズムを選択できます。
指定できるアルゴリズム名は次のとおりです。
hash The strings are arranged into a hash table
xor Inline XOR encoded strings
stream Authenticated per-string encryption, decrypted lazily; fully managed (AOT/trim/FIPS safe)—[no]valueencryption [key=value]
このオプションは、インラインの定数値と配列の暗号化を有効にします。キーと値のペア「<key>=<value>」を指定して、特定の型の暗号化を有効または無効にすることもできます。
指定できるキーと値は次のとおりです。
int32=[on/off] Whether to encrypt Int32 values
int64=[on/off] Whether to encrypt Int64 values
single=[on/off] Whether to encrypt Single values
double=[on/off] Whether to encrypt Double values
array=[on/off] Whether to encrypt Arrays—[no]ildasm
有効にすると、「System.Runtime.CompilerServices.SuppressIldasmAttribute」がターゲットアセンブリに追加され、Microsoft MSIL 逆アセンブラー ILDASM(Ildasm.exe)で難読化されたターゲットを逆アセンブルできなくなります。
—[no]reflection
リフレクションベースのツールを阻止するために、無効なメタデータの出力を有効にするかどうかを指定します。
—[no]resourceencryption [key=value]
マネージドリソースの暗号化を有効にするかどうかを指定します。有効にすると、すべての埋め込みリソースが圧縮され、暗号化されます。キーと値のペアを指定して、追加の設定を行うこともできます。
指定できるキーと値は次のとおりです。
encrypt=[on/off] Whether to encrypt resources
compress=[on/off] Whether to compress resources
protect=[on/off] Whether to protect embedded resources—[no]proxy [type][;regex]
外部メソッドまたは内部メソッドへのプロキシ呼び出しの生成を有効にするかどうかを指定します。省略可能なパラメーター [type] には、次のいずれかの値を指定できます。
external hide calls to external assembly methods
internal hide calls to internally defined assembly methods
all hide both internal and external method calls必要に応じて、プロキシ化するメソッドのシグネチャに一致する正規表現を入力できます。たとえば、次のように指定します。
babel.exe myapp.exe --proxy external --proxy ;System.Array::.* --proxy ;::GetEnumerator—[no]tamperingdetection
改ざん防止の保護を有効にするかどうかを指定します。
—[no]antidebugging
デバッグ保護を有効にするかどうかを指定します。
コード生成
これらのオプションは、Babel Obfuscator がターゲットアセンブリに加えることのできる、コードの最適化に関するものです。
—addreference <assembly>
ターゲットアセンブリにアセンブリ参照を追加するか、参照先を変更します。例:
babel myapp.exe --addreference "[System*, Version=2.0.5.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]"すべての System 参照の参照先を、ポータブルアセンブリに変更します。このオプションは複数回指定できます。
—[no]cleanattrs <regex>
不要な属性の除去を有効にするかどうかを指定します。パラメーター「<regex>」は、不要な属性の型の完全名に一致する正規表現です。このオプションは複数回指定できます。
—[no]constremoval
定数フィールドの除去を有効にするかどうかを指定します。定数フィールドへの参照は、可能なかぎりその定数値に置き換えられます。
—[no]deadcode [regex]
デッドコード除去を有効にするかどうかを指定します。有効にすると、どのコードパターンからも到達されないメソッド、プロパティ、フィールド、イベントがすべて除去されます。「[regex]」で省略可能なエントリポイントを指定して、検索の開始位置を定義できます。
—[no]debug [source]
デバッグ情報の出力を有効にして、難読化されたターゲットの PDB デバッグシンボルファイルを生成するかどうかを指定します。必要に応じて、デバッグシンボルストアを指定できます。
--debug srv*c:\Symbols*http://msdl.microsoft.com/download/symbols—[no]disgregateremoval
プロパティとイベントのメタデータ情報を除去し、プロパティとイベントのアクセサーメソッドだけを残すかどうかを指定します。
—[no]enumremoval
System.Enum 型の除去を有効にするかどうかを指定します。列挙型フィールドへの参照は、可能なかぎりその定数値に置き換えられます。
—[no]inlineexpansion
インライン展開を有効にすると、メソッド呼び出しを、その呼び出しが行われる位置で、メソッド自身のコードに置き換えることができます。
—[no]instrument [regex]
コードのインストルメンテーションを有効にするかどうかを指定します。省略可能な正規表現を指定して、インストルメンテーションの対象とする完全修飾メンバーを絞り込むことができます。
完全修飾メンバーの構文は次のとおりです。
「[NamespaceName].[TypeName]::[MethodName]」
例:
babel myapp.exe --instrument mynamespace\.mytype::.* このオプションは複数回指定できます。
—[no]emptymethods
本体が空のメソッドにインストルメンテーションコードを追加するかどうかを指定します。
—moduleinitializer [method]
モジュール初期化子のコードを追加します。必要に応じて、パラメーターのない静的メソッドのシグネチャを指定できます。指定したメソッドは、モジュールの読み込み後に呼び出されます。
[Obfuscation(Feature = "module initializer:priority=120")]
public static void DoInitialize120()
{
Console.WriteLine("DoInitialize120");
}ここで、priority には整数値を指定でき、Babel が初期化子メソッドを呼び出す順序を定義します。Babel は、自身の初期化子メソッドを既定の優先度 100 で追加します。優先度が 100 未満の初期化子は、それより先に呼び出されます。
—[no]seal
有効にすると、継承階層で基底クラスとして使用されていない非パブリッククラスがすべてシールされます。クラスを sealed として宣言すると、Just-In-Time(JIT)コンパイラーがメソッドの仮想テーブルをたどらずに済む場合があり、メソッド呼び出しのパフォーマンスが向上します。