MENU

文章目录

「写内存的小细节」

2022 年 01 月 01 日 • 编程

原因

曾经我以为需要调用VirtualProtect才可以通过WriteProcessMemory写入只读内存,微软的文档上也只是告诉你写入的内存需要拥有可写熟悉

直到这两天偶然中在朋友那里得知,他WriteProcessMemory可以直接写入PAGE_EXECUTE_READ的内存,去查了一下,才发现事实并非文档所说,这个函数内部其实是有一套迷惑操作

Win7

  • 首先调用NtProtectVirtualMemory将内存属性强制修改为PAGE_EXECUTE_READWRITE
  • 如果原内存属性可写,则还原内存属性,然后调用NtWriteVirtualMemory写入内存
  • 如果原内存属性不可执行,则还原内存属性,然后返回STATUS_ACCESS_VIOLATION
  • 如果以上两个条件都没有达成,就调用NtWriteVirtualMemory写入内存,然后还原内存属性

Win10

  • 首先调用NtQueryVirtualMemory查询内存信息
  • 如果原内存属性可写,直接调用NtWriteVirtualMemory写入内存
  • 如果原内存属性不可执行,则还原内存属性,然后返回STATUS_ACCESS_VIOLATION
  • 如果内存类型为MEM_IMAGE,则修改内存属性为

    • PAGE_ENCLAVE_UNVALIDATED
    • PAGE_EXECUTE_WRITECOPY
    • OldAccessProtection
  • 如果内存类型为MEM_PRIVATE,则修改内存属性为

    • PAGE_ENCLAVE_UNVALIDATED
    • PAGE_EXECUTE_READWRITE
    • OldAccessProtection
  • 最后调用NtWriteVirtualMemory写入内存,然后还原内存属性

总结一下,Win10 在 Win7 的基础上,修改了一些判断的逻辑,添加了一些新的判断和机制