【问题标题】:Risk of damaging your computer by altering memory in C++通过更改 C++ 中的内存来损坏计算机的风险
【发布时间】:2011-07-25 08:50:22
【问题描述】:

我知道一些 Java,现在正在尝试 C++,显然在 C++ 中你可以做一些事情,比如声明一个大小为 6 的 int 数组,然后更改该数组的第 10 个元素,我理解它只是第 4 个元素为 6 整数数组分配的内存部分结束后的字节。

所以我的问题是,如果我不小心,是否有可能意外更改系统上其他程序正在使用的 C++ 程序中的内存?以这种方式严重搞砸事情是否存在实际风险?我的意思是我知道你可以在必要时重新启动计算机并清除内存,但如果我不这样做,可能会造成一些持久的损害。

【问题讨论】:

  • 除非你在 ring 0 模式下工作,否则你不必担心这些东西。
  • 你的说法有一个小错误,后面不是第4个字节,如果你的系统是32位的话,它后面的第4个int是16个字节。
  • 黑客故意制造的每一个问题当然也可能无意中发生。鉴于此,this rather new article 解释了如何通过故障软件损坏硬件。

标签: c++ memory


【解决方案1】:

这取决于您的系统。形式上,越界访问是 未定义的行为。在现代通用系统上,每个用户 进程有自己的地址空间,一个进程不能修改,甚至 读取,另一个进程的(禁止共享内存),所以除非你 编写内核代码,你不应该破坏任何东西 你自己的进程(和非内核代码通常不能做物理IO,所以 我看不出硬件中的任何东西会损坏)。

但是,如果您正在编写内核代码,或者在嵌入式 没有内存映射或保护的处理器,你可以从字面上 使用越界写入破坏硬件;如果程序是 控制核电站之类的东西,你甚至可以摧毁一个 不仅仅是运行代码的机器。

【讨论】:

    【解决方案2】:

    每个进程都有自己的虚拟地址空间,因此进程自然不会看到彼此的内存。不要忘记,即使是程序本地的缓冲区溢出也会产生可怕的后果 - 溢出可能会导致程序行为不端并执行一些具有持久影响的事情(例如删除所有文件)。

    【讨论】:

    • 好的,我将在我的程序中处理错误的唯一问题。谢谢!
    • @newprogrammer:不要过早放松。即使没有写入数组边界,我们也有这个 gem stackoverflow.com/questions/908872/… - 只是读取边界。它会导致一些不相关的数据通过网络发送,这可能是一个大问题。
    • nvm,所以如果我的程序处理文件并且可以以某种方式删除它们并且由于某种原因我的内存更改告诉它这样做,那么我的所有文件都会丢失?
    • 在程序本身之外发生任何不好的事情是极不可能的。我在 Windows 上编写 C/C++ 已经很长时间了,从未见过任何错误删除文件或造成任何其他损坏。如果你有一个循环或参数化的删除或文件写入,你应该小心,但任何语言都是如此,包括 Java。
    • @newprogrammer:基本上,Windows 的存在是为了保护您的机器免受损坏。如果您可以从用户空间造成任何损坏,那是操作系统故障而不是您的问题,这种情况非常罕见。我不会担心的。
    【解决方案3】:

    这取决于您所处的操作系统和环境:

    • 普通操作系统(Windows、Linux 等)用户空间程序:您只能弄乱自己的进程内存。但是,如果运气真的很差,这就足够了。例如,假设您调用某个删除文件的函数。如果在调用时您的内存已损坏,则函数的参数可能会被弄乱,意味着删除了超出您预期的内容。只要您在测试内存处理的程序中避免调用删除文件例程等,这种风险是不存在的。
    • 普通操作系统,内核空间设备驱动:可以访问系统内存和当前运行进程的内存,可能会破坏一切。
    • 没有内存保护的简单嵌入式操作系统:您可以访问所有内容并销毁任何内容。
    • 没有内存保护的旧版操作系统(Win 3.X,MS-DOS):您可以访问所有内容并销毁任何内容。

    【讨论】:

      【解决方案4】:

      每个程序都在自己的地址空间中运行,一个程序不能访问(读取/修改)任何其他程序的地址空间(这是一种称为分页的内存管理技术)。

      如果您尝试访问程序无法读取的内存地址,则会导致分段或页面错误,并且您的程序将崩溃。

      在回答您的问题时,不会造成永久性损害。

      【讨论】:

      • 啊,是的,当然,我是从损坏实际 RAM 本身的角度考虑的。
      【解决方案5】:

      我不确定现代操作系统(尤其是 win7)是否允许您这样做。如您所述,操作系统将阻止缓冲区溢出操作

      【讨论】:

      • 感谢您的回复,如果这有什么不同,我正在运行 Vista。
      【解决方案6】:

      在过去(DOS 时代),一些病毒会尝试通过直接对视频或硬盘控制器进行编程来破坏硬件,但即便如此,这也不是一件容易或确定的事情。现代硬件和操作系统使用户级应用程序几乎不可能损坏硬件。所以编程吧 :) 你不会破坏任何东西。

      【讨论】:

        【解决方案7】:

        还有另一种可能性。缓冲区溢出可能会让声名狼藉的人利用该漏洞并在您的客户端计算机上执行任意代码。我想那已经够糟糕了。而overrun最危险的地方在于,即使经过严重过度的测试,你也可能找不到它。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-06-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-01-15
          • 1970-01-01
          • 1970-01-01
          • 2011-01-30
          相关资源
          最近更新 更多