有关InlineHook对内存的读写问题

用VirtualQuery读取api开头内存的访问属性得到的是PAGE_EXECUTE_READ直接用writememory写入内存会成功,如果用VirtualProctect修改内存的属性为PAGE_READWRITE,virtualprotect就会修改失败,这时再调用writeprocessmemory写入内存也会失败,这是为什么呢?
写入内存的函数如下:
BOOL CILHook::WriteMemory(BYTE bytes[7])
{
/*MEMORY_BASIC_INFORMATION mbi;
::VirtualQuery(pfnAddr, &mbi, sizeof(mbi));
switch (mbi.Protect)
{
case PAGE_NOACCESS:
MessageBox(0, "PAGE_NOACCESS", "目标地址的访问类型", MB_OK);
break;
case PAGE_EXECUTE:
MessageBox(0, "PAGE_EXECUTE", "目标地址的访问类型", MB_OK);
break;
case PAGE_EXECUTE_READ:
MessageBox(0, "PAGE_EXECUTE_READ", "目标地址的访问类型", MB_OK);
break;
case PAGE_EXECUTE_READWRITE:
MessageBox(0, "PAGE_EXECUTE_READWRITE", "目标地址的访问类型", MB_OK);
break;
case PAGE_GUARD:
MessageBox(0, "PAGE_GUARD", "目标地址的访问类型", MB_OK);
break;
}

BOOL bet = VirtualProtect(pfnAddr, sizeof(BYTE)* 7, PAGE_READWRITE, 0);
if (bet == FALSE)MessageBox(0, "内存页的属性修改失败", "警告", MB_OK);*/
BOOL bRet = WriteProcessMemory(GetCurrentProcess(), (LPVOID)pfnAddr, bytes, sizeof(BYTE)* 7, 0);
/*VirtualProtect(pfnAddr, sizeof(BYTE)* 7, mbi.Protect, 0);*/
if (bRet == 0){
    int err = GetLastError();
    char szTitle[MAXBYTE] = { 0 };
    sprintf(szTitle, "错误码:%d", err);
    MessageBoxA(0, "HOOK写入失败", szTitle, MB_OK);
}
return bRet;

}
填上注释的部分,writeprocessmemory就会失败,GetLastError得到998,意思是内存分配访问无效。

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 文章:InlineHOOK 中也许有你想要的答案,请看下吧

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^