我在程序集中执行一个循环,在那里我解析 ntdll 的部分,使用VirtualProtect更改它们的内存权限,然后将它们恢复到原始权限。代码如下所示:
lea eax, [OldProtect] push eax //这里将存储旧的保护值 推送 PAGE_EXECUTE_READWRITE push dwSize //节的大小 push lpAddress //段的起始地址 调用 Virtual_Alloc ... 废话 ... lea eax, [OldProtect] 推eax push OldProtect //要恢复的保护值 push dwSize //节的大小 push lpAddress //段地址 调用 Virtual_Protect
循环在前三个部分.text、.RT和.data上正确运行,它们分别具有初始内存权限ER、ER、RW。
问题是在下一部分是.mrdata部分并且它是只读的,内存保护成功地从R更改为ERW。但是当我尝试恢复到旧保护时,eax 中的返回值为 0x00000050 并且出现异常。
我想问的是为什么?这是对 VirtualProtect 的错误使用吗?或与 .mrdata 部分有关