ILSpyで.NETのアセンブリを逆コンパイルしてソースコードを参照する [C#]
数年前に作成された業務アプリケーションのカスタマイズやリプレースを行う際に、他社が作成したアプリケーションなので、ソースコードを参照することができない場合や、当時の担当者が退職をしてしまい連絡が取れず、ソースコードもどこにあるのかわからない。ソースコードがあってもどれが最新のものかわからない。そんな状況は時々起こるものです。 そんな時に便利なのが、今回紹介する「ILSpy」というアプリケーションです。 以前は「.NET Reflector」というツールが有名だったのですが、現在は有償化されていて気軽に使うことができません。その点「ILSpy」は無償で提供されているので個人でも気軽に使うことができます。 ILSpyは.NETで作成されたアセンブリをリバースエンジニアリングによって逆コンパイル(逆アセンブル)してくれるツールです。 本記事ではこの「ILSpy」の入手から使用方法について紹介したいと思います。
目次
- 1 ILSpyのダウンロード
- 2 逆コンパイルするプログラムの準備
- 3 ILSpyを使用する
- 3.1 アセンブリを開く
- 3.2 アセンブリを削除する
- 3.3 ソースコードを保存する
- 4 あとがき
ILSpyのダウンロード
まず、ILSpyをダウンロードします。ILSpyは2019年11月現在、GitHubで管理されていますので、GitHubからダウンロードします。
ILSpyのダウンロードサイト
ダウンロードサイトを開いたら、ILSpyのバイナリーファイルをダウンロードします。
2019年11月時点では「ILSpy_binaries_5.0.2.5153」が最新バージョンなので、これをダウンロードします。
ダウンロードしたZipファイルを解凍します。 解凍するとたくさんのファイルができますが、ILSpyの実行ファイルは「ILSpy.exe」になります。
実行ファイルをダブルクリックするとILSpyが起動します。
ILSpyはインストールが不要なので.NET frameworkがインストールされているPCであればexeを実行するだけで動作します。
逆コンパイルするプログラムの準備
ILSpyで逆コンパイルするサンプルのプログラムとして、お馴染みのHelloWorldを表示するアプリケーションをを作成します。 HelloWorldはコンソールアプリケーションで作成します。
Visual Studioを起動して、スタートページの「新しいプロジェクトの作成」をクリックするか、[ファイル]メニューにある[新規作成] > [プロジェクト]をクリックして、C#のコンソールアプリ (.NET Framework)を選択します。
プロジェクトが作成できたらProgram.csファイルのコードを以下のように変更します。
C# using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace CsHelloWorld { class Program { static void Main(string[] args) { // メッセージを取得する var message = GetMessage(); // Hellw worldをコンソールに表示する Console.WriteLine(); Console.ReadKey(); } static string GetMessage() { return "Hellow C Sharp world !"; } } } 123456789101112131415161718192021222324252627 using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks; namespace CsHelloWorld{ class Program { static void Main(string[] args) { // メッセージを取得する var message = GetMessage(); // Hellw worldをコンソールに表示する Console.WriteLine(); Console.ReadKey(); } static string GetMessage() { return "Hellow C Sharp world !"; } }}コードを変更したらプロジェクトをビルドして実行ファイル(CsHelloWorld.exe)を作成します。
ILSpyを使用する
ILSpyの使い方として
- アセンブリを開いてリスト(ツリー)に追加する。
- 開いたアセンブリをリストから削除する。
- 逆コンパイルしたソースコードを保存する。
の3つの方法を紹介します。
アセンブリを開く先ほど作成したHelloWorldの実行ファイルをILSpyから開きます。 ILSpyの[File]メニューの[Open]をクリックします。
ファイルを開くダイアログが表示されるので、ILSpyで開くexeやdllなどのアセンブリを選択します。 アセンブリを開くと左ペインのツリービューに追加されます。
上記では[File]メニューからアセンブリを開きましたが、左ペインのツリービューに目的のアセンブリファイルをドラッグアンドドロップすることで開く(ツリービューに追加する)こともできます。
ツリービューに追加した「CsHelloWorld」のノードを展開します。 サンプルプログラムではProgram.csに処理を記述したので「Program」を選択します。
選択すると逆コンパイルした結果のソースコードが右ペインに表示されます。 選択時はデフォルトで右ペインのソースコードが処理ごとに閉じられているので「+」をクリックして展開します。
右ペインを右クリックするとコンテキストメニューが表示されるので、コンテキストメニューの[Toggle All Folding]をクリックしてすべてのソースコードを展開することもできます。
処理(「+」で閉じられている部分)が多く、1つずつ展開するのが面倒な場合は[Toggle All Folding]をクリックすると簡単にすべてのソースを表示することができます。
逆コンパイルされたソースコードでは、元のソースコードに記述したコメントや改行(空行)などが削除されています。
ILSpyではC#で作成したアセンブリ以外にVisual Basicなどで作成したアセンブリでも逆コンパイルすることができます。
Visial Basicで作成したアセンブリを逆コンパイルした結果 元のVisial BasicのModule1.vbのソースコード Module Module1 Sub Main() ' メッセージを取得する Dim message = GetMessage() ' Hellw worldをコンソールに表示する Console.WriteLine(message) Console.ReadKey() End Sub Function GetMessage() As String Return "Hello Visual Basic world !" End Function End Module 1234567891011121314151617 Module Module1 Sub Main() ' メッセージを取得する Dim message = GetMessage() ' Hellw worldをコンソールに表示する Console.WriteLine(message) Console.ReadKey() End Sub Function GetMessage() As String Return "Hello Visual Basic world !" End Function End Module アセンブリを削除するILSpyで開いたアセンブリを左ペインのツリービューから削除する場合は、削除するアセンブリを選択して右クリックします。
コンテキストメニューが表示されますので[Remove]をクリックします。
アセンブリは、複数選択して一括して削除することもできます。
ILSpyはインストール時にデフォルトでいくつかのアセンブリがツリービューに追加されているので、必要がなければすべて削除してしまっても構いません。
上記ではコンテキストメニューの[Remove]で削除しましたが、ツリービューのアセンブリはDeleteキーで削除することもできます。
私の場合はデフォルトのアセンブリは不要なので、すべて削除しています。
ソースコードを保存するソースコードの保存はILSpyの[File]メニューの[Save Code]メニューから実行できます。 保存するアセンブリを選択して、[File]メニューの[Save Code]をクリックします。
[Save Code]は左ペインの右クリックで表示されるコンテキストメニューにもあります。
[Save Code]をクリックすると、名前を付けて保存ダイアログが表示されるので、任意の保存先を選択して[保存]をクリックします。
保存が完了すると右ペインにOpen Explorerと表示されるので、クリックすると保存したフォルダーがエクスプローラーで開かれます。
アセンブリは1つのプロジェクトとして保存されます。
上記では1つのアセンブリを選択して保存しましたが、アセンブリは複数選択して1つのソリューションとして保存することもできます。
ツリービューから複数のアセンブリを選択して[Save Code]をクリックします。
複数のアセンブリを一度に保存すると、アセンブリがそれぞれプロジェクトとなり、1つのソリューションにまとめられます。
あとがき
今回の記事では、ILSpyを使用した逆コンパイルをご紹介しました。
ILSpyには、実際に何度か助けられたことがあります。つい先日も、とある案件でアプリケーションを改修しなければならなかったのですが、そのアプリケーションの一部のロジックが、製造元の会社が作成したアセンブリ(dll)になっており、そのソースコードがありません。 製造元に問い合わせても「そのアセンブリは弊社で作成した開発用のユーティリティーライブラリなのでソースコードは提供できない。」と言われてしまいました。(基本契約上はアプリケーションに関するソースコードはすべて納品することになっているのですが、当時の担当者がそのあたりをきちんと管理していなかったようです。) そして運の悪いことにアプリケーションの改修には、そのライブラリの変更が必要だったのです。 そこで、ILSpyを用いてアセンブリの逆コンパイルを行い、ソースコードを抽出して必要な修正をして再度コンパイルしました。 かなり大きなアセンブリだったので、修正箇所を見つけるのに苦労しましたが、アプリケーションの販売元の担当者の方が「今では自社ソースとして管理できるようになったので、これから何か改変があったとしても安心です。」とおっしゃっていました。(ちなみにソースコードを提供しなかった会社とは取引をやめたそうです。)
.NETで作成したアプリケーションは、リバースエンジニアリングが簡単にできてしまうという点があります。これは長所でもあり短所でもあります。 個人や自社で開発したアプリケーションであれば、リバースエンジニアリングに対する対策をしておかないと、上記のように容易にソースコードを見ることができてしまいます。 ですので、公開や販売を行うアプリケーションでソースコードを見られたくないのなら、完全に防ぐことはできませんが、難読化ツールなどを使用して逆コンパイルによるソースコードの閲覧を困難にする必要があるかもしれません。 特に、アプリケーション内にシステムへログインするための管理者IDやパスワードを、ハードコーディングで埋め込んでいる場合などは、セキュリティ的に危険です。
逆に商用のソフトウェアを無断で逆コンパイルすることは著作権の侵害にあたる恐れがありますので、使用には十分注意が必要です。
.NETアセンブリのリバースエンジニアリングツールであるILSpyはとても便利なツールですが、使い方を誤ると良くない事態になる可能性もあります。 ILSpyなどのツールはそのことを十分理解した上で注意して使った方がいいと思います。