これらは管理された文字列です。使用しているツールが、管理対象文字列をメモリから読み取る方法を知っているかどうかはわかりません。
.NET文字列リテラルは、ポータブル実行可能ファイルのメタデータセクションに格納されます。ツールが.NETのメタデータセクションからそれを読み取る方法を理解しない限り、ツールはそれを見つけられません。ildasmのようなツールで文字列を見ることができます。[表示]と[MetaInfo]で、[表示]をクリックします。新しいウィンドウのどこかに「ユーザー文字列」セクションがあります。これがサンプルアプリケーションの私のものです。
User Strings
-------------------------------------------------------
70000001 : (35) L"Property can only be set to Nothing"
70000049 : (28) L"WinForms_RecursiveFormCreate"
70000083 : (26) L"WinForms_SeeInnerException"
700000b9 : ( 7) L"Button1"
700000c9 : ( 6) L"Label1"
700000d7 : ( 8) L"TextBox1"
700000e9 : ( 5) L"Form1"
700000f5 : (29) L"WindowsApplication1.Resources"
ここで、文字列(私の場合)のメタデータトークンがであることがわかります700000b9
。
実行時に文字列のアドレスを検索したい場合は...
これを行うために使用するツールは、 SOS拡張機能を備えたWinDbgです。メモリ内でその文字列を見つける方法は次のとおりです。
これはすべてx86.NETFramework4の場合です。
- WinDbgを開き、[プロセスを開く]を選択して、EXEを開きます。ブレークポイントなどを設定する機会を与えるために、すぐに壊れます。
CLRJITがロードされたときに例外で停止を設定します。これは、SOSデバッガ拡張をロードする適切なタイミングになります。
sxe ld:clrjit
次に、先に進み、で実行を続行しg
ます。
この時点で、clrjitのmodloadでブレークポイントに到達するはずです。
ModLoad: 57910000 57970000 C:\Windows\Microsoft.NET\Framework\v4.0.30319\clrjit.dll
そこから、SOSデバッグ拡張機能を。でロードできます.loadby sos clr
。
!eeversion
実行してExecutionEngingバージョンを取得することにより、SOSが正しくロードされたことをテストできます。私にとって、これは「4.0.30319.269小売」を与えます。
次に、その文字列を検索します。System.Windows.Forms.dll
モジュールがロードされたときにブレークすることから始めましょう。
sxe ld:System.Windows.Forms
そしてg
、実行を継続するために使用します。モジュールがロードされたときに壊れるべきです。モジュールに実際にがロードされるように、先に進んでステップオーバーしp
ます。
MessageBox.Show
今、私たちはそのように休憩を入れることができます:
!bpmd System.Windows.Forms.dll System.Windows.Forms.MessageBox.Show
さあ、先に進んでg
ください。これでアプリケーションが実行されているはずです。先に進んでボタンをクリックすると、ブレークポイントがヒットするはずです。
次に、でステップイン できます。Show
t
そこから!clrstack -p
、パラメータを使用してスタックトレースを表示するために使用できます。スタックの一番上には、への呼び出しがありますMessageBox.Show
。
004ee820 5c22839c System.Windows.Forms.MessageBox.Show(System.String)
PARAMETERS:
text (<CLR reg>) = 0x022a1058
これで、文字列のアドレスがであることがわかりました0x022a1058
。もちろん、これはあなたにとっては異なります。これを行うと、!do 0x022a1058
次の文字列が得られます。
Name: System.String
MethodTable: 638afb08
EEClass: 635e8bb0
Size: 28(0x1c) bytes
File: C:\Windows\Microsoft.Net\assembly\GAC_32\mscorlib\v4.0_4.0.0.0__b77a5c561934e089\mscorlib.dll
String: Button1