2015-05-04 8 views
2

据我所知,VirtualProtect函数更改内存页面上的权限毫无疑问。当任何正在运行的进程能够使用它时,这当然没有直接的目的?当包括恶意软件在内的任何进程都可以使用VirtualProtect时,VirtualProtect的意义何在?

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

+1

这假设攻击者可以在他们正在攻击的系统上运行代码,VirtualProtect试图停止。 –

+1

当没有恶意软件运行时,Windows受到保护,并且没有允许恶意软件运行的漏洞。如果我们从“恶意软件已经在运行”的前提开始,那么我们得出结论“恶意软件可能会造成严重破坏”是无可置疑的。但前提是错误的。 – Dialecticus

回答

4

有人可以很容易地写出那件恶意软件,但他们如何获得执行目标?

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

它也允许我使内存只读。这意味着我可以将非信任缓冲区旁边的区域标记为只读,并且缓冲区溢出不能覆盖更多基本数据。因此,在我的应用程序中没有远程代码,攻击者没有VirtualProtect。

一旦攻击者以某种方式访问​​系统,他可以使用VirtualProtect删除相同安全级别的进程保护,但此时您已经丢失了。

+0

谢谢,非常有趣。我不明白为什么其他人认为我的问题被严重问到。好吧! –

+0

@Mhmk我会认为这是因为一旦恶意软件在系统上,由于安全性已经被破坏,所以关于安全性的推理是毫无意义的。 – Mgetz

+0

@Mgetz这个问题也适用于其他领域,比如注入游戏秘籍。用户可能想要修改游戏的内存,但游戏本身不希望作弊。我试图提出的一点是,在类似情况下,安全性可能不是用户的问题。 –

1

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

如果系统中已经存在恶意软件,那么您所做的任何操作都不会起作用,因为恶意软件可能处于内核模式。在这种情况下,它可以做任何喜欢的事情。

4

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

我分配了一页内存,初始化它,然后标记为Unreadable/Unwriteable,然后我们的超级单片程序中的另一个组件不正确地访问了我的指针。只要该组件试图写入一个不可写的页面,我们就看到了访问违规,并且我们知道违规方是谁。

(在此之前,我们只知道内存已被覆盖......但我们不知道哪个组件正在执行)。