总有人间一两风,填我十万八千梦

VirtualProtect或者VirtualProtectEx修改内存属性失败的问题

Windows C/C++ Zero、J 2146℃ 0评论

今天测试了一个IAT Hook,因为懒直接抄了一段代码,搜索DLL名称、搜索IAT地址,代码一气呵成,函数地址所在IAT位置已经找到。然后VirtualProtect修改内存属性执行替换,结果发现VirtualProtect返回值一直是FALSE,错误代码是ERROR_NOACCESS 998L。百思不得其解,最后找到了错误原因。

ERROR_NOACCESS 错误原因

lpflOldProtect参数,也就是用于保存原始的访问属性,必须要存在且有效,不能直接设置为NULL,否则VirtualProtect或者VirtualProtectEx会直接返回失败。

参考微软文档 @ https://docs.microsoft.com/zh-cn/windows/win32/api/memoryapi/nf-memoryapi-virtualprotectex?redirectedfrom=MSDN

DWORD lpfOldProtect = 0;
//pThunk 是 PIMAGE_THUNK_DATA32
BOOL iRet =VirtualProtect( (LPVOID) ((DWORD)&pThunk->u1.Function&~0xFFF),0x1000, PAGE_READWRITE, &lpfOldProtect);

转载请注明:悠然品鉴 » VirtualProtect或者VirtualProtectEx修改内存属性失败的问题

喜欢 (2)or分享 (0)
发表我的评论
取消评论

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址