效果
图1,可以看到内存属性已经修改为只读,保护值4变成了2.复制内容因为在修改前执行,所以正确执行
图2,将复制代码移到修改保护属性代码后,弹出异常.这是在调试状态,如果在正常执行时则会显示如图3
源码
#include
#include
int main(int argc, PCHAR argv[]){
SIZE_T sizeVirtual = 4000;//大小
LPVOID lpRound = (LPVOID)0x100000FF;//地址
MEMORY_BASIC_INFORMATION mbi;//内存信息
//分配内存,直接分配已提交的内存
LPVOID lpAddress = VirtualAlloc(lpRound, sizeVirtual, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);
if (lpAddress == NULL){
printf("分配虚拟内存失败: %d\n", GetLastError());
return 1;
}
printf("分配成功: MEM_COMMIT | MEM_RESERVE 内存已从 空闲 提交为 已提交\n");
//获取内存信息并打印
VirtualQuery(lpAddress, &mbi, sizeof(mbi));
printf("使用VirtualQuery函数获得的信息是;\n");
printf("基址: 0x%.8x 分配基址: 0x%.8x\n", mbi.BaseAddress, mbi.AllocationBase);
printf("分配保护: 0x%.8x 区域大小: 0x%.8x\n", mbi.AllocationProtect, mbi.RegionSize);
printf("状态: 0x%.8x 保护: 0x%.8x 类型: 0x%.8x\n", mbi.State, mbi.Protect, mbi.Type);
//修改内存保护属性 [这里修改了]
printf("修改内存保护属性\n");
if (!VirtualProtect(lpAddress, mbi.RegionSize, PAGE_READONLY, &mbi.Protect)){
printf("修改保护属性失败: %d\n", GetLastError());
return 1;
}
//复制数据到内存中 [这里执行会出错]
CopyMemory(lpAddress, TEXT("misaka"), lstrlen(TEXT("misaka")));
printf("复制成功,地址: 0x%x, 内容: %s\n", lpAddress, lpAddress);
//获取内存信息并打印
VirtualQuery(lpAddress, &mbi, sizeof(mbi));
printf("使用VirtualQuery函数获得的信息是;\n");
printf("基址: 0x%.8x 分配基址: 0x%.8x\n", mbi.BaseAddress, mbi.AllocationBase);
printf("分配保护: 0x%.8x 区域大小: 0x%.8x\n", mbi.AllocationProtect, mbi.RegionSize);
printf("状态: 0x%.8x 保护: 0x%.8x 类型: 0x%.8x\n", mbi.State, mbi.Protect, mbi.Type);
//释放内存,将页面变为保留状态
printf("释放内存,将页面变为保留状态 DECOMMIT\n");
if (!VirtualFree(lpAddress, sizeVirtual, MEM_DECOMMIT)){
printf("释放虚拟内存失败: %d\n", GetLastError());
return 1;
}
getchar();
return 0;
}