当任何进程(包括恶意软件)都可以使用 VirtualProtect 时,它有什么意义?

What is the point of VirtualProtect when any process, including malware, can use it?

我知道 VirtualProtect 函数会毫无疑问地更改内存中页面的权限。当任何 运行 进程能够使用它时,这肯定不会有直接的目的吗?

例如,有人可以轻松编写一段使用 VirtualProtectEx 函数的恶意软件,以绕过指令并造成破坏。另一方面,用户可能有正当理由允许进程修改内存(即游戏作弊)。

主要是为了防止攻击和允许 JIT 等。如果没有 VirtualProtect,您将无法将页面标记为不可写和可执行,反之亦然。也就是说,如果系统上已经有恶意软件,那么问题就是 already past the airtight door。在理想情况下,一个进程还可以使用 ACL 来防止另一个进程检查其内存或更改其内存保护。这就是安全播放的工作原理。

如果系统中已经存在恶意软件,那么您将无法执行任何操作,因为恶意软件可能处于内核模式。在这种情况下它已经可以为所欲为了。

有人可以轻松编写该恶意软件,但他们如何让目标执行它?

VirtualProtect 允许我选择性地使内存可执行。这意味着我可以将我存储不受信任的数据的缓冲区标记为不可执行,并且我所拥有的允许不受信任的用户修改我函数的 return 地址的安全漏洞无法跳转到该缓冲区并执行代码在那里,从而阻止攻击者自己执行 VirtualProtect。

它还允许我将内存设置为只读。这意味着我可以将不可信缓冲区旁边的区域标记为只读,并且缓冲区溢出无法覆盖更重要的数据。因此,我的应用程序中没有远程代码,攻击者没有 VirtualProtect。

一旦攻击者以某种方式获得了对系统的访问权限,他就可以使用 VirtualProtect 取消对同一安全级别进程的保护,但此时你已经输了。

我已经使用 VirtualProtect 来帮助追踪不正确的内存访问。

我分配了一页内存,对其进行了初始化,然后对其进行了标记 Unreadable/Unwriteable,然后我们大型单体程序中的另一个组件不正确地访问了我的指针。一旦该组件尝试写入不可写的页面,我们就会看到访问冲突,并且我们知道违规方是谁。

(在此之前,我们只知道内存被覆盖了...但不知道是哪个组件在做)