難読化

難読化とは

難読化とは、ソフトウェアのプログラムを、逆アセンブルや解読が困難なコードに変換することを指します。プログラムの機能は元のまま利用できます。こうすると、ソフトウェアは完全に機能しますが、リバースエンジニアリングの影響を受けにくくなります。難読化は、ソフトウェアの脆弱性を発見しにくくして、知的財産の盗難を防ぎ安全を確保するための技術です。

難読化を実行する理由

以下に示す、ある関数のサンプル ソースコードを使って、マシンコードへのコンパイルについて考えます。

ob1

プログラムがマシンコードに変換されている場合、IDA Pro などの「逆アセンブラ」を使うと、出力であるマシンコードからプログラムを得る、リバースエンジニアリングが実行できます。バイナリを分析すると、この関数の制御フローが簡単に分かります。

難読化でコードの改ざんやリバースエンジニアリングが防げるか

従来の難読化技法だけでは、静的な分析やリバースエンジニアリングからプログラムのコードを守ることには役立ちません。

難読化は、単純なリネーム (名前の変更) 技法や基本的な文字列の難読化テクノロジーと混同されることがありますが、そのような仕掛けは簡単に破られるので、容易にリバースエンジニアリングを実行されてしまいます。

Arxan が提供している難読化技法は高度なもので、従来の技法をはるかに上回る、強力なバイナリレベルの難読化を実現します。Arxan の高度な難読化技法は、難読化のレベルを格段に向上させただけではありません。ユーザーは、コードのサイズを制御し、パフォーマンスを微調整することもできます。

Arxan が提供する高度な難読化

Arxan の高度な難読化技法では、プログラム コードを変換するさまざまな場面で、特許を取得した技術が数多く採用されていて、コードの判読や分析は非常に困難です。このような高度なテクニックは、ソフトウェア プログラムの目的やロジックを隠して、以下のことを実現するためには非常に効果的です。

  • アプリケーションの改ざんを防止する
  • リバース エンジニアリングを阻止する
  • 知的財産を保護する
制御フローの難読化は、Arxan の高度な難読化技法の中で重要な機能の 1 つです。これによって強力なレベルの難読化が実現できるため、変換後のコードに対する分析、判読、リバースエンジニアリングが極端に難しくなります。

制御フローの難読化

制御フローの難読化では、コードの構造を除去し、コードの構造が推察できるパターンを排除して、バイトコードと逆コンパイル後のソースとを突き合わせた場合に予測できる関係を断ちます。続いて、ソフトウェアプログラムの制御フローパスを集約して単純化します。実行ロジック、シークエンス、プログラムの入り口や出口の追跡を非常に困難にするためです。

下記の図で示すとおり、制御フローの難読化でコードを変換すると、コードの分析や判読はとても難しくなります。

Arxan は高度な難読化を通して、多岐にわたる変換技法を提供し、お客様のコードを保護します。それぞれの技法は、プログラムに直交の影響を与えます。同時に、難読化では複数の技法で個別に変換を行い、独自の方法で組み合わせることで、プログラムのセキュリティを強化します。こうした技法の例を以下に示します。

ダミー コードの挿入

プログラムを実行する際、実行が終わったコードを挿入しますが、この操作を行っても、プログラムのセマンティクス (意味) には影響しません。コードを逆アセンブルした場合の分析が困難になるだけです。

パスのマージ

制御フローのパスをマージして、制御フローを難読化します。パスのマージは、特許を取得したアルゴリズムによって実現します。

命令の置き換え

よく使われる命令の中からランダムに選んだものを他の要素、例えばあまり目立たないコンストラクタに変換します。命令を置き換えるのは、ダミー コードの挿入と同様の効果があります。ただし、データのフローに影響を与えない命令を追加するのと違って、命令の置き換えを実行すると、単純な命令が複数の命令に拡張されます。

シンボルのシャッフル

保護されたモジュールに含まれている、グローバル変数と関数のリストをシャッフルします。シンボルのシャッフルは、シンボルの順序を再度整理することに重点が置かれています。この変換によって、コードのリリースを重ねるたびにエントロピーが増大するようになります。保護を実行すると、機能が似ている関数が同じ場所に配置されることがほとんどなくなります。

関数のインライン化

関数呼び出しを実行する、呼び出し元の目的を分かりにくくするために、関数を呼び出します。インライン化とは、ある関数の実装を完全な形で含む、別の新たな関数の実装を意味します。インライン化で別の関数の中に含まれた関数のスタックの記録は、その関数を含むインライン化関数の記録にマージされます。このインライン化が実行された場合、スタック トレースの中で、制御フローに表示される関数の数が少なくなります。

あいまい述部の挿入

分岐を追加し、既存の基本的なブロックを複製して、制御フローを難読化します。あいまい述部の挿入を実行すると、評価した場合に常に同じ結果を返す条件分岐が追加されます。この条件判断の結果は難読化モジュールに通知されますが、バイナリを逆アセンブルして検査しても、容易には特定されません。また、全く実行される見込みのないパス上に基本ブロックを複製して、制御フローをさらに複雑にします。

カスタマイズした難読化

Arxan は上記以外にもさまざまな技術を蓄積しています。お客様の組織で必要とされる保護の内容に応じて、上記以外の技法についても、お客様独自の保護をカスタマイズして実装することができます。