修改内存页面属性失败
简述:查询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)
都不行。
到底错在哪里?