我知道VirtualProtect
函数会毫无疑问地更改内存中页面的权限。当任何正在运行的进程能够使用它时,这最终没有直接目的吗?
例如,有人可以轻松编写一个使用VirtualProtectEx
函数的恶意软件,以绕开指令并造成严重破坏。另一方面,用户可能有正当理由允许进程修改内存(即游戏作弊)。
答案 0 :(得分:8)
有人可以很容易地写出那块恶意软件,但他们如何让目标执行呢?
VirtualProtect允许我有选择地使内存可执行。这意味着我可以将存储不受信任数据的缓冲区标记为不可执行,并且我所拥有的允许不受信任的用户修改我的函数的返回地址的安全漏洞无法跳转到该缓冲区并在那里执行代码,从而停止攻击者自己执行VirtualProtect。
它还允许我将内存设为只读。这意味着我可以将不受信任的缓冲区旁边的区域标记为只读,并且缓冲区溢出不能覆盖更重要的数据。因此,我的应用程序中没有远程代码,攻击者也没有VirtualProtect。
一旦攻击者以某种方式获得对系统的访问权限,他就可以使用VirtualProtect删除相同安全级别的进程保护,但此时您已经丢失了。
答案 1 :(得分:6)
我使用VirtualProtect
来帮助追踪不正确的内存访问。
我分配了一页内存,初始化它,然后将其标记为Unreadable / Unwriteable,然后我们的超级单片程序中的另一个组件不正确地访问了我的指针。一旦该组件试图写入不可写的页面,我们就会看到访问冲突,并且我们知道违规方是谁。
(在此之前,我们只知道内存已被覆盖......但我们不知道哪个组件正在执行此操作。)
答案 2 :(得分:2)
主要是为了防止攻击并允许JIT等。如果没有VirtualProtect
,则无法将页面标记为不可写和可执行,反之亦然。也就是说,如果系统上已经有恶意软件,那么问题就是already past the airtight door。在理想情况下,进程还可以使用ACL来防止其他进程检查其内存或更改其内存保护。这就是安全播放的工作原理。
如果系统上已经存在恶意软件,那么您所做的一切都无法正常工作,因为恶意软件可能处于内核模式。在这种情况下,它已经可以做任何事情。