6

あまりにも多くの動的アセンブリを作成およびロードする .NET アプリケーションのダンプがあります。これらのアセンブリの 1 つの内部にあるものを調べたいと思います。

そのために、そのようなアセンブリをファイルにダンプし、Reflector で開きたいと考えています。

問題 - どうすればいいのかわかりません。

それで、私の質問はこれです-完全なメモリダンプが与えられた場合、新しいファイルが有効な.NETモジュールまたはアセンブリ自体になるように、任意のアセンブリをファイルにダンプするにはどうすればよいですか?

より単純なバリエーション - ライブ デバッグ セッションから行うにはどうすればよいですか?

SOS と SOSEX で WinDBG を使用しています。

編集1

だから、3年後にまた必要になります。からの関連する出力は次の!DumpDomainとおりです。

Assembly:           007f89a0 (Dynamic) []
ClassLoader:        00877998
SecurityDescriptor: 00879410
  Module Name
054d0010    Dynamic Module

この情報から始めて、このアセンブリの開始と終了をどのように見つけることができますか? その後、.writememコマンドを使用できました。

4

3 に答える 3

4

テスト コード - http://www.dotnetspider.com/resources/22226-Creating-Dynamic-Assembly-A-Step-Ahead-Series.aspx

0:000> !DumpDomain

Assembly:           00680f48 (Dynamic) []
ClassLoader:        00681010
SecurityDescriptor: 00680eb0
  Module Name
0058386c    Dynamic Module

0:000> !DumpModule -mt 0058386c    
Name:       Unknown Module
Attributes: Reflection SupportsUpdateableMethods
Assembly:   00680f48
LoaderHeap:              00000000
TypeDefToMethodTableMap: 00581b54
TypeRefToMethodTableMap: 00581b68
MethodDefToDescMap:      00581b7c
FieldDefToDescMap:       00581ba4
MemberRefToDescMap:      00000000
FileReferencesMap:       00581bf4
AssemblyReferencesMap:   00581c08

Types defined in this module

      MT  TypeDef Name
------------------------------------------------------------------------------
00583c98 0x02000002 <Unloaded Type>

Types referenced in this module

      MT    TypeRef Name
------------------------------------------------------------------------------
726826a0 0x02000001 System.Object
72647e4c 0x02000002 System.Console
0:000> !DumpMT -md 00583c98 
EEClass:         0060121c
Module:          0058386c
Name:            <Unloaded Type>
mdToken:         02000002
File:            Unknown Module
BaseSize:        0xc
ComponentSize:   0x0
Slots in VTable: 6
Number of IFaces in IFaceMap: 0
--------------------------------------
MethodDesc Table
   Entry MethodDe    JIT Name
7258a630 7227801c PreJIT System.Object.ToString()
7257f750 72278024 PreJIT System.Object.Equals(System.Object)
7257f380 72278044 PreJIT System.Object.GetHashCode()
7257f040 72278058 PreJIT System.Object.Finalize()
005f03d0 00583c90    JIT dynamicAssemblyClass..ctor()
005f03e8 00583c84    JIT dynamicAssemblyClass.HelloWorld()
0:000> !DumpIL 00583c84
FindIL failed
0:000> !U 005f03e8 
Normal JIT generated code
dynamicAssemblyClass.HelloWorld()
Begin 005f03e8, size 1a
>>> 005f03e8 55              push    ebp
005f03e9 8bec            mov     ebp,esp
005f03eb e8b856f871      call    mscorlib_ni!System.Console.get_Out() (72575aa8)
005f03f0 8bc8            mov     ecx,eax
005f03f2 8b15a0210703    mov     edx,dword ptr ds:[30721A0h] ("Hello! This is a dynamic assembly.")
005f03f8 8b01            mov     eax,dword ptr [ecx]
005f03fa 8b403c          mov     eax,dword ptr [eax+3Ch]
005f03fd ff5010          call    dword ptr [eax+10h]
005f0400 5d              pop     ebp
005f0401 c3              ret

リフレクターほどではありませんが、種類と方法を確認できます。

于 2013-11-16T02:48:19.500 に答える
1

を使用して、DLL の仮想メモリ全体をスキャンできます.imgscan。動的アセンブリがメモリ内にある間にこれを行いましたが、.imgscan見つかりませんでした。典型的なMZヘッダーがないため、リフレクションによって作成されたアセンブリは、ディスクに保存できる DLL ファイルではないようです。.writememそれ以外の場合は、ディスクに保存するために使用できます。

于 2013-12-26T21:29:30.843 に答える
0

SOS で利用可能な !SaveModule コマンドを使用する必要があります。1) 開始アドレスと 2) エクスポート パスの 2 つの引数を取ります。lmv でモジュールの詳細を調べると、開始アドレスを見つけることができます。

たとえば、clr.dll をエクスポートする場合は、最初に lmv m clr と入力して開始アドレスを確認します。000007fe`f9b40000 としましょう。c:\clr.dll に保存します。コマンドは次のようになります。

!sos.SaveModule 000007fe`f9b40000 c:\clr.dll

次に、モジュールのエクスポート パスを確認します。これは、ライブ デバッグ セッションとフル (/ma) ダンプから機能します。

動的アセンブリについてはよくわかりません。それらが lm リストに表示されていれば、問題にはなりません。そうでない場合は、メモリにロードされている場所を特定し、それを開始アドレスとして使用する必要があります。

于 2013-11-13T03:10:29.343 に答える