制御フローの難読化
制御フローの難読化という処理を使用することで、PreEmptive Protection™ DashO™ for Android & Java は、人間や逆コンパイラが制御フローのロジックを追い難くなるような方法で、命令を再配置します。 この再配置には、逆コンパイラがソース コードを再構築しようとするときに探すパターンの多くが除去されるという効果があります。 制御フローの難読化を行うと、メソッドを逆コンパイルしようとする逆コンパイラを直ちに失敗させたり、逆コンパイル以外の場合には非常に把握し難いコードを逆コンパイラに出力させたりします。
制御フローの難読化は、DashO GUI の Control Flow - Options ページで有効または無効にすることができます。 また、以下に示す個々の制御フロー難読化機能も有効にしたり無効にしたりできます。
- ブロックの入れ替え
- Try/Catch Obfuscation(Try/Catch による難読化)
- Block Splitting(ブロック分割)
メモ:制御フローは、
LocalVariableTable
属性やLocalVariableTypeTable
属性を必ず変更します。 DashO がこれらの属性を除去しないように構成されている場合でも、制御フローにより、LocalVariableTable
属性からその情報の大部分が除去されると共にLocalVariableTypeTable
属性が完全に除去されます。LocalVariableTable
属性には、メソッド パラメーターの名前も格納されています。 制御フローを使用する場合、DashO がLocalVariableTable
属性を保持するように構成されているときには、メソッド パラメーター名は保持されます。 ただし、他の情報が除去されたことを示す警告が出力されます。
ブロックの入れ替え
Block Jumbling により、DashO は、メソッドのバイト コードにおけるコード ブロックの順序をランダムに変更できるようになります。それらのコード ブロックが JVM で実行される順序は、変更する必要がありません。 この機能は、ブロックの数が多いほど最適化されます。メソッドに対する既存の制御フローが比較的シンプルな場合は、再配置できるブロックをより多く作成できるように、Block Splitting(ブロック分割)を使用することもできます。
Try/Catch による難読化
Try/Catch による難読化により、メソッドに Try/Catch ハンドラーが追加されるので、多数の逆コンパイラが使用している制御フロー パターンが崩れます。 各メソッドに追加できる Try/Catch ハンドラーの最大数は、Control Flow - Options ページで構成できます。
Block Splitting(ブロック分割)
Block Splitting により、各コード ブロックがより小さなコード ブロックに分割されます。 これにより、Block Jumbling で操作するブロック数が増えるので、Block Jumbling が大幅に効率的になります(特にメソッドがシンプルな場合に顕著)。
Block Splitting がメソッドに多数の命令を追加することでメソッドのサイズが増大するので、メソッドの実行速度が低下する可能性があります。 この作用を制御するには、Control Flow - Options ページで、Block Splitting で作成される 1 つのブロック内のバイトコード命令数の下限を増減させます。 このバイトコード命令数の下限を高くすると、ブロックが減って長くなると共に、新しい命令が減ります。
メモ:Block Splitting(ブロック分割)を有効にした場合、Dalvik 仮想マシン(KitKat など)を使用する旧デバイス上で実行する Android アプリケーションを保護しているときは、Control Flow - Options ページで[Dalvik Compatibility]を有効にします。
対象選択と対象除外
制御フローの難読化は、コードを強力に保護しますが、同時に、ランタイムのパフォーマンスとコード サイズに多大な影響を及ぼすことがあります。 クラスまたはメソッドにパフォーマンスへの影響の大きいコードが含まれる場合は、そのクラスまたはメソッドを制御フローの難読化対象から除外することも、あるいは特に影響が大きいアルゴリズムが含まれるコード部分に制御フローの難読化を集中させることもできます。
特定のメソッドに対して制御フローの難読化を有効または無効にするには、DashO GUI の Control Flow - Include および Control Flow - Exclude ページを使用します。 既定では、対象除外規則の対象とならないメソッドは、対象として選択され、DashO により制御フローの難読化が適用されます。 対象選択規則を追加した場合は、その規則の対象となったメソッドのみが対象として選択されます。