Azerx 2023-01-23 23:56 采纳率: 83.3%
浏览 49
已结题

C++根据pid内存遍历列举

windows平台,c++用控制台,输入某个程序的pid后自动获取该程序内存地址的开始地址和结束地址,(注意不是获取自身的内存,是根据pid获取其他进程的),并遍历输出内存地址和字节,以及内存数据,效果如图,注意是获取其他程序的内存地址

img

  • 写回答

1条回答 默认 最新

  • 快撑死的鱼 2023-01-25 13:58
    关注

    回答不易,求求您采纳点赞哦

    在Windows平台上使用C++根据进程的PID遍历进程的内存,可以使用以下步骤:

    使用 OpenProcess 函数打开具有给定 PID 的进程的句柄。

    HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, pid);
    

    使用 VirtualQueryEx 函数获取进程内存区域的起始地址和结束地址。

    MEMORY_BASIC_INFORMATION mbi;
    char buffer[4096];
    SIZE_T bytesRead;
    
    for (LPVOID lpMem = 0; VirtualQueryEx(hProcess, lpMem, &mbi, sizeof(mbi)) == sizeof(mbi); lpMem = (LPVOID)((DWORD)mbi.BaseAddress + mbi.RegionSize)) {
        //start address: mbi.BaseAddress
        //end address: (LPVOID)((DWORD)mbi.BaseAddress + mbi.RegionSize)
    }
    

    使用ReadProcessMemory函数读取进程的内存,获取内存数据。

    ReadProcessMemory(hProcess, mbi.BaseAddress, buffer, mbi.RegionSize, &bytesRead);
    

    您可以使用 cout 或任何其他方法输出内存地址和字节以及内存数据。

    cout << "Memory address: " << mbi.BaseAddress << endl;
    cout << "Memory bytes: " << bytesRead << endl;
    cout << "Memory data: " << buffer << endl;
    
    • 重要的是要注意,当您尝试访问其他进程的内存时,您需要具有必要的权限。否则,该函数将失败并返回错误。

    • 此外,正确处理错误也很重要,因为某些内存区域可能无法读取。

    • 还值得注意的是,这是一个简化的示例,在真实场景中,您需要处理错误、添加更多检查并考虑安全性和其他因素。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录

报告相同问题?

问题事件

  • 系统已结题 2月2日
  • 已采纳回答 1月25日
  • 创建了问题 1月23日

悬赏问题

  • ¥15 Vue3 大型图片数据拖动排序
  • ¥15 划分vlan后不通了
  • ¥15 GDI处理通道视频时总是带有白色锯齿
  • ¥20 用雷电模拟器安装百达屋apk一直闪退
  • ¥15 算能科技20240506咨询(拒绝大模型回答)
  • ¥15 自适应 AR 模型 参数估计Matlab程序
  • ¥100 角动量包络面如何用MATLAB绘制
  • ¥15 merge函数占用内存过大
  • ¥15 使用EMD去噪处理RML2016数据集时候的原理
  • ¥15 神经网络预测均方误差很小 但是图像上看着差别太大