.NET TIPS

アプリケーションの難読化を自動化するには?[2.0のみ、C#、VB]

デジタルアドバンテージ 一色 政彦
2006/12/01

 .NETアプリケーションとして生成されるアセンブリは、ネイティブ・コードではなく、IL(中間言語)のコードであるため、比較的容易に逆コンパイルして元のソース・コード(にかなり近いもの)を復元できる。このことは、アプリケーション(特にWindowsアプリケーション)を開発し、販売するソフトウェア会社などにとって、無視できない問題である。

 この問題を回避する1つの手段として「難読化」(Obfuscation)という技術がよく用いられる。難読化とは、逆コンパイルにより生成されるソース・コードを読みにくくするためのもので、Visual Studio 2005(以降、VS 2005)には簡易な難読化ツールの「Dotfuscator Community Edition」(以降、Dotfuscator CE)が標準で含まれている(ただしVS 2005 Express Editionは除く)。ちなみにDotfuscatorにはCommunity Editionのほかに「Standard Edition」(以降、Dotfuscator SE)と「Professional Edition」(以降、Dotfuscator PE)がある(このうちDotfuscator SEは日本では受注停止のようだ)。

 そこで本稿では、このDotfuscator CEを使って.NETアプリケーションを難読化する方法を紹介する(Dotfuscator SE/PEではVisual Studioに追加されるプロジェクト・テンプレートの「Dotfuscatorプロジェクト」を使うなどして、よりシームレスな難読化が行える)。DotfuscatorはGUIを持つアプリケーションで、VS 2005のIDEから起動することができるが、本稿ではVS 2005やMSBuildでビルド作業を行う際に自動的にDotfuscatorを実行してアプリケーションの難読化を行う方法を紹介する。

 なお、Dotfuscatorの内容や基本的な使い方については、「.NET逆コンパイラとコードを難読化するDotfuscator」をご一読いただきたい。

MSBuildファイルで難読化を自動実行するには?

 ビルド作業を行う際に暗黙的にDotfuscatorを実行してアプリケーションを難読化するために、本稿ではMSBuildファイル(=VS 2005のプロジェクト・ファイル)をカスタマイズする。

 まずは、Windowsアプリケーションなどのプロジェクト・ファイル(これは単なるテキスト・ファイルである)を開き、そのファイルの最後にある「</Project>」の直前に、次のコードを追加してほしい(VS 2005のIDEでプロジェクト・ファイルを開くとIntelliSenseが使えるので便利だ。MSBuildファイルの編集方法などについては「ビルド・エンジン「MSBuild」を思いのままに操る技」を参考にされたい)。

<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

  ……中略……

  <Target Name="AfterCompile" Condition="'$(Obfuscate)'=='true'">

    <!-- dotfuscator.exeパスのプロパティ設定 -->
    <CreateProperty Value="C:\Program Files\Microsoft Visual Studio 8\Application\PreEmptive Solutions\Dotfuscator Community Edition\dotfuscator.exe">
      <Output TaskParameter="Value" PropertyName="_DotfuscatorExePath" />
    </CreateProperty>

    <!-- 難読化するファイルのプロパティ設定 -->
    <CreateProperty Value="$(ProjectDir)$(IntermediateOutputPath)$(TargetFileName)">
      <Output TaskParameter="Value" PropertyName="_ObfuscatedFilePath" />
    </CreateProperty>

    <!-- 難読化先フォルダのプロパティ設定 -->
    <CreateProperty Value="$(ProjectDir)Dotfuscated">
      <Output TaskParameter="Value" PropertyName="_DotfuscatedFolderPath" />
    </CreateProperty>

    <!-- 難読化の実行 -->
    <Exec Command="&quot;$(_DotfuscatorExePath)&quot; /in:&quot;$(_ObfuscatedFilePath)&quot; /out:&quot;$(_DotfuscatedFolderPath)&quot; /q" />

    <!-- 難読化済みファイルをコピー -->
    <Copy SourceFiles="$(_DotfuscatedFolderPath)\$(TargetFileName)"
          DestinationFiles="$(_ObfuscatedFilePath)" />

  </Target>

</Project>
難読化を自動化するためにMSBuildファイルに追加するコード
灰色の部分と黄色の部分は追加しなくてよい。「<!--」から「-->」で囲まれた部分はコメントである。

 簡単に説明すると、Obfuscateプロパティが「true」の場合、AfterCompileターゲットの内容を実行することを宣言している。AfterCompileターゲットは、コンパイル作業の最後に実行される既定のターゲットである。Obfuscateプロパティは、本コードで新たに追加したプロパティで、既定のMSBuildにはないものだ。

 AfterCompileターゲットの中身では、次のような流れで処理を行っている。

  • dotfuscator.exeのファイル・パスを示す_DotfuscatorExePathプロパティの設定
    →Dotfuscator CEの場合、通常はVS 2005をインストールしたフォルダの配下にある(※読者それぞれの環境に合わせること)。ちなみにDotfuscator PEの場合は、デフォルトでは「C:\Program Files\PreEmptive Solutions\Dotfuscator Professional Edition 3.0\dotfuscator.exe」にある。

  • 難読化する.EXE/.DLLファイルを示す_ObfuscatedFilePathプロパティの設定
    →コンパイルによりプロジェクトの「obj」フォルダ内に生成される中間出力のファイルを指定する。「obj」フォルダはMSBuildで予約されているIntermediateOutputPathプロパティから取得できる。

  • 難読化したファイルを出力する先の一時的なフォルダを示す_DotfuscatedFolderPathプロパティの設定
    →本コードでは、プロジェクト・フォルダの配下のDotfuscatedフォルダを指定している。

  • 難読化の実行
    →dotfuscator.exeをコマンドライン経由で呼び出す。なお、この例では完全にコマンドライン・オプションで難読化を施しているが、Dotfuscator構成ファイルを指定することでより厳密な設定を指定できる。

  • 難読化されたファイルを一時フォルダから元の「obj」フォルダに戻す

 以上でMSBuildファイルの作成は完了だ。

【コラム】VS 2005のIDEによるMSBuildファイルへのセキュリティ警告
 ここで作成したMSBuildファイルのプロジェクトをVS 2005のIDEで開くと、次のようなセキュリティ警告ダイアログが表示される(ことがある)。

カスタマイズしたプロジェクト・ファイルを開くと表示されるセキュリティ警告
[標準的にプロジェクトを読み込む]を選択して[OK]ボタンをクリックする。

 これはAfterCompileターゲットを追加したために表示されるのだが、Obfuscateプロパティが「true」にならない限り、AfterCompileターゲットが実行されることはないので、安心して[標準的にプロジェクトを読み込む]を選択して[OK]ボタンをクリックしてほしい。

 それでは、作成したMSBuildファイルを実行してみよう。

VS 2005から実行するには?

 まずはVS 2005のIDEで実行する方法だ。

 前述のAfterCompileターゲットを走らせるには、Obfuscateプロパティを「true」に設定しなければならない。例えば、リリース・ビルドのときだけ難読化を行いたいときには、MSBuildファイルに次のようなプロパティ設定を追記すればよい。

  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
  ……中略……
    <Obfuscate>true</Obfuscate>
  </PropertyGroup>
難読化を実行するObfuscateプロパティの設定
灰色の部分と黄色の部分は追加しなくてよい。このコードは、構成が「Release」モードかつ、プラットフォームが「AnyCPU」の際にのみ、Obfuscateプロパティを「true」に設定している。

 追記し終わったら、そのプロジェクト・ファイルをVS 2005のIDEで起動してみよう。そしてVS 2005が起動したら、構成を「Release」モードに(プラットフォームを「AnyCPU」に)して、プロジェクトのビルドを行ってみよう。

VS 2005のIDEにおける難読化の自動実行
修正したプロジェクト・ファイルをVS 2005のIDEで開き、リリース・ビルドを実行したところ。
  構成を「Release」モードに設定。
  プラットフォームを「AnyCPU」に設定。
  メニュー・バーから[ビルド]−[ソリューションのビルド]を選択するなどしてビルドを開始する。[出力]ウィンドウで出力内容を確認すると確かにDotfuscatorが実行されているのが分かる。

 Dotfuscator CEでは難読化が完了したときに次のようなダイアログが表示される。

Dotfuscator CEで難読化が完了した際に表示されるダイアログ
このダイアログは難読化処理を完全に自動化できないようにするためにわざと表示しているようだ。Dotfuscator PE/SEでは表示されない。

 ダイアログの[OK]ボタンをクリックしない限り、ビルドの進行は一時停止してしまうので注意してほしい。ここで[OK]ボタンをクリックしてビルドが完了したら、実際にアプリケーションが難読化されたのか確認してみよう。

 次の画面は、「bin\Release」に生成された「WindowsApplication1.exe」を逆コンパイラ・ツールの「Reflector for .NET」(Lutz Roeder's .NET Reflector)で逆コンパイルしたところだ(Reflector for .NETについては「.NET逆コンパイラとコードを難読化するDotfuscator」を参照されたい)。

アプリケーションの難読化を確認

 この画面を見ると分かるように、クラス名やメソッド名などが「a」「b」「c」などの無意味な文字列に置き換えられ難読化されているのが確認できる。

コマンドラインから実行するには?

 次にコマンドライン経由で実行する方法だ。ただし、VS 2005に付属するDotfuscator CEではコマンドライン経由での単体実行が制限されている。コマンドラインから単体実行するにはDotfuscatorのSE/PEを用意する必要がある。しかし、どうやらVS 2005のIDEさえ起動しておけばコマンドラインでの実行は可能である(ただし実行中に前述のダイアログが表示されるので無人の自動実行は難しい)。

 先ほどDotfuscatorを使用するように修正を加えたプロジェクト・ファイルをコマンドラインから実行してビルドを行うには、次のようにしてmsbuild.exeを実行すればよい(各コマンドの意味についてはコードの説明欄を参照されたい)。

set PATH=C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727;%PATH%
msbuild WindowsApplication1.csproj /p:Obfuscate=true
コマンドラインからの実行(最もシンプルな例)
「WindowsApplication1.csproj」はVS 2005で作成したC#のプロジェクト・ファイルである。「/p」は、MSBuildのスイッチとして指定可能な「/property」(=Propertyスイッチ)の省略形で、ここではObfuscateプロパティ(=「難読化」)を「true」に設定している。
ちなみに、1行目の「set 〜」はMSBuild.exeへのパスを通す(=msbuild.exeを呼び出し可能にする)ためのコードである。
なお、PropertyスイッチやMSBuildの使い方については、「.NETビルド・エンジン「MSBuild」使いこなし術」を参照してほしい。

 このコマンドラインでは、「/p:Obfuscate=true」によって外部からObfuscateプロパティを設定している。このようにすることで、ビルドを行うタイミングで動的にアプリケーションの難読化を実施することも可能だ。End of Article

カテゴリ:開発環境&ツール 処理対象:ビルド
 
この記事と関連性の高い別の.NET TIPS
難読化したアプリケーションをClickOnceで配布するには?
OSに標準付属のMSBuildツールでプロジェクトをビルドするには?
ClickOnceアプリをコマンドラインから発行するには?
Visual Studio 2005で実行ファイルのあるフォルダを開くには?
VS 2005やIISを使用せずにWebアプリケーションを実行するには?
このリストは、(株)デジタルアドバンテージが開発した
自動関連記事探索システム Jigsaw(ジグソー) により自動抽出したものです。
generated by

「.NET TIPS」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間