1

関数が初めて呼び出されると、JIT が呼び出され、.Net IL コードが x86 命令にコンパイルされ、メモリのどこかに保持されることを理解しています。x86アセンブリ命令を分析できるように、このx86コードが保持されている場所を知る必要があります(この質問の文脈では目的はあまり重要ではありません)。変換されたコードが保存されるか、おそらく JIT コードのどの関数がそれを行うか。私はJITコードを持っています(.netソースコードはGitHubで公開されていますが、これまでのところコードのサイズに圧倒されています). あらゆる種類の助けをいただければ幸いです。前もって感謝します...

Visual Studioの逆アセンブラーと同じように、実行中の.net exeのx86アセンブリ命令ダンプを提供できる逆アセンブラーを提案できると助かりますが、自動的に実行する必要があります。これはngenによって静的に実行できることを知っています。ngen は x86 命令に変換でき、その後、逆アセンブラーはダンプを取得できますが、exe の実行後にこれを行う必要があることが重要です。

これは、x86 命令ダンプが必要な理由は、複数の .net exe 間の類似性を見つけるためです。静的に逆アセンブルされたアセンブリを直接見る場合の課題は、アセンブリがパックまたは難読化されている可能性があることです。ただし、実行時にパッカー プログラムによってアンパック/難読化解除され、JIT コンパイルされた x86 命令は同様に見えます。

4

1 に答える 1

1

デバッガー APIを使用して、プロセスから jitted 命令を読み取ることができます。(具体的には、ICorDebugFunction::GetNativeCodeICorDebugCode2::GetCodeChunks、およびICorDebugProcess::ReadMemoryの組み合わせ)。

この方法を実行するには、おそらくメソッドが既にジットされている必要があります...しかし、おそらくICorDebugEvalを使用してそれを調整できます(おそらく、メソッドの開始時にブレークポイントを使用し、ヒット時に eval を中止します)。

于 2015-07-11T11:39:01.680 に答える