読者です 読者をやめる 読者になる 読者になる

XmlSerializer が生成したコードを取得する,を 2 分の動画にまとめてみた

.NET

最初はデバッガで止めながら、FileMon でファイルがいつ生成されてるのかを調べてたんだけど、XmlSerializer( type ) を new すると、その中で hoge.cs を吐いてコンパイルして削除まで一気にしてしまうことがわかりました。これじゃあ、cs ファイルは横取りできません。

それなら、ファイル削除のとこで実行を止めちゃえばイイジャンってことで、WinDbg の出番です。ちょっと話がオオゲサになってきました。

まずは、dumpbin /exports C:\Windows\system32\kernel32.dll で DeleteFileW を探します。で、WinDbg で実行ファイルを読み込み、一度実行して適当なところで止めて、kernel32 の DeleteFileW のアドレスを探します。kernel32.dll モジュールの先頭 + さっき調べた DeleteFileW のエントリポイントのアドレスに bp コマンドでブレークを張ります。あとはリスタートすれば、(ほかにファイル削除を使っていなければ)ブレークに止まったときに個人の tmp ディレクトリに XmlSerializer が吐いたコードがあります!

WinDbg を使わずに Visual Studio 2005 のみでやってみました.

デバッガの使い方の説明は動画の方が楽かも.

ポイント

  • ソースコードは dobon.net の「オブジェクトの内容をファイルに保存、復元する」をコピペさせていただきました.
  • あらかじめ Microsoft のシンボルサーバを使用するよう設定してあります
  • 「アンマネージ コード デバッグを有効にする」は Visual C# 2005 Express Edition では使用できません
  • ブレークポイントの設定で入力しているテキストは,{,,kernel32.dll}_DeleteFileW@4 です.
  • コマンドウィンドウで入力しているテキストは,? *(wchar_t**)(@esp+4) で,これは 32-bit 版 Windows 用です.x86-64 版 Windows では呼出し規約が違うので,? @rcx, su あたりでいけるんじゃないかと.