• WIN32核心编程 - 内存管理 内存页面


    目录

    VirtualAlloc - VirtualFree

    VirtualAllocEx - VirtualFreeEx

    VirtualLock(Ex) - VirtualUnlock(Ex)

    VirtualQuery(Ex)

    Process Memory Information

    VirtualProtect(Ex)

    Heap - GetProcessHeap - HeapCreate - HeapAlloc - HeapReAlloc - HeapFree - HeapDestroy

    Heap - HeapSize - GetProcessHeaps

    Heap - Heap32ListFirst - Heap32First


    VirtualAlloc - VirtualFree

    1. #include
    2. #include
    3. int main()
    4. {
    5. //C
    6. int* p1 = (int*)malloc(sizeof(int));
    7. if (p1 != NULL)
    8. {
    9. std::cout << *p1 << std::endl;
    10. memset(p1, 0, sizeof(int));
    11. std::cout << *p1 << std::endl;
    12. *p1 = 0x12345678;
    13. std::cout << *p1 << std::endl;
    14. free(p1);
    15. p1 = nullptr;
    16. }
    17. //CPP
    18. int* p2 = new int(0xCC);
    19. if (p2 != NULL)
    20. {
    21. std::cout << *p2 << std::endl;
    22. memset(p2, 0, sizeof(int));
    23. std::cout << *p2 << std::endl;
    24. *p2 = 0x12345678;
    25. std::cout << *p2 << std::endl;
    26. delete p2;
    27. p1 = nullptr;
    28. }
    29. //WIN32
    30. LPVOID lpBuffer = VirtualAlloc(/*(LPVOID)0x800000*/NULL, 0xFF, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);
    31. if (lpBuffer != NULL)
    32. {
    33. memset(lpBuffer, 0xCC, 0xFF);
    34. BOOL bRet = VirtualFree(lpBuffer, 0, MEM_RELEASE);
    35. }
    36. //跨进程内存管理
    37. VirtualAllocEx;
    38. VirtualFreeEx;
    39. return 0;
    40. }

    VirtualAllocEx - VirtualFreeEx

    1. #include
    2. #include
    3. int main()
    4. {
    5. DWORD dwPid = 65772;
    6. HANDLE hProcess = 0;
    7. LPVOID lpBase = 0;
    8. DWORD dwWriteData = 0;
    9. DWORD dwWriteLeng = 0;
    10. DWORD dwReadData = 0;
    11. DWORD dwReadLeng = 0;
    12. //打开进程
    13. hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwPid);
    14. if (NULL == hProcess) return 0;
    15. //申请内存
    16. lpBase = VirtualAllocEx(hProcess, NULL, 0xFF, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);
    17. if (lpBase == NULL) return 0;
    18. //操作内存
    19. for (size_t i = 0; i < 0xFF; i++)
    20. {
    21. CHAR szBuffer = i;
    22. WriteProcessMemory(hProcess, (PUCHAR)lpBase + i, &szBuffer, sizeof(CHAR), &dwWriteLeng);
    23. }
    24. ReadProcessMemory(hProcess, (LPVOID)0x400000, &dwReadData, sizeof(DWORD), &dwReadLeng);
    25. //释放资源
    26. VirtualFreeEx(hProcess, lpBase, 0, MEM_RELEASE);
    27. CloseHandle(hProcess);
    28. return 0;
    29. }

    VirtualLock(Ex) - VirtualUnlock(Ex)

    1. #include
    2. #include
    3. int main()
    4. {
    5. //申请内存
    6. LPVOID lpBuffer = VirtualAlloc(NULL, 0xFF,MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);
    7. if (lpBuffer == NULL) return 0;
    8. //锁定页面
    9. VirtualLock(lpBuffer, 0xFF);
    10. //快速交互
    11. //解锁页面
    12. VirtualUnlock(lpBuffer, 0xFF);
    13. //释放内存
    14. VirtualFree(lpBuffer, 0, MEM_RELEASE);
    15. return 0;
    16. }

    VirtualQuery(Ex)

    1. #include
    2. #include
    3. int main()
    4. {
    5. LPVOID lpBuffer = VirtualAlloc(NULL, 4097, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);
    6. if (lpBuffer != NULL)
    7. {
    8. MEMORY_BASIC_INFORMATION mbi = { 0 };
    9. if (VirtualQuery((LPVOID)0x400000, &mbi, sizeof(MEMORY_BASIC_INFORMATION)) != 0)
    10. {
    11. return 0;
    12. }
    13. VirtualFree(lpBuffer, 0, MEM_RELEASE);
    14. }
    15. return 0;
    16. }

    Process Memory Information

    1. #include
    2. #include
    3. #include
    4. std::string StateToStr(DWORD State)
    5. {
    6. switch (State){
    7. case MEM_COMMIT : return "MEM_COMMIT";
    8. case MEM_FREE : return "MEM_FREE";
    9. case MEM_RESERVE: return "MEM_RESERVE";
    10. default : return "UNKONW_STATE";
    11. }
    12. }
    13. std::string ProtectToStr(DWORD Protect)
    14. {
    15. switch (Protect) {
    16. case PAGE_READONLY : return "PAGE_READONLY";
    17. case PAGE_READWRITE : return "PAGE_READWRITE";
    18. case PAGE_EXECUTE : return "PAGE_EXECUTE";
    19. case PAGE_EXECUTE_READ : return "PAGE_EXECUTE_READ";
    20. case PAGE_EXECUTE_READWRITE : return "PAGE_EXECUTE_READWRITE";
    21. case PAGE_NOACCESS : return "PAGE_NOACCESS";
    22. default : return "UNKNOWN_PROTECT";
    23. }
    24. }
    25. std::string TypeToStr(DWORD Type)
    26. {
    27. switch (Type) {
    28. case MEM_IMAGE : return "MEM_IMAGE";
    29. case MEM_MAPPED : return "MEM_MAPPED";
    30. case MEM_PRIVATE : return "MEM_PRIVATE";
    31. default : return "UNKNOWN_TYPE";
    32. }
    33. }
    34. int main()
    35. {
    36. // 进程标识
    37. DWORD dwPid = 0;
    38. std::cout << "please input processid ";
    39. std::cin >> dwPid;
    40. // 打开进程
    41. HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwPid);
    42. if (hProcess == NULL)
    43. {
    44. std::cout << "OpenProcess Failed" << std::endl;
    45. return 0;
    46. }
    47. // 内存信息
    48. LPVOID lpBaseAddr = 0;
    49. MEMORY_BASIC_INFORMATION mbi;
    50. RtlZeroMemory(&mbi, sizeof(MEMORY_BASIC_INFORMATION));
    51. while (VirtualQueryEx(hProcess, lpBaseAddr, &mbi, sizeof(MEMORY_BASIC_INFORMATION)))
    52. {
    53. printf("==============================\r\n");
    54. printf("BaseAddress 0x%08x\r\n", mbi.BaseAddress);
    55. printf("AllocationBase 0x%08x\r\n", mbi.AllocationBase);
    56. printf("AllocationProtect %s\r\n", ProtectToStr(mbi.AllocationProtect).c_str());
    57. printf("RegionSize 0x%08x\r\n", mbi.RegionSize);
    58. printf("State %s\r\n", StateToStr(mbi.State).c_str());
    59. printf("Protect %s\r\n", ProtectToStr(mbi.Protect).c_str());
    60. printf("Type %s\r\n", TypeToStr(mbi.Type).c_str());
    61. lpBaseAddr = (PUCHAR)mbi.BaseAddress + mbi.RegionSize;
    62. }
    63. return 0;
    64. }

    VirtualProtect(Ex)

    1. #include
    2. #include
    3. int main()
    4. {
    5. // 页面大小
    6. SYSTEM_INFO si = { 0 };
    7. GetSystemInfo(&si);
    8. // 申请内存
    9. LPVOID lpBuffer = VirtualAlloc(NULL, si.dwPageSize, MEM_COMMIT, PAGE_READONLY);
    10. if (lpBuffer == NULL) return 1;
    11. // 修改属性
    12. DWORD dwOldProtect = 0;
    13. if (VirtualProtect(lpBuffer, si.dwPageSize, PAGE_READWRITE, &dwOldProtect) == NULL) return 1;
    14. // 数据写入
    15. memset(lpBuffer, 0xCC, si.dwPageSize);
    16. // 内存查询
    17. MEMORY_BASIC_INFORMATION mbi = { 0 };
    18. VirtualQuery(lpBuffer, &mbi, sizeof(MEMORY_BASIC_INFORMATION));
    19. // 属性恢复
    20. if (VirtualProtect(lpBuffer, si.dwPageSize, dwOldProtect, &dwOldProtect) == NULL) return 1;
    21. // 释放资源
    22. VirtualFree(lpBuffer, 0, MEM_RELEASE);
    23. return 0;
    24. }

    Heap - GetProcessHeap - HeapCreate - HeapAlloc - HeapReAlloc - HeapFree - HeapDestroy

    1. #include
    2. #include
    3. int main()
    4. {
    5. // 进程默认堆
    6. HANDLE hHeap1 = GetProcessHeap();
    7. LPVOID lpBuffer1 = HeapAlloc(hHeap1, HEAP_ZERO_MEMORY, 4);
    8. if(lpBuffer1 == NULL) return 1;
    9. // 创建进程堆
    10. HANDLE hHeap2 = HeapCreate(0, 0x1000, 0x10000);
    11. if (hHeap2 == NULL) return 1;
    12. // 申请堆内存
    13. LPVOID lpBuffer2 = HeapAlloc(hHeap2, HEAP_ZERO_MEMORY, 16);
    14. if (lpBuffer2 == NULL)
    15. {
    16. HeapDestroy(hHeap2);
    17. return 1;
    18. }
    19. memset(lpBuffer2, 0xCC, 16);
    20. // 扩大堆内存
    21. LPVOID lpBuffer3 = HeapReAlloc(hHeap2, 0, lpBuffer2, 32);
    22. if (lpBuffer3 == NULL)
    23. {
    24. HeapFree(hHeap2, 0, lpBuffer2);
    25. HeapDestroy(hHeap2);
    26. return 1;
    27. }
    28. memset(lpBuffer3, 0xCC, 32);
    29. // 释放堆内存
    30. HeapFree(hHeap2, 0, lpBuffer2);
    31. // 释放堆句柄
    32. HeapDestroy(hHeap2);
    33. return 0;
    34. }

    Heap - HeapSize - GetProcessHeaps

    1. #include
    2. #include
    3. #include
    4. int main()
    5. {
    6. // 进程默认堆
    7. HANDLE hHeap = GetProcessHeap();
    8. if (hHeap == NULL) return 1;
    9. // 申请堆内存
    10. LPVOID lpBuffer1 = HeapAlloc(hHeap, 0, 16);
    11. LPVOID lpBuffer2 = HeapAlloc(hHeap, 0, 32);
    12. // 内存块大小
    13. std::cout << HeapSize(hHeap, 0, lpBuffer1) << std::endl;
    14. std::cout << HeapSize(hHeap, 0, lpBuffer2) << std::endl;
    15. // 释放堆资源
    16. HeapFree(hHeap, 0, lpBuffer1);
    17. HeapFree(hHeap, 0, lpBuffer2);
    18. // 创建进程堆
    19. HeapCreate(0, 0x1000, 0x10000);
    20. // 进程堆数量
    21. DWORD dwHeapCount = GetProcessHeaps(0, NULL);
    22. if (dwHeapCount == NULL) return 1;
    23. PHANDLE pHeaps = new HANDLE[dwHeapCount];
    24. dwHeapCount = GetProcessHeaps(dwHeapCount, pHeaps);
    25. if (dwHeapCount == NULL) return 1;
    26. // 输出堆信息
    27. for (size_t i = 0; i < dwHeapCount; i++)
    28. {
    29. std::cout << pHeaps[i] << std::endl;
    30. }
    31. delete[] pHeaps;
    32. CreateToolhelp32Snapshot;
    33. HEAPENTRY32;
    34. Heap32First;
    35. Heap32Next;
    36. return 0;
    37. }

    Heap - Heap32ListFirst - Heap32First

    1. #include
    2. #include
    3. #include
    4. int main()
    5. {
    6. // 创建堆的数据
    7. HANDLE hHeap = HeapCreate(0, 0x1000, 0x10000);
    8. // 获取进程标识
    9. DWORD dwPid = GetCurrentProcessId();
    10. // 创建内存快照
    11. HANDLE hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPHEAPLIST, dwPid);
    12. if (hSnap == INVALID_HANDLE_VALUE) return EXIT_FAILURE;
    13. // 结构描述信息
    14. HEAPLIST32 hl = { 0 };
    15. hl.dwSize = sizeof(HEAPLIST32);
    16. HEAPENTRY32 he = { 0 };
    17. he.dwSize = sizeof(HEAPENTRY32);
    18. // 遍历堆的列表
    19. if (Heap32ListFirst(hSnap, &hl))
    20. {
    21. do
    22. {
    23. printf("========\r\n");
    24. //遍历块的数据
    25. if (Heap32First(&he, dwPid, hl.th32HeapID))
    26. {
    27. do
    28. {
    29. std::cout << he.dwAddress << "\t" << he.dwBlockSize << std::endl;
    30. } while (Heap32Next(&he));
    31. }
    32. } while (Heap32ListNext(hSnap, &hl));
    33. }
    34. return EXIT_SUCCESS;
    35. }

  • 相关阅读:
    华为防火墙基础自学系列 | 证书申请方式
    计算机毕设(附源码)JAVA-SSM考勤管理系统
    【AI】第 2 章:从模型到生产
    【js】【爬虫】fetch + json-server 快速搭建爬虫服务器环境及数据后续处理(突破session缓存大小限制)
    界面控件DevExpress .NET MAUI v23.2新版亮点 - 拥有全新的彩色主题
    图像处理与计算机视觉--第四章-图像滤波与增强-第一部分
    Java基础:Java数字类型
    嵌入式Linux裸机开发(二)C语言LED驱动
    【SpringBoot】一文了解SpringBoot配置高级
    CSS优先级
  • 原文地址:https://blog.csdn.net/2301_80612536/article/details/140235985