5

次の IL コードを検討してください。

    .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
    }

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

...
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

1 に答える 1

4

ジッターは、デバッガーで簡単に確認できるマシン コード以外にも多くのことを生成します。この回答を読みたいと思うでしょう。ガベージコレクターを支援するためにジッターが生成するテーブルについて説明しています。

これは、例外処理と非常によく似た方法で機能します。ジッターは、SafeSEH 実装で使用される関数テーブルを生成して、オペレーティング システムが例外フィルターを検出できるようにします。このようなテーブルには、try ブロックの開始アドレスと終了アドレスのエントリと、フィルターの関数ポインターがあります。それが機能する正確な方法は非常に文書化されておらず、例外処理は過去にマルウェアによって大きく悪用されており、「セーフセ」のグーグルヒットはここで繰り返したいものではありません. アセンブラのオプションに関するMSDNの記事に、それに関する大まかな情報があります。これらのテーブルをデバッガーで検査する簡単な方法を知りません。

于 2013-10-01T10:00:56.197 に答える