ILSpyで.NETのアセンブリを逆コンパイルしてソースコードを参照する [C#]

数年前に作成された業務アプリケーションのカスタマイズやリプレースを行う際に、他社が作成したアプリケーションなので、ソースコードを参照することができない場合や、当時の担当者が退職をしてしまい連絡が取れず、ソースコードもどこにあるのかわからない。ソースコードがあってもどれが最新のものかわからない。そんな状況は時々起こるものです。
そんな時に便利なのが、今回紹介する「ILSpy」というアプリケーションです。
以前は「.NET Reflector」というツールが有名だったのですが、現在は有償化されていて気軽に使うことができません。その点「ILSpy」は無償で提供されているので個人でも気軽に使うことができます。
ILSpyは.NETで作成されたアセンブリをリバースエンジニアリングによって逆コンパイル(逆アセンブル)してくれるツールです。
本記事ではこの「ILSpy」の入手から使用方法について紹介したいと思います。

ILSpyのダウンロード

まず、ILSpyをダウンロードします。ILSpyは2019年11月現在、GitHubで管理されていますので、GitHubからダウンロードします。

ILSpyのダウンロードサイト

ダウンロードサイトを開いたら、ILSpyのバイナリーファイルをダウンロードします。

GitHubのILSpyのダウンロードサイト

2019年11月時点では「ILSpy_binaries_5.0.2.5153」が最新バージョンなので、これをダウンロードします。

ダウンロードしたILSpyのZipファイル

ダウンロードしたZipファイルを解凍します。
解凍するとたくさんのファイルができますが、ILSpyの実行ファイルは「ILSpy.exe」になります。

Zipファイル解凍後のILSpyのファイル

実行ファイルをダブルクリックするとILSpyが起動します。

ILSpyの起動

ILSpyはインストールが不要なので.NET frameworkがインストールされているPCであればexeを実行するだけで動作します。

逆コンパイルするプログラムの準備

ILSpyで逆コンパイルするサンプルのプログラムとして、お馴染みのHelloWorldを表示するアプリケーションをを作成します。
HelloWorldはコンソールアプリケーションで作成します。

Visual Studioを起動して、スタートページの「新しいプロジェクトの作成」をクリックするか、[ファイル]メニューにある[新規作成] > [プロジェクト]をクリックして、C#のコンソールアプリ (.NET Framework)を選択します。

プロジェクトが作成できたらProgram.csファイルのコードを以下のように変更します。

コードを変更したらプロジェクトをビルドして実行ファイル(CsHelloWorld.exe)を作成します。

ILSpyを使用する

ILSpyの使い方として

  • アセンブリを開いてリスト(ツリー)に追加する。
  • 開いたアセンブリをリストから削除する。
  • 逆コンパイルしたソースコードを保存する。

の3つの方法を紹介します。

アセンブリを開く

先ほど作成したHelloWorldの実行ファイルをILSpyから開きます。
ILSpyの[File]メニューの[Open]をクリックします。

ILSpyでアセンブリを開く

ファイルを開くダイアログが表示されるので、ILSpyで開くexeやdllなどのアセンブリを選択します。
アセンブリを開くと左ペインのツリービューに追加されます。

ILSpyにアセンブリを追加

上記では[File]メニューからアセンブリを開きましたが、左ペインのツリービューに目的のアセンブリファイルをドラッグアンドドロップすることで開く(ツリービューに追加する)こともできます。

ツリービューに追加した「CsHelloWorld」のノードを展開します。
サンプルプログラムではProgram.csに処理を記述したので「Program」を選択します。

ILSpyのツリービューのProgramを選択

選択すると逆コンパイルした結果のソースコードが右ペインに表示されます。
選択時はデフォルトで右ペインのソースコードが処理ごとに閉じられているので「+」をクリックして展開します。

右ペインを右クリックするとコンテキストメニューが表示されるので、コンテキストメニューの[Toggle All Folding]をクリックしてすべてのソースコードを展開することもできます。

ILSpyの右ペインのコンテキストメニューの[Toggle All Folding]

処理(「+」で閉じられている部分)が多く、1つずつ展開するのが面倒な場合は[Toggle All Folding]をクリックすると簡単にすべてのソースを表示することができます。

ILSpyでC#で作成したアセンブリを逆コンパイルして表示されるソースコード

逆コンパイルされたソースコードでは、元のソースコードに記述したコメントや改行(空行)などが削除されています。

ILSpyではC#で作成したアセンブリ以外にVisual Basicなどで作成したアセンブリでも逆コンパイルすることができます。

Visial Basicで作成したアセンブリを逆コンパイルした結果

ILSpyでVisual Basicで作成したアセンブリを逆コンパイルして表示されるソースコード

元のVisial BasicのModule1.vbのソースコード

アセンブリを削除する

ILSpyで開いたアセンブリを左ペインのツリービューから削除する場合は、削除するアセンブリを選択して右クリックします。

ILSpyのツリービューからアセンブリを削除

コンテキストメニューが表示されますので[Remove]をクリックします。

アセンブリは、複数選択して一括して削除することもできます。

ILSpyのツリービューから複数のアセンブリを削除

ILSpyはインストール時にデフォルトでいくつかのアセンブリがツリービューに追加されているので、必要がなければすべて削除してしまっても構いません。

ILSpyのツリービューからすべてのアセンブリを削除

上記ではコンテキストメニューの[Remove]で削除しましたが、ツリービューのアセンブリはDeleteキーで削除することもできます。

ILSpyのツリービューのすべてのアセンブリを削除

私の場合はデフォルトのアセンブリは不要なので、すべて削除しています。

ソースコードを保存する

ソースコードの保存はILSpyの[File]メニューの[Save Code]メニューから実行できます。
保存するアセンブリを選択して、[File]メニューの[Save Code]をクリックします。

ILSpyのアセンブリの保存

[Save Code]は左ペインの右クリックで表示されるコンテキストメニューにもあります。

ILSpyのコンテキストメニューからアセンブリの保存

[Save Code]をクリックすると、名前を付けて保存ダイアログが表示されるので、任意の保存先を選択して[保存]をクリックします。

ILSpyのアセンブリを保存

保存が完了すると右ペインにOpen Explorerと表示されるので、クリックすると保存したフォルダーがエクスプローラーで開かれます。

ILSpyのアセンブリを保存したファイル

アセンブリは1つのプロジェクトとして保存されます。

上記では1つのアセンブリを選択して保存しましたが、アセンブリは複数選択して1つのソリューションとして保存することもできます。

ILSpyのアセンブリを複数選択して保存

ツリービューから複数のアセンブリを選択して[Save Code]をクリックします。

ILSpyの複数のアセンブリを1つのソリューションに保存したファイル

複数のアセンブリを一度に保存すると、アセンブリがそれぞれプロジェクトとなり、1つのソリューションにまとめられます。

あとがき

今回の記事では、ILSpyを使用した逆コンパイルをご紹介しました。

ILSpyには、実際に何度か助けられたことがあります。つい先日も、とある案件でアプリケーションを改修しなければならなかったのですが、そのアプリケーションの一部のロジックが、製造元の会社が作成したアセンブリ(dll)になっており、そのソースコードがありません。
製造元に問い合わせても「そのアセンブリは弊社で作成した開発用のユーティリティーライブラリなのでソースコードは提供できない。」と言われてしまいました。(基本契約上はアプリケーションに関するソースコードはすべて納品することになっているのですが、当時の担当者がそのあたりをきちんと管理していなかったようです。)
そして運の悪いことにアプリケーションの改修には、そのライブラリの変更が必要だったのです。
そこで、ILSpyを用いてアセンブリの逆コンパイルを行い、ソースコードを抽出して必要な修正をして再度コンパイルしました。
かなり大きなアセンブリだったので、修正箇所を見つけるのに苦労しましたが、アプリケーションの販売元の担当者の方が「今では自社ソースとして管理できるようになったので、これから何か改変があったとしても安心です。」とおっしゃっていました。(ちなみにソースコードを提供しなかった会社とは取引をやめたそうです。)

.NETで作成したアプリケーションは、リバースエンジニアリングが簡単にできてしまうという点があります。これは長所でもあり短所でもあります。
個人や自社で開発したアプリケーションであれば、リバースエンジニアリングに対する対策をしておかないと、上記のように容易にソースコードを見ることができてしまいます。
ですので、公開や販売を行うアプリケーションでソースコードを見られたくないのなら、完全に防ぐことはできませんが、難読化ツールなどを使用して逆コンパイルによるソースコードの閲覧を困難にする必要があるかもしれません。
特に、アプリケーション内にシステムへログインするための管理者IDやパスワードを、ハードコーディングで埋め込んでいる場合などは、セキュリティ的に危険です。

逆に商用のソフトウェアを無断で逆コンパイルすることは著作権の侵害にあたる恐れがありますので、使用には十分注意が必要です。

.NETアセンブリのリバースエンジニアリングツールであるILSpyはとても便利なツールですが、使い方を誤ると良くない事態になる可能性もあります。
ILSpyなどのツールはそのことを十分理解した上で注意して使った方がいいと思います。