内存基础与相关结构
目录
查询内存的相关操作
#include<stdio.h>
#include<stdlib.h>
#include<Windows.h>
//#include<algorithm>
#include<Psapi.h> //与进程相关
int main()
{
//查询内存的相关操作
SYSTEM_INFO lpSystemInfo = { 0 };
GetSystemInfo(&lpSystemInfo);/*获取我们系统信息的时候能拿到的内存相关的信息*/
MEMORYSTATUSEX lpBuffer = { 0 };
lpBuffer.dwLength = sizeof(MEMORYSTATUSEX);
GlobalMemoryStatusEx(&lpBuffer);//获取虚拟内存的一个状态
//不带EX的情况下是你的系统内存小于4GB的情况下
PROCESS_MEMORY_COUNTERS ppsmemCounters = { 0 };//直接拿到结构
GetProcessMemoryInfo(GetCurrentProcess(), &ppsmemCounters,sizeof(PROCESS_MEMORY_COUNTERS));
//获取当前进程的内存信息
system("pause");
return 0;
}
使用一些申请内存的API方法 ,写本进程的内存
#include<stdio.h>
#include<stdlib.h>
#include<Windows.h>
//#include<algorithm>
#include<Psapi.h> //与进程相关
int main()
{
//使用一些申请内存的API方法
LPVOID lpBuffer = VirtualAlloc(NULL,0x1024,MEM_COMMIT,PAGE_READWRITE);
if (lpBuffer == NULL)
{
printf("Alloc Failed ErrorCode:%d",GetLastError());
system("pause");
}
DWORD dwOldProtect = 0;
VirtualProtect(lpBuffer,0x1024,PAGE_EXECUTE_READ,&dwOldProtect);
//RtlZeroMemory(lpBuffer,0x1024);//清空内存 前面已经清空为0了(传的MEM_COMMIT)这里相当于没什么意义
MEMORY_BASIC_INFORMATION lpBufferInfo = { 0 };//声明一下这个结构 进行查询并且是保存在这里面
//VirtualQuery(lpBuffer,&lpBufferInfo,sizeof(MEMORY_BASIC_INFORMATION));//就是只是查一下是不是可读可写就行了
//改内存保护属性
RtlCopyMemory(lpBuffer,L"123456",14);//由于上面已经改变了内存的保护属性 而这里写入了内存从而造成了异常
//重新写进去的话就修改一下内存保护属性
//memcpy();常规写法参数一样
VirtualFree(lpBuffer,0,MEM_RELEASE);//有MEM_RELEASE第二个参数要为0 其他的就看着选
system("pause");
return 0;
}
内存保护的一些详细属性
跨进程读写
#include<stdio.h>
#include<stdlib.h>
#include<Windows.h>
#include<Psapi.h> //与进程相关
int main()
{
WCHAR szBufferWrite[] = L"wakappxc";
WCHAR szBufferRead[MAX_PATH] = { 0 };
//上面如果能成功读到那就说明能读成功了也能写成功了
//跨进程读写 在后边都加个Ex
HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS,FALSE,21196);
LPVOID lpBuffer = VirtualAllocEx(hProcess,NULL,0x100,MEM_COMMIT| MEM_RESERVE,PAGE_READWRITE);//申请的地址
//此时我们可以用lpBuffer验证一下是否成功了
//但是我们直接去写一下,写完之后再把它读回来
DWORD dwWriteSize = 0;
WriteProcessMemory(hProcess, lpBuffer, szBufferWrite,(wcslen(szBufferWrite)+1)*2,&dwWriteSize);//WCHAR一个是两个字节所以要*2
//---------------去哪写----去哪写的地址--写什么东西-------写这个东西多大----------实际上写了多大的一个变量
DWORD dwReadSize = 0;
ReadProcessMemory(hProcess, lpBuffer, szBufferRead,(wcslen(szBufferWrite) + 1)*2,&dwReadSize);
VirtualFreeEx(hProcess, lpBuffer,0,MEM_RELEASE);//进行释放
CloseHandle(hProcess);//我们打开了一个句柄 调用此函数释放
//VirtualProtectEx();//修改别的程序的内存
system("pause");
return 0;
}
堆的创建 分配 存储 释放 销毁
#include<stdio.h>
#include<stdlib.h>
#include<Windows.h>
#include<Psapi.h> //与进程相关
int main()
{
//堆的创建 分配 存储 释放 销毁
HANDLE hHeap = HeapCreate(HEAP_NO_SERIALIZE,0,0);//设置为0可自动增长
LPVOID lpBuffer= HeapAlloc(hHeap,HEAP_ZERO_MEMORY,1024);
//可指定在某一个堆上分配 VirtualAalloc只能在默认堆上分配
//默认堆不能满足的情况下放在一个新的堆一个新的管理系统之中相当于
memcpy(lpBuffer, L"abcd", 10);
HeapFree(hHeap,HEAP_ZERO_MEMORY,lpBuffer);
//堆释放并不代表堆已经不存在了,还在并且仍然可以继续利用
HeapDestroy(hHeap);//表示销毁堆 不能再继续使用堆
system("pause");
return 0;
}