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