Caim-Astraea 2019-07-25 23:16 采纳率: 0%
浏览 192

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

  • 写回答

1条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2022-09-20 19:26
    关注
    不知道你这个问题是否已经解决, 如果还没有解决的话:
    • 文章:InlineHOOK 中也许有你想要的答案,请看下吧

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

报告相同问题?

悬赏问题

  • ¥15 R语言Rstudio突然无法启动
  • ¥15 关于#matlab#的问题:提取2个图像的变量作为另外一个图像像元的移动量,计算新的位置创建新的图像并提取第二个图像的变量到新的图像
  • ¥15 改算法,照着压缩包里边,参考其他代码封装的格式 写到main函数里
  • ¥15 用windows做服务的同志有吗
  • ¥60 求一个简单的网页(标签-安全|关键词-上传)
  • ¥35 lstm时间序列共享单车预测,loss值优化,参数优化算法
  • ¥15 Python中的request,如何使用ssr节点,通过代理requests网页。本人在泰国,需要用大陆ip才能玩网页游戏,合法合规。
  • ¥100 为什么这个恒流源电路不能恒流?
  • ¥15 有偿求跨组件数据流路径图
  • ¥15 写一个方法checkPerson,入参实体类Person,出参布尔值