用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,意思是内存分配访问无效。