2013-10-01 6 views
5

は、次のILコードを考えてみましょう:JIT-ED例外ハンドラ実装

.method public static void Main() 
    { 
     ldstr "Starts Here" 
     call void [mscorlib] System.Console::WriteLine(string) 
     .try {  
      ldstr "Try Me!" 
      call void [mscorlib] System.Console::WriteLine(string) 
      leave.s Done 
     } 
     catch [mscorlib] System.Exception { 
      ldstr "Catch Me!" 
      call void [mscorlib] System.Console::WriteLine(string) 
      leave.s Done 
     } 
    Done: 
     ldstr "Ends Here" 
     call void [mscorlib] System.Console::WriteLine(string) 
     ret 
    } 

どのようにCLR JIT-EDコードでtryブロックを定義していますか?ネイティブコードは次のようになります。

... 
00900076 8b0538214703 mov  eax,dword ptr ds:[3472138h] ("Starts Here") 
... 

00900090 8b053c214703 mov  eax,dword ptr ds:[347213Ch] ("Try Me!") 
... 

009000a2 eb1b   jmp  009000bf ;// Done 

009000a4 8945d4   mov  dword ptr [ebp-2Ch],eax 
009000a7 8b0540214703 mov  eax,dword ptr ds:[3472140h] ("Catch Me!") 
... 

009000b8 e888293b73  call clr!JIT_EndCatch (73cb2a45) 
009000bd eb00   jmp  009000bf ;// Done 

;// Done: 
009000bf 8b0544214703 mov  eax,dword ptr ds:[3472144h] ("Ends Here") 
... 
009000d6 c3    ret 

を我々はclr!JIT_EndCatchを見ることができますが、どこ始まりとtryブロックの終わりがありますか?

答えて

4

ジッタは、デバッガで簡単に確認できるマシンコードだけでなく、さらに多くを生成します。 this answerを読んでみると、ジッタがガベージコレクタを支援するために生成するテーブルについて語ります。

これは例外処理に非常によく似ていますが、ジッタはSafeSEH実装で使用される関数テーブルを生成し、オペレーティングシステムが例外フィルタを検出できるようにします。このようなテーブルには、tryブロックの開始アドレスと終了アドレスのエントリとフィルタの関数ポインタがあります。正確な動作は深刻なものではなく、例外処理は過去のマルウェアによって大きく悪用されています。また、「safeseh」に対するGoogleのヒットはここで繰り返したいものではありません。 assembler's optionのMSDN記事には、それに関する簡単な情報があります。私は、デバッガでこれらのテーブルを調べる簡単な方法を知らない。

関連する問題