troushoo

[sos]!SaveModule:ダンプファイルからイメージを抽出

WinDbg等で使用できる.NET用のデバッガエクステンションsosで、ダンプファイルからexe・dllといったイメージを抽出することのできる!SaveModuleについて説明します。
イメージを抽出できると、.NET ReflectorJustDecompile,ILSpy, dotPeekといったデコンパイラでイメージのソースコードを確認することも可能です。

今回使用するアプリ
以下のサンプルアプリ(SaveModuleProj.exe)は、0で割るために例外が発生する単純なサンプルアプリです。例外発生時のダンプを取得し、それを利用します。

namespace SaveModuleProj
{
    class MyClass
    {
        int a = 0;
        public void func()
        {
            Console.WriteLine(10 / a);
        }
    }
 
    class Program
    {
        static void Main(string[] args)
        {
            MyClass mc = new MyClass();
            mc.func();
        }
    }
}

[!SaveModule]
!SaveModuleコマンドの使用方法は以下です。
  !SaveModule <イメージのベースアドレス> <保存するファイル名>

以下、ダンプからサンプルアプリであるSaveModuleProj.exeを作成し、デコンパイラでソースコードを作成するシナリオを考えます。
1. WinDbgでダンプを開きます。
2. シンボルの設定をして、sosを読み込みます。(以下は.NET 4の場合)
  0:000> .symfix C:\dbg(x86)\sym
  0:000> .reload
  ...........................
  0:000> .loadby sos clr
3. !PrintException(!pe)を利用して、例外情報を表示します。
  0:000> !pe
  Exception object: 025fae8c
  Exception type:   System.DivideByZeroException
  Message:          0 で除算しようとしました。
  InnerException:   <none>
  StackTrace (generated):
    SP       IP       Function
     0026F37C 00280132 SaveModuleProj!SaveModuleProj.MyClass.func()+0x22
    0026F388 002800B4 SaveModuleProj!SaveModuleProj.Program.Main(System.String[])+0x44
  StackTraceString: <none>
  HResult: 80020012
4. !ip2mdを利用して、例外発生時のスタックの関数からMethod Tableを調べます。
  0:000> !ip2md 00280132
  MethodDesc:   00123878
  Method Name:  SaveModuleProj.MyClass.func()
  Class:        00121480
  MethodTable:  0012388c
  mdToken:      06000001
  Module:       00122e9c
  IsJitted:     yes
  CodeAddr:     00280110
  Transparency: Critical
  *** WARNING: Unable to verify checksum for SaveModuleProj.exe
  *** ERROR: Module load completed but symbols could not be loaded for SaveModuleProj.exe
5. 4の出力のMethod Tableから、!DumpMTを利用してモジュールのアドレスを調べます。
  0:000> !DumpMT 0012388c
  EEClass:      00121480
  Module:       00122e9c
  Name:         SaveModuleProj.MyClass
  mdToken:      02000002
  File:         C:\app\SaveModuleProj.exe
  BaseSize:        0xc
  ComponentSize:   0x0
  Slots in VTable: 6
  Number of IFaces in IFaceMap: 0
6. 5の出力のモジュールのアドレスから、! !DumpModuleを利用してメタデータの開始アドレスを調べます。
  0:000> !DumpModule 00122e9c
  Name:       C:\app\SaveModuleProj.exe
  Attributes: PEFile
  Assembly:   003dde48
  LoaderHeap:              00000000
  TypeDefToMethodTableMap: 001200c4
  TypeRefToMethodTableMap: 001200d4
  MethodDefToDescMap:      00120124
  FieldDefToDescMap:       00120138
  MemberRefToDescMap:      00120140
  FileReferencesMap:       00120190
  AssemblyReferencesMap:   00120194
  MetaData start address: 011e2098 (1656 bytes)
7. 6の出力のメタデータの開始アドレスを利用して、!lmiを利用してBase Addressを調べます。
  0:000> !lmi 011e2098
  Loaded Module Info: [011e2098]
          Module: SaveModuleProj
    Base Address: 011e0000
      Image Name: SaveModuleProj.exe
    Machine Type: 332 (I386)
      Time Stamp: 4f39f1c7 Mon Feb 13 21:31:51 2012
            Size: 8000
        CheckSum: 0
  Characteristics: 102 
  Debug Data Dirs: Type  Size     VA  Pointer
              CODEVIEW    8c,  272c,     92c RSDS - GUID: {F76B35E4-98F3-4B2E-9969-B0421EFB6099}
                Age: 1, Pdb: c:\users\seven\documents\visual studio 2010\Projects\SaveModuleProj\SaveModuleProj\obj\x86\Debug\SaveModuleProj.pdb
      Image Type: MEMORY   - Image read successfully from loaded memory.
    Symbol Type: NONE     - PDB not found from symbol server.
     Load Report: no symbols loaded
8. 7の出力のBase Addressから、!SaveModuleを利用してイメージを保存します。
  0:000> !SaveModule 011e0000 C:\output\SaveModuleProj.exe
  3 sections in file
  section 0 - VA=2000, VASize=814, FileAddr=200, FileSize=a00
  section 1 - VA=4000, VASize=570, FileAddr=c00, FileSize=600
  section 2 - VA=6000, VASize=c, FileAddr=1200, FileSize=200
9. 作成したC:\output\SaveModuleProj.exeが作成から、デコンパイラを使用してソースコードを作成します。
以下はJustDecompileを使用した場合のスクリーンショットです。
上記のコードと一致していることがわかります。

補足
・上記ではダンプファイルよりイメージを抽出しましたが、ライブデバッグ中でもコマンドの実行は可能です。

リンク
・MSDNによる!SaveModule含むsos.dllの説明
http://msdn.microsoft.com/en-us/library/bb190764.aspx
・本ブログのJustDecompilerの説明
http://troushoo.blog.fc2.com/blog-entry-33.html


  1. 2012/02/16(木) 15:13:53|
  2. SOS・Psscor2/Psscor4
  3. | トラックバック:0
  4. | コメント:0
<<Visual Studioでプロファイル(インストルメンテーション) | ホーム | ファイアウォールのログ確認(auditpol.exe・wf.msc・netsh)>>

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバック URL
http://troushoo.blog.fc2.com/tb.php/35-853f1ad4
この記事にトラックバックする(FC2ブログユーザー)

スポンサーリンク

最新記事

月別アーカイブ

カテゴリ

ツール (92)
ネットワーク (76)
Visual Studio (56)
SOS・Psscor2/Psscor4 (25)
WinDbg (25)
Linux (24)
Azure (17)
Tips (20)
英語 (1)
About Me (1)
未分類 (0)

全記事表示リンク

全ての記事を表示する

検索フォーム

RSSリンクの表示

リンク

このブログをリンクに追加する