Dotfuscator を使用して作成したアプリケーションを難読化する (Visaul Studio 2022 バージョン)

ページ更新日 :
ページ作成日 :

概要

.NET 系列のフレームワークをベースにして作成したアプリケーションは共通中間言語と呼ばれる形で作成されるため、逆アセンブリツールなどを使うことによって元のソースコードに近い形で読み取ることができてしまいます。ここでは Visual Studio に付属している難読化ツール「Dotfuscator」の無償版によってクラスやメソッド名など簡単には読み取れない形式に難読化する手順について説明します。

Visual Studio 2022 を使って説明していますが、他のバージョンの Dotfuscator でも使うことができます。

動作環境

Visual Studio
  • Visual Studio 2022

Dotfuscator について

Dotfuscator は .NET 系列のフレームワーク (以降 .NET と呼ぶ) で作成されたアプリケーションを逆アセンブリされた場合にソースコードを読み取りにくくさせるための難読化ツールです。Dotfuscator には Visual Studio に付属する無償版と有償の製品版があります。

無償版は機能の多くが制限されていたり Visual Studio が起動されていないと使用できませんが、Visual Studio さえインストールすればだれでも使用することができます。有償版には無償版にはない強力な難読化機能が多く存在しますが、一般の人にはなかなか手を出しにくい価格で提供されています。

Dotfuscator はバージョンなどによって機能や価格、エディションが異なったりするので詳しくは下記のホームページを参照してください。

逆アセンブルについて

.NET で作成されたアプリケーションは逆アセンブルで簡単に元のソースコードが読みとれてしまうということは前述しましたが、実際どうなのかというと以下の図のように .exe ファイル (または .dll ファイル) を逆アセンブルすると名前空間やクラス名、メソッド名など元のソースコードがほとんど再現できてしまいます。

難読化すべきプログラムの種類

主に不特定のユーザーに配布して動かすプログラムが対象となります。例えばデスクトップアプリケーションなどがそうです。 逆にプログラムファイルに直接アクセスされにくい Web アプリケーションなどは難読化の重要性はあまり高くありません。

今回はデスクトップアプリケーションである WPF のプロジェクトで確認しています。

Dotfuscator のインストール

このアプリケーションは Visual Studio 2022 に付属されている形にはなっていますが標準インストールでは含まれていません (過去の Visual Studio では最初からインストールされる場合もあります)。

Dotfuscator を追加するには以下の手順を行います。Visaul Studio を起動し、「ツール」から「ツールと機能を取得」を選択します。

上のタブから「個別のコンポーネント」を選択し、「コードツール」グループにある「PreEmptive Protection - Dotfuscator」にチェックをいれて右下のインストールボタンをクリックしてください。その際、Visual Studio 本体は一度閉じてください。

難読化手順

これらの名称をわかりにくく難読化するための手順について説明します。

Visual Studio でアプリケーションを作成し、ビルドを行って .exe ファイル、.dll ファイルを作成してください。ここまでは通常のアプリケーションの作成と同じです。 一応作成するアプリは Release ビルドで作成したものを対象とします。(通常 Debug で公開することはないため)

.exe や .dll を作成したら Visual Studio のメニューから「ツール」を選択し、「PreEmptive Protection - Dotfuscator Community」を選択します。

登録画面が表示されますが必須ではないので不要であればそのままキャンセルボタンをクリックします。

そのまま OK ボタンをクリックします。

Dotfuscator が起動します。このアプリケーションは単独で動作しますので、現在開いているプロジェクトに関係ないファイルでも難読化できます。(一応アプリケーション自体は無償版の場合 Visual Studio が起動していることが前提となります。)

今回はサンプルとして .NET 6.0 の WPF アプリケーションのプロジェクトをデフォルトのままビルドしたものを難読化します。

左の一覧から「入力」を選択し「+」ボタンをクリックします。

難読化するプログラムファイルを選択します。今までの .NET Framework で作成したアプリケーションは .exe を難読化することが多かったですが .NET や .NET Core ではプログラムの実体は .dll であることが多いです。.NET の WPF アプリケーションも実体は .dll になりますので .dll を選択します。

一覧に追加されます。複数の DLL で構成されている場合は複数追加してください。

対象のファイルを追加したらツールバーから「ビルド」ボタンをクリックします。

難読化のプロジェクトファイルの保存場所を聞かれますので指定します。場所は任意で構いませんが難読化したプログラムの出力場所にもなります。 入力内容を保存するものであり、再度難読化したい場合にこの難読化プロジェクトファイルを開くこととなります。拡張子は「.xml」です。

ビルドが開始され下のメッセージ中に「ビルドが完了しました。」と表示されていれば正常に完了したことを示します。 画面にはビルドのログと難読化されたクラスや変数の一覧が表示されます。

左の一覧から「結果」を選択すると、クラス名やメソッド名がどのように変更されたか詳細を見ることができます。

右のツリーのクラス名やメソッド名で「->」のように書かれているものは難読化後の名称になります。このようにクラス名やメソッド名を意味のない名前に変えることによって逆アセンブルされてもソースコードの中身を読みにくくさせることができます。

難読化したプログラムはプロジェクトファイルを保存した場所に「Dotfuscated」というフォルダが作成され、その中に保存されます。

Map.xml は難読化結果ファイルなので削除しても問題ありません。

.NET 6.0 の WPF は DLL 単体では起動できませんのでビルド出力時に生成された「XXXX.exe」と「XXXX.runtimeconfig.json」を同一フォルダにコピーして起動してみて下さい。 正常に起動できればとりあえず問題ありません。起動できない場合はファイルが足りないか難読化で整合性が取れなくなるプログラムの作り方をしている可能性があります。

実際に難読化したプログラムを解析してみるといくつか難読化されている痕跡が見受けられると思います。以下の図の1枚目が難読化前、2枚目が難読化後です。

.NET のライブラリで定義されているクラス名などはフレームワークとして存在しているものなので名前変更の対象にはならないことに注意してください。

今回は作成されたデフォルトのプロジェクトをそのまま難読化したため、ほとんど難読化されていないイメージがあると思いますが、プロジェクトが大きくなるほど独自のクラスも増えるため難読化の効果がはっきりしてくると思います。

また、今回は無償版での手順を載せましたが、有償版を使用するとより複雑な難読化を行うことができたり、逆アセンブル自体を防ぐこともできるようになります。ただ、難読化はいろいろ弊害も発生する可能性も秘めているため、難読化する場合は設計当初から正常に動作するかを考慮しながら作る必要があります。

難読化の除外

難読化したくないクラス名やプロパティ名がある場合は除外することができます。

アセンブリを読み込んでいる状態で画面の左から「名前の変更」「除外」を選択します。 アセンブリの中身が表示されるので難読化したくないものにチェックを入れていきます。

一応細かいレベルで難読化の除外は可能ですが、名前空間単位で調整したほうが楽だと思います。

ライブラリモード

入力したアセンブリを選択すると「ライブラリモード」にチェックがついていることが分かります。

「ライブラリモード」とは、他のプログラムから呼ばれる可能性がある DLL などにつけるためにあります。 これにチェックがついていると他のプログラムから呼ばれる public なクラスやプロパティが難読化対象から除外されます。

しかし、一般的には他のプログラムから汎用的に呼ばれるライブラリを公開することは少なく、単独で動作するアプリケーションを難読化することが多いと思うのでこのチェックは基本的に外しても問題ありません。

単一ファイル化した .exe の難読化について (未確認)

Visual Studio 2022 におけるこの項目についての調査は現在未確認です。

おそらく MSBuild を併用した難読化になると思いますが、現在情報が少ないため保留しています。