修改内存页面属性失败

mzz_810 2004-04-28 02:36:16
简述:查询mbi.Protect是PAGE_READONLY,修改为PAGE_READWRITE失败,程序见下。

输入:
ProcessID - 待修改内存的进程句柄
Addr - 待修改内存的地址
PageSize - 内存页面大小 ,通过GetSystemInfo接口获得

HANDLE hProcess;
MEMORY_BASIC_INFORMATION mbi;
DWORD OldProtect;
hProcess=OpenProcess(PROCESS_VM_OPERATION|
PROCESS_VM_READ|PROCESS_VM_WRITE,FALSE,ProcessID);
if ( hProcess )
{
VirtualQueryEx(hProcess,(void *)Addr,&mbi,sizeof(mbi));
if(mbi.State!=MEM_COMMIT)
{
return FALSE;
}
if(mbi.Protect & (PAGE_NOACCESS|PAGE_GUARD|PAGE_READONLY))
{
if(VirtualProtectEx(hProcess,(void *)Addr,4,
PAGE_READWRITE,&OldProtect)==FALSE)
{
i = GetLastError();
return FALSE; // 运行到这里退出
}
}
WriteProcessMemory( ... ...)
......
}

GetLastError返回87,参数错误,但是同样的地址用ReadProcessMemory可以读取;
我将
VirtualProtectEx(hProcess,(void *)Addr,4,
PAGE_READWRITE,&OldProtect)
改为
VirtualProtectEx(hProcess,(void *)mbi.BaseAddress,mbi.RegionSize,
PAGE_READWRITE,&OldProtect)
或改为
VirtualProtectEx(hProcess,(void *)mbi.BaseAddress,PageSize,
PAGE_READWRITE,&OldProtect)
都不行。

到底错在哪里?
...全文
335 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
rabo 2004-04-30
  • 打赏
  • 举报
回复
VirtualProtectEx支持2000以上系统
你要先全全权限打开进程,然后再用VirtualProtectEx
bager 2004-04-30
  • 打赏
  • 举报
回复
提问:

在你的代码中,传入OpenProcess的第一个参数值中,不具备PROCESS_QUERY_INFORMATION属性,能保证VirtualQueryEx调用成功吗?(调试时,确认一下mbi的各个成员值是否正确)。

mzz_810 2004-04-29
  • 打赏
  • 举报
回复
也就是说,如果进程A的某个页面是ReadOnly的话,其他进程不能对进程A的这个页面进行写操作了?到底有没有方法在用户模式实现以上操作呢??
xenke 2004-04-29
  • 打赏
  • 举报
回复
All pages in the specified region must be (--注意:must be --)within the same reserved region allocated when calling the VirtualAlloc or VirtualAllocEx function using MEM_RESERVE. The pages cannot span adjacent reserved regions that were allocated by separate calls to VirtualAlloc or VirtualAllocEx using MEM_RESERVE.

xenke 2004-04-29
  • 打赏
  • 举报
回复
应该没这么简单吧,否则一个进程不就可以随便破坏别的进程了

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧