ILSpy を使うと、.NET で作られたプログラム(DLL や EXE)を C# のコードに戻して、画面で読めます。この記事では、自分で作った小さなアプリを開き、埋め込んだ秘密が丸見えになることを確かめて、秘密をプログラムに入れてはいけない理由を体験する使い方を説明します。
この記事は、.NET でアプリやライブラリを作っていて、配る前に「ビルドした成果物から何が読み取れるか」を自分の目で確かめたい人に向けています。読み終えると、次のことができるようになります。
- ILSpy のデスクトップ版、コマンドライン版(ilspycmd)、VS Code 拡張の違いが分かる
- 自分でビルドした .NET アプリを開き、コードと文字列を読む
- 埋め込んだダミーの秘密が読めることを確かめ、秘密の持ち方を見直す
ILSpy でできること
ILSpy は、.NET のアセンブリ(実行用にまとめられたファイル)を読むためのブラウザー兼デコンパイラです。公式 README によると、次のことができます。
- アセンブリを C# のコードに戻す(IL という中間言語で表示することもできる)
- プロジェクト全体をまとめて書き出す
- 型・メソッド・プロパティなどを検索し、リンクをたどって移動する
- アセンブリのメタデータ(型や参照の一覧表)を調べる
- ディスクのほか、NuGet フィードと実行中のプロセスからもアセンブリを開く(v11.0 のリリースノートは、実行中のプロセスから開く機能を全 OS で使えると書いています。GAC から開く機能は Windows 専用です)
- プラグインで機能を足す
入手と動作環境
ILSpy は MIT ライセンスです。同じ ILSpy の名前で、使う場面の違う入口がいくつかあります。2026-10-28 時点の最新版は v11.2 です。
| 入口 | 動く環境 | 備考 |
|---|---|---|
| デスクトップ版 | Windows(x64・arm64)、Linux(x64)、macOS(arm64)向けの配布ファイルがある | v11.0 から Avalonia で作り直した版だけを配布している |
| ilspycmd | Windows、Linux、macOS | dotnet tool で入れるコマンドライン版 |
| VS Code 拡張 | VS Code と .NET ランタイムが動く環境 | Wiki の比較表では、リソースやメタデータの解析、PDB の生成、プラグインが使えない |
| Visual Studio 拡張 | Visual Studio 2022 / 2026 | 公式の拡張。Visual Studio 本体にも、F12 で使える逆コンパイル機能が最初から入っている |
デスクトップ版について、公式が書いていることは次のとおりです。
- v11.0 のリリースノートによると、ILSpy は WPF から Avalonia に移りました。これで Linux と macOS でも動くようになりました。WPF 版は完全に取り除かれたので、v11.0 以降は Avalonia 版だけです。WPF 版は Windows 専用でした。
- Windows 向けの zip は、.NET ランタイムが別に要る版(x64・arm64)と、ランタイムを同梱した版(x64)があります。Linux と macOS の配布ファイルは、ランタイムを同梱しています。
- Windows 向けのインストーラー(MSI)は、ユーザー単位(
%LocalAppData%\Programs\ILSpy)に入る設定です。zip を展開して使うなら、どの OS でも管理者権限は要りません。Linux 向けには.debと.rpmもありますが、こちらは/opt/ilspyに入るので root 権限が要ります。 - README によると、Microsoft Store にも版があります(正式版のみ)。
- v11.2 の配布ファイルに、macOS の Intel 向けと、Linux の arm64 向けはありません。その環境では、README のビルド手順で自分で作ります。
ilspycmd のインストールには、.NET SDK 10.0.100 以上が要ります。Windows x64 と Linux x64 では、.NET ランタイムが要らない Native AOT 版が入ります。それ以外の環境では、.NET 10 のランタイムで動く版が入ります。
外と行う通信
ソースコードを読んで確かめた範囲は、次のとおりです。
- デスクトップ版の更新確認。既定で有効です。起動したときにバックグラウンドで、
https://icsharpcode.github.io/ILSpy/updates.xmlを取得して、新しい版があるか調べます。前回の成功から 7 日以内なら調べません。失敗しても、画面にエラーは出ません。「Help → Check for Updates」で手動でも調べられます。止めるには、About 画面の「Automatically check for updates every week」のチェックを外します。 - NuGet フィードから開く機能。「Open from NuGet feed」を使ったときだけ、NuGet のフィードに接続します。既定のフィードは
https://api.nuget.org/v3/index.jsonです。 - ilspycmd の更新確認。既定で有効です。実行のたびに
https://api.nuget.org/v3-flatcontainer/ilspycmd/index.jsonを取得して、最新版と比べます。古いときは、標準エラーに「更新してください」と出します。止めるには--disable-updatecheckを付けます。 - VS Code 拡張。初回の起動時に、.NET ランタイムを自動でダウンロードします。ランタイムは VS Code のフォルダーに入り、システムには手を加えません。Linux だけは、ランタイムに必要なパッケージを入れることがあります。
README のプライバシーの項は、個人を特定できる情報を集めないこと、ユーザーのファイルを第三者のサービスに送らないこと、利用状況の計測サービスを使わないことを書いています。更新確認のコードにも、開いたファイルを送る処理はありませんでした。ただし、ILSpy の全部のコードは読んでいません。
安全な試し方:自作アプリに埋めたダミーの秘密を読む
自分でビルドした小さなアプリを使います。他人のソフトは使いません。ここで埋め込む文字列は、本物ではないダミーです。
-
.NET SDK を入れて、作業用のフォルダーでコンソールアプリを作ります。
dotnet new console -n demo -
demo/Program.csを、次の内容に書き換えます。ダミーの API キーを、コードの中に直接書いています。var apiKey = "DUMMY-API-KEY-0000-NOT-REAL"; Console.WriteLine($"key length: {apiKey.Length}"); -
demoフォルダーでリリースビルドをします。dotnet build -c Releaseできあがる
bin/Release/<フレームワーク名>/demo.dllが、配る形のファイルです。手元の環境(.NET SDK 10.0.402)ではbin/Release/net10.0/demo.dllでした。この DLL の中に、ダミーの文字列が UTF-16 のまま入っていることを、バイト列の検索で確かめました。つまり、読み出すのに特別な技術は要りません。 -
リリースページから、自分の環境に合う zip を入手して展開し、ILSpy を起動します。.NET ランタイムが別に要る Windows 版の zip を選ぶなら、先に .NET 10 のランタイムを入れます。ランタイムを入れたくないときは、
selfcontainedの付いた zip を選びます。 -
demo.dllを開きます(File メニューから開きます)。 -
左のツリーで
Programを選びます。右に戻した C# のコードが出て、apiKeyに入れたダミーの文字列が、そのまま読めるはずです。 -
検索ボックスで、
c:DUMMYのように種類を絞って探すこともできます。検索の種類には Constant があります。ただし、Constant で探せる値の範囲は、公式の説明では確かめられませんでした。見つからないときは、Programを開いて直接読みます。 -
確かめたら、秘密の持ち方を見直します。キー、トークン、パスワードを、コードやアプリの設定ファイルに書いて配ってはいけません。環境変数、秘密管理サービス、サーバー側の処理で持ちます。すでに配ったビルドに本物の秘密が入っていた場合は、漏れたものとして扱い、キーを再発行します。
コマンドラインで一括して調べることもできます。
-
ilspycmd を入れます。
dotnet tool install --global ilspycmd -
DLL を指定して実行します。出力先を省くと、戻した C# が標準出力に出ます。
ilspycmd --disable-updatecheck demo.dll -
出力を検索ツールにかけると、ビルドのたびに秘密が残っていないかを点検できます。同じ目的で、ソースやリポジトリの履歴を調べる gitleaks と組み合わせるのも手です。
主な使い方
ilspycmd の主なオプションです。全部は ilspycmd --help で確かめられます。
| オプション | 内容 |
|---|---|
-o、--outputdir |
出力先のフォルダー。省くと標準出力に出る |
-p、--project |
コンパイルできるプロジェクトとして書き出す。-o が必要 |
-t、--type |
完全修飾名で指定した型だけを戻す |
-m、--member |
1 つのメンバーだけを戻す |
-il、--ilcode |
C# ではなく IL で出す |
-l、--list |
class、interface、struct、delegate、enum を一覧にする |
--list-resources |
埋め込まれたリソースを一覧にする |
--resource |
リソースを 1 つ取り出す。.baml は XAML に戻る |
-genpdb、--generate-pdb |
PDB を生成する |
-r、--referencepath |
依存する DLL のあるフォルダー |
--disable-updatecheck |
更新確認をしない |
デスクトップ版では、リンクをたどって型や参照先へ移動し、基底型と派生型の間も行き来できます。
Ghidra・x64dbg・jadx との違い
| ILSpy | Ghidra | x64dbg | jadx | |
|---|---|---|---|---|
| 主な対象 | .NET のアセンブリ | ネイティブの実行ファイル全般 | Windows のネイティブ実行ファイル | Android アプリの Dex |
| 結果 | 戻した C# と IL | 逆アセンブルと逆コンパイル | 動かしながら見る命令・メモリ | 戻した Java |
| 動かすか | ファイルを読む。README の機能一覧にデバッガーはない | 読むのが中心 | プログラムを動かして止める | ファイルを読む |
.NET のプログラムは、中間言語(IL)にメタデータが付いた形で配られます。このため、ILSpy で戻したコードは、元の C# にかなり近くなります。ネイティブの実行ファイルでは、同じようにはなりません。
目的で選ぶなら、次のようになります。.NET の成果物の中身を読むなら ILSpy、ネイティブの実行ファイルなら Ghidra、動いている最中の挙動を見るなら x64dbg、Android アプリなら jadx です。
注意点
- 読むのは、自分が作ったアプリ、または解析してよいと明記された教材だけにしてください。他人のソフトは、利用規約や使用許諾契約が解析を禁じていることがあります。ILSpy は、保護の解除やライセンスの回避のための道具ではありません。
- 出どころの分からないアセンブリを開くときは、普段使いのパソコンとは分けた環境を使ってください。v11.0 のリリースノートには、細工されたファイルを読み込んだときの問題を防ぐ修正が並んでいます。新しい版を使ってください。
- プラグインは、ILSpy の中で動くプログラムです。提供元を確かめてから入れてください。
- 戻したコードには、エラーや読み違いが混じることがあります。重要な判断は、IL の表示や、実際の動作でも確かめてください。
- ILSpy で秘密が読めないからといって、安全とは言えません。難読化は読みにくくするだけで、秘密を守る手段ではありません。秘密は、配るプログラムに入れないのが基本です。
- 本体は、公式の GitHub リリースページか、README に載っているマーケットプレイスから入手してください。
次に読む
出典
- 公式リポジトリ README(機能・フロントエンド・ビルド・プライバシーの記述)github.com/icsharpcode/ILSpy/blob/master/README.md
- ライセンス(MIT)github.com/icsharpcode/ILSpy/blob/master/LICENSE
- リリース v11.0(WPF 版の廃止と Avalonia 版への移行)github.com/icsharpcode/ILSpy/releases/tag/v11.0
- リリース v11.2(最新版と配布ファイル)github.com/icsharpcode/ILSpy/releases/tag/v11.2
- ソース:配布ファイルを作る手順(publish.ps1)github.com/icsharpcode/ILSpy/blob/master/publish.ps1
- ソース:インストーラーの設定(setup.cs、ユーザー単位のインストール)github.com/icsharpcode/ILSpy/blob/master/ILSpy.Installer/setup.cs
- ソース:更新確認のコード(UpdateService.cs)github.com/icsharpcode/ILSpy/blob/master/ILSpy/Updates/UpdateService.cs
- ソース:更新確認の設定の既定値(UpdateSettings.cs)github.com/icsharpcode/ILSpy/blob/master/ILSpy/Updates/UpdateSettings.cs
- ソース:About 画面の更新確認のチェックボックス(AboutCommand.cs)github.com/icsharpcode/ILSpy/blob/master/ILSpy/Commands/AboutCommand.cs
- ソース:NuGet フィードの既定値(NuGetFeedSettings.cs)github.com/icsharpcode/ILSpy/blob/master/ILSpy/NuGetFeeds/NuGetFeedSettings.cs
- ilspycmd の README(インストール・オプション)github.com/icsharpcode/ILSpy/blob/master/ICSharpCode.ILSpyCmd/README.md
- ソース:ilspycmd の更新確認(DotNetToolUpdateChecker.cs)github.com/icsharpcode/ILSpy/blob/master/ICSharpCode.ILSpyCmd/DotNetToolUpdateChecker.cs
- VS Code 拡張の READMEgithub.com/icsharpcode/ilspy-vscode/blob/master/README.md
- VS Code 拡張のインストール手順(Wiki)github.com/icsharpcode/ilspy-vscode/wiki/Installation
- VS Code 拡張とデスクトップ版の機能比較(Wiki)github.com/icsharpcode/ilspy-vscode/wiki/Feature-Comparison
- Linux 向け rpm パッケージの定義(ilspy.spec)github.com/icsharpcode/ILSpy/blob/master/BuildTools/packaging/linux/rpm/ilspy.spec
- 検索オプション(Wiki)github.com/icsharpcode/ILSpy/wiki/Search-Options
確認日 2026-10-28
似たツール
Ghidra
影響範囲 手元だけ米国 NSA が開発し、オープンソースで無料公開しているリバースエンジニアリングの道具一式。コンパイル済みのプログラムを逆アセンブル・逆コンパイルして、中身を読めるようにします。
- 用途
- 学習
- 形式
- デスクトップアプリ
- 難易度
- 上級
- ライセンス
- 自由に使えるApache-2.0
- 分類
- リバースエンジニアリング/学習・演習環境
Gitleaks
影響範囲 手元だけGit リポジトリやファイルに紛れ込んだパスワード、API キー、トークンなどの秘密情報を見つけるコマンドラインツール。
- 用途
- 防御
- 形式
- コマンドライン
- 難易度
- 初級
- ライセンス
- 自由に使えるMIT
- 分類
- 脆弱性スキャン
jadx
影響範囲 手元だけAndroid アプリの APK や DEX を Java のソースコードに戻して読むデコンパイラ。画面から読む GUI 版と、コマンドラインで一括出力する版があります。
- 用途
- 診断・監査
- 形式
- デスクトップアプリ
- 難易度
- 中級
- ライセンス
- 自由に使えるApache-2.0
- 分類
- リバースエンジニアリング/モバイルセキュリティ
x64dbg
影響範囲 外に届くWindows 向けのオープンソースのデバッガー。ソースコードのない実行ファイルを動かしながら止め、命令・レジスター・メモリを見て動作を調べます。
- 用途
- 学習
- 形式
- デスクトップアプリ
- 難易度
- 上級
- ライセンス
- 条件つきGPL-3.0
- 分類
- リバースエンジニアリング/マルウェア解析