どのように私は私が実行しているどのリング(-1、0、1、2、3)でプログラムを検出できますか?
-
23-08-2019 - |
質問
どのようにしているリングでプログラムを検出します(-1、0、1、2、3)私が実行しているのですか?
解決
最も簡単な方法があり、ちょうど(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が呼び出しをエミュレートすることによって、結果をマスクすることが、より低いレベルに常駐していることを覚えています。
(NB:VMの仕事を意味の呼び出しに無効な命令を変換することである)
<時間> あなたが本当にあなたの仮想化されているかどうかを確認したいと、このための実行を停止する場合は、、あなたは「赤い丸薬」について書かれているものを読む必要があります。
他のヒント
あなたは、デバイスドライバでない限り、
、あなたは常に(「リング」、それ自体を持っているシステム用)リング3で動作していることになります。
通常、私は、あなたが「保護モードプログラミング」について読む必要があることを書くでしょう。リング0は、Windows XPのSP2を使用してintertactする方法についての記事があります。それは他のバージョンのWindowsと必ず他人の業務系システムのために変更されることに注意してください。
http://www.codeproject.com/KB/threads/MinimalisticRingZero.aspx の
あなたは自分のアプリケーションをデバッグする人々は、例えば、あなたはここでチェックできることを避けるために、仮想マシンの内部で実行されているかどうかを検出したい場合:
所属していません StackOverflow