25


2

特権命令とは何ですか?

私はきれいにコンパイルするいくつかのコードを追加しましたそしてちょうどこのWindowsエラーを受けました:

---------------------------
(MonTel Administrator) 2.12.7: MtAdmin.exe - Application Error
---------------------------
The exception Privileged instruction.

 (0xc0000096) occurred in the application at location 0x00486752.

私はもうバグハントを進めようとしています、そしてそれが私がしたことが愚かなことであることを期待しています。 コードはエラーや警告なしにきれいにコンパイルされます。 EXEファイルのサイズは1,454,132バイトに増え、 `ODCS.lib`へのリンクが含まれていますが、それ以外の点ではDEBUGをオンにした(Windows 2000上のP4を実行している)Win32 APIへの純粋なCです。

9 Answer


33


質問に答えるために、特権命令は「スーパーバイザ」(またはリング0)モードでしか実行できないプロセッサオペコード(アセンブラ命令)である。 この種の命令は、WindowsカーネルからI / Oデバイスと保護されたデータ構造にアクセスするために使用される傾向があります。

通常のプログラムは、I / Oデバイスなどへの直接アクセスを許可しない「ユーザーモード」(Ring-3)で実行されます。

他の人が述べたように、原因はおそらく破損したスタックまたはめちゃくちゃ関数ポインタ呼び出しです。


7


この種のことは通常、無効なデータを指す関数ポインタを使用しているときに発生します。 リターンスタックを破棄するコードがある場合にも発生する可能性があります。 この種のバグは、通常再現するのが難しいため、突き止めるのが難しい場合があります。


7


特権命令は、Ring-0でのみ実行が許可されているIA-32命令です。 カーネルモード) ユーザースペースでこれを打っているのなら、本当に古いEXEか、壊れたバイナリのどちらかがあるでしょう。


4


私が考えることができる最初の可能性は、あなたがローカル配列を使用している可能性があり、それは関数宣言の最上部近くにあるということです。 あなたの境界チェックは非常に狂って戻りアドレスを上書きしてしまいます。それはカーネルだけが実行を許可されているという命令を指しています。


4


私が疑ったように、それは私がしたことが愚かなことであった。 上記のメッセージのコメントにある手がかりがあるため、私はこれを2倍の速さで解決したと思います。 アプリの早い段階でスタックを上書きすることを指摘してくれた人たち、特にありがとう。 私は実際にここでいくつかの答えがより有用であることを見つけました。

結局のところ、ツールバーのボタン情報を保持する配列の最大サイズを超えるボタンを追加したところです(これはスタック上にありました)。 忘れてた

#define MAX_NUM_TOOBAR_BUTTONS(24)

あった!


2


私は2000年にVisual c 6.0でこれを見ました。

デバッグCライブラリには、例外ハンドラ内で、物理I / O命令への呼び出しがありました。 私の記憶が正しければ、以前はDMAベースレジスタ用だったI / Oポートにステータスをダンプしていました。これは、マイクロソフトの誰かがデバッガカードに使用していたことを想定しています。

診断コードが実行される原因となる可能性があるエラー条件を探します。

私はデバッグして、バックトラックして、そして逆アセンブリを読んでいました。 `std

string`の処理中に例外が発生しました。おそらく最後からインデックスを作成しています。


2


実行可能コードが通常存在する前に、エラーの場所0x00486752は私には本当に小さいようです。 私はダニエルに同意します、それは私への野心的な指針のように見えます。


2


過去15年間に製造されたほとんどのプロセッサのCPUには、非常に強力な特別な命令がいくつかあります。 これらの特権命令は、オペレーティングシステムのカーネルアプリケーション用に保持されており、ユーザー作成プログラムでは使用できません。

これにより、ユーザー作成プログラムがシステムに与えるダメージを制限し、システムが実際にクラッシュする回数を減らすことができます。


2


カーネルモードで実行している場合、オペレーティングシステムはカーネルとユーザープログラムのメモリの両方に無制限にアクセスできます。

ベースレジスタとリミットレジスタのロード命令は特権命令です。