据我所知,使用c ++无法直接访问所有内存位置,但我想要做的就是返回应用程序所有可访问的ram内存位置。将这个地址列表存储在动态变量中是不可能的,因为我们需要更多空间来保存包含该地址的变量的地址!但这并不重要,因为我可以将其保存在文本文件中。即使尝试读取这样的存储器位置的一次尝试也会使应用程序崩溃。如果应用程序提供了更好的错误消息,我可以编写代码来获取所有可访问的内存位置的地址,而不是崩溃。
如果有方法返回此地址列表,我想知道(我正在使用Windows 7)。提前致谢。
如果可以访问内存位置,我尝试了以下想法尝试返回:
包含两个代码:
第一个:
#include <stdlib.h>
#include <iostream>
#include <conio.h>
using namespace std;
int main()
{
if(!(system("\"C:\\Users\\ ...\\read0.exe \""))// I have not provided the complete path
cout<<"readable memory location";
else
cout<<"not readable";
getch();
return 0;
}
第二个:
///one trying to read the accessible memory location
/// read0.cpp; released as read0.exe
int main()
{
int *a;//runs in 32-bit computer
a= (int*)0;
if((*a))
{/*do nothing; just try reading the memory location*/
}
return 0;
}
当第一个控制台文件打开第二个时,会导致第二个文件崩溃;它导致操作系统打开一个窗口,要求调试或关闭应用程序。这会延迟时间并使其效率降低。因此,我一直试图找到一种方法来温和地禁用此消息框弹出,我找到了this。
你可以在Windows 7命令提示符下给出命令行,这样我就可以使用c ++中的系统命令将dword值设置为零,从而在崩溃期间禁用错误消息。我是使用cmd编辑注册表的新手。
答案 0 :(得分:1)
据我所知,这不能轻易做到。
在 Linux 中有/proc/<PID>/maps
,其中(我相信)提供了进程的映射虚拟内存地址的完整列表。它看起来像这样:
00400000-004e5000 r-xp 00000000 08:01 11567110 /bin/bash
006e4000-006e5000 r--p 000e4000 08:01 11567110 /bin/bash
006e5000-006ee000 rw-p 000e5000 08:01 11567110 /bin/bash
006ee000-006f4000 rw-p 00000000 00:00 0
02243000-0242e000 rw-p 00000000 00:00 0 [heap]
7f1d1744e000-7f1d17459000 r-xp 00000000 08:01 5260634 /lib/x86_64-linux-gnu/libnss_files-2.13.so
7f1d17459000-7f1d17658000 ---p 0000b000 08:01 5260634 /lib/x86_64-linux-gnu/libnss_files-2.13.so
7f1d17658000-7f1d17659000 r--p 0000a000 08:01 5260634 /lib/x86_64-linux-gnu/libnss_files-2.13.so
7f1d17659000-7f1d1765a000 rw-p 0000b000 08:01 5260634 /lib/x86_64-linux-gnu/libnss_files-2.13.so
7f1d1765a000-7f1d17664000 r-xp 00000000 08:01 5260630 /lib/x86_64-linux-gnu/libnss_nis-2.13.so
7f1d17664000-7f1d17863000 ---p 0000a000 08:01 5260630 /lib/x86_64-linux-gnu/libnss_nis-2.13.so
7f1d17863000-7f1d17864000 r--p 00009000 08:01 5260630 /lib/x86_64-linux-gnu/libnss_nis-2.13.so
(34 more lines)