.NETアプリの逆コンパイル対策、その具体的な方法とは?(難読化の実例付)
アプリケーションの難読化の必要性は徐々に認知されてきましたが、いまだに多くの人が実行可能ファイルを読み取り可能なソースコードまで、簡単に逆コンパイルできる事を認識していません。このブログでは、逆コンパイルによるコード復元の具体例を挙げたうえで、難読化ツールを使用した逆コンパイルの対策方法について説明していきます。
※ こちらのブログ記事「.NETやXamarinで難読化を行うことは重要です。」も合わせてご参照ください。
*目次*
1.アプリケーションのコードを見る(逆コンパイルする)のは本当に簡単ですか?
.NET の世界では、すべてのアセンブリが MSIL(Microsoft 中間言語)にコンパイルされます。MSIL は、実行時にジャストインタイム(JIT)コンパイラによってマシンコードに変換されます。MSIL には、コードに関する豊富な情報を提供するメタデータが含まれているため、これを変換することでアプリケーションのコードを入手できます。
実際に変換するためには、自分でコマンドを入力する必要はなく、世の中にたくさん出回っている逆コンパイラを利用することで簡単に逆コンパイルができます。
以下のサンプルプロジェクトを使って逆コンパイルを行います。
https://github.com/preemptive/dotfuscator-pro-samples/tree/master/GettingStarted
以降は、「GettingStarted」プロジェクトを想定して説明します。
2.逆コンパイルをしてみる
逆コンパイルツールは、どんなツールでも構いません。今回はフリーツールの dnspy を利用します。(ツールの使い方は説明しません)
https://github.com/dnSpy/dnSpy
GettingStarted アプリケーションをビルドし、dnspy を開いた状態で実行可能ファイルをドラッグアンドドロップします。ツリーから HelloWorldForm ノードを展開すると、このようなコードを見ることができました。
オリジナルのソースコードと比較してみると、以下のことが分かります。
- コメントや空白が削除されている。
- 変数、メソッド名がオリジナルのソースコードと同じである。
- 文字列リテラル名がオリジナルのソースコードと同じである。
- 制御フローの一部が異なって出力されている。
あなたが解析対象のアプリ開発者でなかったとしても、逆コンパイル後のソースコードに多くのヒントがあるため、容易に解析できることが分かります。
【価格表付き】製品パンフレット
難読化ツールをお探しの方は必見!JavaScriptや.NET、Android/Javaに対応した難読化ツールのパッケージ製品「PreEmptive Protection」の概要とライセンス価格をご確認いただけます。
*登録フォーム上の入力項目は、会社名・
お名前・メールアドレス・電話番号のみ
3.「名前の変更」だけ適用してみる
ほとんどの難読化ツールには「名前の変更」機能があります。名前の変更だけ搭載されている無償ツールもいくつかあります。Visual Studo にバンドルされている Dotfuscator Community も名前の変更しかできません。
さて、この名前の変更だけ適用した場合、解析する側にどのような影響があるでしょうか。
難読化済みの実行ファイルを、dnspy を通じて逆コンパイルしてみます。
解析の難易度が上がったと思いませんか?
これは、変数名やメソッド名が無意味な文字に置き換わったことによって、機能を推測できなくなったからです。
(例)
Converseメソッド→何らかの変換をする aメソッド→?
SayHello メソッド→挨拶を出力する aメソッド→?
しかし、文字列のリテラルはどうでしょうか。
文字列のリテラルは変わっていません。ここに解析されるリスクがあります。
解析者は画面に表示されている文字列を検索して、該当の処理コードに辿りつくでしょう。
また、静的な解析だけではありません。最近の逆コンパイルツールには、デバッグ環境も整っています。試しにブレイクポイントを貼って実行してみます。
変数名から機能を推測することはできませんが、変数に入っている値から何に使われるかを推測できそうです。
4.Dotfuscator を使って難読化をしてみる
これまでの説明で逆コンパイルがいかに簡単であるか、そして名前の変更だけでは不十分である事が分かったと思います。
次に、Dotfuscator を使って難読化をしてみます。
逆コンパイル後、ツリーを展開するとあることに気が付きます。どのファイルにロジックが入っているかが分からなくなっています。
また、全てのファイルに対して文字列の検索をしても、ヒットしません。
適当にファイルを開いて中身を見てみると、文字列が以下のように変換されていることが分かります。
さらに、見覚えのないロジックが大量に追加されていることがわかります。
ロジックを追いかけるのも、多くの時間が掛かることが予想されます。
ここで静的解析を諦めて、動的解析(デバッグ)を試みます。
この段階では、どこにブレイククポイントを貼っていいかが分かりませんので、適当に貼って実行してみます。
実行したものの、以下のようなエラーが発生してしまいました。
これは、「デバッグ検知」と言って、難読化とは別のアプローチによる保護技法になります。
つまり、デバッグしながら確認もできないことが分かります。
ここまで保護されていると、カジュアルなハッカーは諦めるのではないでしょうか。
今回は非常に簡単なプログラムですが、これでも解析するのは厳しいと感じます。
5.まとめ
.NET アプリは逆コンパイルが簡単です。誰でも無料のツールをダウンロードして、手元の実行可能ファイルからソースコードを自動的に複製し、それを検査して変更することができます。また、デバッグツールを使用してコードをステップ実行し、何が起こっているかを簡単に調べることができます。
PreEmptive Solutions は、階層化された保護によって、著作権侵害、盗難、偽造、改ざんからアプリを守ります。
評価版のご利用を希望されるお客様は、以下の URL よりお申し込みください。
https://www.agtech.co.jp/preemptive/dotfuscator/trial/