代码之家  ›  专栏  ›  技术社区  ›  David L Morris

什么是特权指令?

  •  24
  • David L Morris  · 技术社区  · 16 年前

    ---------------------------
    (MonTel Administrator) 2.12.7: MtAdmin.exe - Application Error
    ---------------------------
    The exception Privileged instruction.
    
     (0xc0000096) occurred in the application at location 0x00486752.
    

    我将要进行一次虫子搜索,我希望我所做的一些愚蠢的事情恰好产生了这个信息。代码编译干净,没有错误或警告。EXE文件的大小已增长到1454132字节,并包含指向的链接 ODCS.lib

    9 回复  |  直到 13 年前
        1
  •  37
  •   Ana Betts    11 年前

    为了回答这个问题,特权指令是一种处理器操作码(汇编指令),它只能在“主管”(或环-0)模式下执行。 这些类型的指令通常用于从windows内核访问I/O设备和受保护的数据结构。

    常规程序在“用户模式”(Ring-3)下执行,不允许直接访问I/O设备等。。。

    正如其他人提到的,原因可能是堆栈损坏或函数指针调用混乱。

        2
  •  7
  •   Daniel    16 年前

    这种情况通常发生在使用指向无效数据的函数指针时。 如果您有破坏返回堆栈的代码,也可能发生这种情况。有时追踪这类虫子是相当棘手的,因为它们通常很难复制。

        3
  •  7
  •   Ana Betts    16 年前

    特权指令是仅允许在环0(即内核模式)中执行的IA-32指令。如果您在用户空间中遇到这个问题,您要么得到了一个非常旧的EXE,要么得到了一个损坏的二进制文件。

        4
  •  5
  •   MarianD    3 年前

    正如我所怀疑的,我做的是件愚蠢的事。我想我解决这个问题的速度快了一倍,因为上面信息中的评论中有一些线索。多亏了这些人,尤其是那些在应用程序早期指向某个内容覆盖堆栈的人。事实上,我发现这里有几个答案比我标记为回答问题的帖子更有用,因为他们把我排在队列里,告诉我该去哪里找,尽管我认为这是答案的最佳总结。

    事实证明,我刚刚添加了一个按钮,该按钮超过了包含一些工具栏按钮信息(位于堆栈上)的数组的最大大小。我忘了

    #define MAX_NUM_TOOBAR_BUTTONS  (24)
    

    甚至存在!

        5
  •  4
  •   artificialidiot    16 年前

    我能想到的第一种可能性是,您可能正在使用一个局部数组,它位于函数声明的顶部附近。您的边界检查变得疯狂,覆盖了返回地址,它指向一些只允许内核执行的指令。

        6
  •  2
  •   Jeremy    16 年前

    错误位置0x00486752对我来说非常小,在可执行代码通常存在的位置之前。我同意丹尼尔的观点,这对我来说是一个疯狂的暗示。

        7
  •  2
  •   Peter Mortensen icecrime    13 年前

    我在2000年用Visual C++ 6看到了这个。

    在异常处理程序中,调试C++库调用它中的物理I/O指令。 如果我没记错的话,它是将状态转储到一个I/O端口,该端口过去用于DMA基本寄存器,我想微软的某个人正在使用它作为调试器卡。

    查找可能导致诊断代码运行的潜在错误条件。

    我正在调试、回溯和阅读DISS程序集。处理时出现异常 std::string ,可能是从末端开始索引。

        8
  •  2
  •   Peter Mortensen icecrime    13 年前

    这限制了用户编写的程序可能对系统造成的损害,并减少了系统实际崩溃的次数。

        9
  •  2
  •   Peter Mortensen icecrime    13 年前

    在内核模式下执行时,操作系统可以不受限制地访问内核和用户程序的内存。