VirtualProtect 未能恢复对 ntdll 的 mrdata 部分的保护,为什么?

逆向工程 视窗 部件 记忆 dll 保护
2021-06-15 22:06:33

我在程序集中执行一个循环,在那里我解析 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上正确运行它们分别具有初始内存权限ERERRW

问题是在下一部分是.mrdata部分并且它是只读的,内存保护成功地从R更改ERW但是当我尝试恢复到旧保护时,eax 中的返回值为 0x00000050 并且出现异常。

我想问的是为什么?这是对 VirtualProtect 的错误使用吗?或与 .mrdata 部分有关

1个回答

哦,我想我找到了一个答案,但我没有尝试,需要更多的研究,似乎有一个特殊的 Windows API 函数用于更改 .mrdata 上的保护,称为 LdrProtectMrdata( bProtect )

来源:http : //mohamoha.club/2017/12/23/Bypass_CFG_Through_MRDATA/