実行中のリング (-1、0、1、2、3) をプログラムで検出するにはどうすればよいですか?
4 に答える
最も簡単な方法は、(x86) コマンドを実行して、対応するエラーをキャッチすることです。
例 (SEH、Windows、カーネルモード)
bool ring_lower_0 = false;
__try
{
__asm { <cmd> };
ring_lower_0 = true;
}
__except( GetExceptionCode() == EXCEPTION_PRIV_INSTRUCTION )
{
ring_lower_0 = false;
}
ノート:
cmd は、アセンブラ コマンドです。コマンドのリストとそれぞれのリング レベルについては、インテル アーキテクチャ リファレンス マニュアルを参照してください。
Linux の概念は少し異なります。
ただし、下位レベルに存在する VM は、呼び出しをエミュレートすることによって結果を隠す可能性があることに注意してください。
(注: VM の仕事は、無効な命令を意味のある呼び出しに変換することです)
本当に仮想化されているかどうかを確認したいが、これが原因で実行を停止したい場合は、「赤い錠剤」について書かれている内容を読む必要があります。
デバイス ドライバーでない限り、常にリング 3 で実行されます (「リング」自体を持つシステムの場合)。
通常、「プロテクト モード プログラミング」について読むべきだと書きます。Windows XP SP2 を使用してリング 0 とやり取りする方法についての記事があります。他の Windows バージョンや、他の運用システムでは変更されることに注意してください。
http://www.codeproject.com/KB/threads/MinimalisticRingZero.aspx
たとえば、仮想マシン内で実行しているかどうかを検出したいだけで、アプリケーションがデバッグされるのを避けるために、ここで確認できます。