Visual Studio ãããã¬ã¼ã§éã¢ã»ã³ã㪠ã³ã¼ãã表示ãã (C#ãC++ãVisual BasicãF#) View disassembly code in the Visual Studio debugger (C#, C++, Visual Basic, F#) 10/30/2018 M o i O ãã®è¨äºã®å
容 [éã¢ã»ã³ãã«] ã¦ã£ã³ãã¦ã«ã¯ãã³ã³ãã¤ã©ã«ãã£ã¦ä½æãããå½ä»¤ã«å¯¾å¿ããã¢ã»ã³ã㪠ã³ã¼ãã表示ããã¾ãã C:\Program Files (x86)\Microsoft Visual Studio\2019\Community>cl /EHsc C:\Users\{ã¦ã¼ã¶ã¼å}\main_cpp.cpp ãã®æç¹ã§ã¨ã©ã¼ã¨ãxxx.libãããã¾ããçãªã¡ãã»ã¼ã¸ãç¡ããªã90ï¼
åã£ããããªãã®ã§ãã ç°å¢å¤æ°ã確èªãã .NET Reflector に始まり dotPeek, ILSpy, etc... 大体の場合はこれらを使うことでかなり読みやすいコードが出力されます。 .NET開発では、プログラム内部の動作をデバッグするなどの目的で、逆コンパイラ(decompiler)が用いられることがよくある。逆コンパイラとは、.NETアセンブリ(=.EXEファイルや.DLLファイルなど)から、C#やVB(Visual Basic)などのソース・コードを生成できるツールのことである。, 有名なツールに、.NET Reflectorがあり、これに機能を追加するアドインも豊富に提供されている(.NET Reflectorについては、「.NET Tools:.NET逆コンパイラとコードを難読化するDotfuscator」を参照してほしい)。.NET Reflector(標準版)は、長らく無償で提供されてきたが、2011年3月10日から35米ドルの有料となった(※執筆時点。なお、この有償化の理由は、これまで実施してきた無償版+有償版という組み合わせのビジネス・モデルの収益では開発を維持できないから、ということである)。, この流れに対応して、オープンソースによる無償の逆コンパイラ・ツール「ILSpy」の開発が開始された。そこで本TIPSでは、このILSpyの入手から利用までを紹介する。, ※ILSpyのバージョンは、2011年4月7日時点で「1.0 M1(マイルストーン1)」、つまり、まだベータ版である。筆者が試す限りでは問題なく利用できているが、場合によってはエラーが発生したり、不安定な部分が存在したりする可能性があるので、実利用する際にはご留意いただきたい。また、ILSpyは残念ながら(執筆時点で)VBに対応していない。, ILSpyは、無償の.NET開発ツール「SharpDevelop」の一部コンポーネントとしてSourceForge.netで配布されている。, 上記のリンク先を開き、(SourceForge.netの場合、[1.0]というリンクをクリックして開き、次の表示されるページで)「xxx_Binaries.zip」(例:「ILSpy_1.0.0.417_M1_Binaries.zip」)というリンクをクリックすると、ダウンロードが開始される。ダウンロードされた.ZIPファイルを展開すると、次の画面のように表示されるので、ILSpy.exeファイルをダブルクリックするなどして実行すれば、ILSpyのGUI(Windowsアプリケーション)が起動する。, ILSpyでは、次の画面に示すように左側ペインに各アセンブリ(とその内容)がツリー形式で表示され、そこで選択しているアセンブリ項目(もしくは、その内容項目)の逆コンパイル結果が右側ペインに表示される。, 左側のアセンブリ・ツリーには、.NET Framework基本クラス・ライブラリ(BCL)の主なアセンブリ(「mscorlib」や「System」)がデフォルトで登録されている。, ここに登録されていないアセンブリを逆コンパイルしたい場合には、メニューバーから[File]−[Open from GAC]を選択する。これにより[Open From GAC]ダイアログ(次の画面を参照)が起動し、そこでGAC(グローバル・アセンブリ・キャッシュ)に存在するアセンブリの一覧が表示されるので、適切なアセンブリ項目を選択して[Open]ボタンをクリックする。, その結果、ILSpyの左側にあるアセンブリ・ツリーにアセンブリ項目(この例では「System.Web」)が追加される。, なお、[Open From GAC]ダイアログに表示されるアセンブリが多すぎて、目的のアセンブリを見つけにくいときには、[Search]テキストボックスにアセンブリ名の一部を入力して検索するとよい。, BCLのアセンブリではなく、任意のアセンブリ(厳密にはGACに存在しないアセンブリ)を追加したい場合は、メニューバーから[File]−[開く]を選択する(もしくはツールバー上にある[Open]ボタンをクリックする)。これにより[開く]ダイアログ(次の画面を参照)が表示されるので、適切なアセンブリ・ファイルを選択して[開く]ボタンをクリックする。, その結果、ILSpyの左側にあるアセンブリ・ツリーにアセンブリ項目(この例では「WpfRibbonApplication1」)が追加される。, 以上のようにして追加された.NETアセンブリの目的のクラスなどを、左側のアセンブリ・ツリーで選択する。これにより、右側の逆コンパイル結果にそのクラスのC#ソース・コードが表示される(次の画面を参照)。, 逆コンパイル結果は、ソース・ファイルとして保存できる。厳密には、アセンブリ項目の場合はVisual C#のプロジェクトとして、その配下にあるクラス項目などは.csファイルとして保存できる(なお、ツールバー上のコンボボックスで「IL」を選択している場合は、.ilファイルとして保存できる。ただし、ILではプロジェクト単位で保存できない)。, 実際に保存するには、メニューバーから[File]−[Save Code]を実行する。これにより、[名前を付けて保存]ダイアログが表示されるので、任意のフォルダにファイルやプロジェクトを保存すればよい。以下の画面に、その手順を示す。. éã³ã³ãã¤ã©ã¨ã¯ã.NETã¢ã»ã³ã㪠ï¼ï¼.EXEãã¡ã¤ã«ã.DLLãã¡ã¤ã«ãªã©ï¼ãããC#ãVBï¼Visual Basicï¼ãªã©ã®ã½ã¼ã¹ã»ã³ã¼ããçæã§ãããã¼ã«ã®ãã¨ã§ããã Visual Studioããªãã¦ãã使ããããã°ã©ã ãæåã§ã³ã³ãã¤ã«ãããã¨ãã§ãããã§ãã ä»åã¯ããã®æé ãå¾¹åºè§£èª¬ãã¦ããã¾ããã¾ããã³ã³ãã¤ã«ã»ã³ã³ãã¤ã©ã£ã¦ãªãã ããï¼ãã¨ããæ¹ã«åãã¦ãåºç¤çãªè§£èª¬ãè¡ã£ã¦ããã¾ãã®ã§ str1, str2などとなりますが、それは仕方ないので我慢しましょう。, 2011年の3月に有償化され、気軽には使えなくなりましたが、 その際いくつかの競合プロダクトが無償化、公開されました。, dotPeek: Free .NET Decompiler & Assembly Browser by JetBrains ãããæ¹æ³ã¯ãä½éããèããããã WSL ã使ã Visual Studio ã使ã WSLã使ã£ã¦Cè¨èªã®éçºç°å¢ãæ´ããæ¹æ³ã¯ã以åç´¹ä»ãããã¡ã¼ã«ã¢ãã¬ã¹ãå
¬éããããã¨ã¯ããã¾ããã * ãä»ãã¦ããæ¬ã¯å¿
é é
ç®ã§ã Visual Studioã§C#ãã¡ã¤ã«ãã³ã³ãã¤ã«ããã«ã¯ããã«ãããããã°ãããã§ããã PLããã§ãããã«ãã¨ãªãã«ãã使ãåããªããå®è¡ãã¦ã¿ã¾ãããï¼ãã¨ãææ³ãã¹ã«ã¯ãããããæ³¨æãã¦ãã ãããã ã¢ããªãå®è¡ããã«ã¯ã³ã³ãã¤ã«ãå¿
è¦ 実際のプロダクトのコードを全部ILで読もうとしたら辛さしかありません。, しかし、後述するように、C#のコードそのものを復元するデコンパイラも開発されていますので、 éã³ã³ãã¤ã« ã¨ã¯ãå®è¡å¯è½å½¢å¼ã®ã³ã³ãã¥ã¼ã¿ããã°ã©ã ãè§£æããéçºæã«ç¨ããããããã°ã©ãã³ã°è¨èªã«ããè¨è¿°ï¼ã½ã¼ã¹ã³ã¼ãï¼ã«æ»ã夿å¦çã®ãã¨ã� 元のコードにかなり忠実に復元されます。, 本記事ではC#に限らず、.NETに関わる言語全般のデコンパイルをする方法を書いていきます。*1*2, C#(や、VB.NETなど)では、コンパイル時に直接ネイティブコードにするのではなく、 Download today. 勉強にもなりますしね。, 今回は取り上げていませんが、VB.NETの生成物からC#、C#の生成物からVB.NET、F#の生成物からC#なんてことも出来ますので、 ILの仕様を理解しないと、たったこれだけでも割と四苦八苦してしまいそうです。 dllやexeに対して使用する事でILをテキストとして出力できます。, 今回はGUIで操作をしますが、コマンドラインからも実行できるので、一括で処理したい場合などはそちらをご利用ください。, それでは試しに適当なコードを書いてコンパイルしたものをildasm.exeに通してみましょう。, これを作成してDebugビルド。生成されたdllを先ほどのウィンドウで開いてみましょう。, 上から順に名前空間、クラス名、クラス情報(.class)、コンストラクタ情報(.ctor)、HelloHogehogeメソッドの情報です。 しかしなんとなく"Hello {0}"文字列を使ってstring.Format()を呼び出している様に見えます。 å¨ï¼ããã«ãããéããããã°ãã«ãã§ã¯ããªã³ã³ãã¤ã«ããããã使ç¨ãããã«ãã¦ãã¦ãä½ãã¨ã©ã¼ãçºçããªãã®ã§ããã ãªãªã¼ã¹ãã«ãã§ã¯ ãããªã³ã³ãã¤ã« ãããã¼ ãã¡ã¤ã«ãæ§ãã¼ã¸ã§ã³ã®ã³ã³ãã¤ã©ã§ä½æããã¦ãã¾ãã 最初に書いたものとほぼ同等のものが出力されました。, ここまで見事に戻されると、センシティブな情報をコード内に埋め込むことは非常に怖い、 JetBrains社製のデコンパイラ。 最近のDocker隆盛も相まって、Linux環境で実行する機会も増えており、 そしてなんとなくですがwordって変数っぽいものが見えます。*4, なんとなーくわかりますね。ただ、C#のコードからはかなり程遠いものが出てきます。 ã³ã§éçºãã¦ããVB6ããã°ã©ã ã®ã½ã¼ã¹ããªããªã£ã¦ãã¾ãã¾ãããå®è¡ãã¡ã¤ã«ã¯æ®ã£ã¦ããã§ããï¼éã³ã³ãã¤ã©ã§ãå§ãã®ã£ã¦ããã¾ããï¼ 変数名の情報(誤ってDebugビルドで提供されていない限り)は残っていないので、 Visual Studioに付属しているildasm.exeを使うことでアセンブリ言語を高級にしたような形式で確認することができます。, 本題のデコンパイルに入ります。 一旦中間言語(以下、IL)という形にし、実行時にネイティブコードを生成するJITコンパイル方式を採用しています。 それぞれをダブルクリックすることで中身をさらっと見ることができます。*3, 普段あまり気にしませんが、ちゃんと仕様通りSystem.Objectが暗黙的に継承されている事が見て取れます。, こちらも暗黙的に基底クラス(System.Object)のデフォルトコンストラクタが呼ばれている事がなんとなくわかります。 ã³ã³ãã¤ã«ã§åé¡ãªããã°ãèªåçã«ãªã³ã¯ãè¡ããã¾ãã ã³ã³ãã¤ã«ããªã³ã¯ãã¨ãã«æåããã°ã C:\(list10-1.cã®ããå ´æ)>list10-1 enter ã®ããã«å®è¡ã§ããã§ãããã ã¨æ¸ãã¦ãã¾ãã C Source ãã³ã³ãã¤ã«ï¼å®è¡ããæ¹æ³ã Copyright © ITmedia, Inc. All Rights Reserved. F#をC#やVB.NETに変換すると、F#がどのようにしてパターンマッチを実現しているのかが分かったりして面白いですね。, *1:デコンパイルによるリバースエンジニアリングが禁止されているアプリケーションには使用しないようにしましょう, *2:EUでは法的に何があろうとデコンパイルOKらしい? 逆コンパイラ - Wikipedia http://ja.wikipedia.org/wiki/%E9%80%86%E3%82%B3%E3%83%B3%E3%83%91%E3%82%A4%E3%83%A9, *4:今回はDebugビルドだったのでメソッド内で宣言した変数名の情報が残っています。興味がある方は試しにReleaseビルドにして結果の違いを確認してみてください。, 今回はDebugビルドだったのでメソッド内で宣言した変数名の情報が残っています。興味がある方は試しにReleaseビルドにして結果の違いを確認してみてください。, dotPeek: Free .NET Decompiler & Assembly Browser by JetBrains, http://ja.wikipedia.org/wiki/%E9%80%86%E3%82%B3%E3%83%B3%E3%83%91%E3%82%A4%E3%83%A9, IteratorパターンとIEnumerable
とIEnumeratorとyield r…, 日本版 HUAWEI Mate 30 Pro 5G を先行販売で買ったので軽くレビュー. 遂にJITコンパイル形式の強みが本当の意味で生かされることになりそうです。, 閑話休題。ILはバイトコードのため、そのままでは人間が読む事ができませんが、 まずはIL(バイトコード)から人が読める形に出力する、逆アセンブルについての紹介です。, 先ほど挙げたVisual Studioに付属している逆アセンブラー。 ããããVisual Studio ãã¤ã³ã¹ãã¼ã«ããæã«ç¨æãããã³ãã³ãããã³ããããã§ããã°ãã³ã³ãã¤ã«ã§ããã¯ãã§ãã ãããããã¼ã³ãã³ãããã³ãããéãã¦ã次ã®ããã« cl ã³ãã³ããå®è¡ãã¦ãVisual C++ ã®ã¡ãã»ã¼ã¸ã表示ãããã° OK まだまだ.NETでクローズドなプロダクトを扱うことは多々あります。むしろそのほうが多いですよね。, その際には規約を良く読み、問題が無ければじゃんじゃん使っていきましょう。 コードからは読み取れないような謎の動きを解析する場合以外はこちらを使うことはあまり無いかもしれません。, 少し趣向は違いますが、LINQPadでも人が読める形式のILを確認することができます。, こちらはdllやexeをデコンパイルするのではなく、コードを書いて、それによって生成されるILを確認する事ができます。, ILを確認する以外の超絶便利な使い方はアドベントカレンダー 6日目の という所も容易に理解できるかと思います。, JustDecompile .NET Assembly Decompiler & Browser - Telerik, オープンソースなプロダクトも増えてきているので活用の機会は多少減っていますが、 éã³ã³ãã¤ã«ã¯ãVisual Studio 2019 16.5 以éã§ã®ã¿ä½¿ç¨ã§ãã¾ãã ã¢ã»ã³ããªã¾ãã¯ã¢ã¸ã¥ã¼ã«ã« SuppressIldasmAttribute 屿§ãé©ç¨ããã¨ãVisual Studio ã§éã³ã³ãã¤ã«ã試ã¿ãããªããªãã¾ãã .NET Tools:.NET逆コンパイラとコードを難読化するDotfuscator. Visual Studioã«ä»å±ãã¦ããildasm.exeã使ããã¨ã§ã¢ã»ã³ããªè¨èªãé«ç´ã«ãããããªå½¢å¼ã§ç¢ºèªãããã¨ãã§ãã¾ãã éã¢ã»ã³ãã«ï¼IL(ãã¤ãã³ã¼ã)ãã人ãèªããå½¢ã®IL㸠æ¬é¡ã®ãã³ã³ãã¤ã«ã«å
¥ãã¾ãã 事前コンパイルという手段も用意されていますが基本的にはILを出力します。, ところで、ネイティブコンパイルをしないということは、JITコンパイラが存在する環境でさえあれば、 やはり通常のC#のコードとして読めたほうが早いし嬉しいですよね。. ReSharperに付属していて、定義へ移動する際にdotPeekを通してデコンパイルしたものを表示したりしてくれます。, Release ビルドでpdbファイルが削除されたもの以外では暗黙的に付与されるusing System;が明示されただけで C#の仕様で、スーパークラスのデフォルトコンストラクタが暗黙的に呼ばれるという仕様通りです。, ちゃんとしたコードが書かれるともうILについてちゃんと知らないと何が何やら。 åããã¨å³1 ã«ç¤ºããµã¤ã³ã¤ã³ãè¦æ±ããç»é¢ã表示ãããã ã¨ãããã¾ããããµã¤ã³ã¤ã³(I)ãã鏿ããµã¤ã³ã¤ã³ãè¡ããããå¾ã§è¡ãããã鏿ããµã¤ 実行する環境を選ばないというメリットがあります。, 今まではWindows環境で実行されることが殆どだったのであまり気にするする機会はありませんでしたが、 ã§ã³ãæå¹ã«ãã (試é¨ç)ãã«ãã§ãã¯ãå
¥ã ⦠大雑把に言うと、コンパイルされたプログラム(exe, dllなど)から、元のコードを復元する行為のことです。, 特にC#やJavaの様に中間言語に翻訳された状態でコンパイルされるような言語の場合は Visual Studioã§éãã¦ããã³ã¼ããã¡ã¤ã«ãå³ã¯ãªãã¯ããã¨ãReflectorã¡ãã¥ã¼é
ç®ã表示ããããµãã¡ãã¥ã¼ã«å±éãããã³ã¼ããCï¼ã¾ãã¯Visual Basicã«éã¢ã»ã³ãã«ããããã³ã¼ã«ã°ã©ãã¾ãã¯å¼ã³åºãå
ã®ã°ã©ãã表示ãããã鏿è¢ã ãã®ãã³ã訳ããã£ã¦ããexeå½¢å¼ã®å®è¡ã¢ã¸ã¥ã¼ã«ããããã³ã¼ããéã³ã³ãã¤ã«ãã¦å
ã®ã½ã¼ã¹ã³ã¼ããåå¾ãè§£æã§ããªããã¨è©¦ãã¦ã¿ã¾ããã®ã§ããã®ããæ¹ãã¾ã¨ãã¾ãããéã³ã³ãã¤ã«ããã³ã³ãã¤ã«ããã³ã¼ã(Decode) ã¨ã¯éã³ã³ãã¤ã«ã¨ ããã¸ã§ã¯ããæ§æãããã¡ã¤ã«ã«è©±ãæ»ãã¾ãã objãã©ã«ãã¼ã¨binãã©ã«ãã¼ã«ã¯ãããã°ã©ã ãéå§ããã¨ãã«ãèªåçã«ãã¡ã¤ã«ãçæããã¾ããåæç¶æ
ã§ã¯ä¸¡æ¹ã¨ã空ã§ãããã®ï¼ã¤ã®ãã©ã«ãã¼ã¯åé¤ãã¦ãããã°ã©ã ãéå§ããã¨å度èªåçæããã¾ãã ããã°ã©ã ⦠興味があればお試しください。 takeshik せんせーの記事をご参照ください。, 前述のように、人に読める形でILを出力してくれるのもそれはそれで便利ですが、 Use Visual Studio IDE to build cross-platform apps for iOS, Android, IoT, and Windows devices using modern, standards-compliant C and C++.