【问题标题】:how to read raw memory in c如何在c中读取原始内存
【发布时间】:2012-10-03 06:02:48
【问题描述】:

我想定义一个任意大小的缓冲区,它可以在内存中分配一些空间。我想读取分配给该缓冲区的内存中的现有数据。

我尝试过以下代码,但我每次都只看到一些特殊字符。

如果我通过 DumpIt 工具转储我的内存,然后通过 HEX 编辑器打开它,我可以看到普通字符(如数字和 abc 等)。

我使用了下面的代码,它使用了两种技术first mentioned here,第二种只使用简单的数组并一个一个地遍历每个字符。

#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <process.h>
#include <time.h>
#include <cstdlib>
#include <stdint.h> 

int main()
{
    int x = 4;
    char arr[400];
    char * src;
    src = arr;

    uint8_t *memory = (uint8_t *) malloc(1000);  
    while(*memory != NULL) {
        printf("Character %c\n", *(memory++));
        memory++;
    }

    while(src != NULL) {
        printf("%c ", *src);
        x++;
        if(x == 1000)
            break;
    }
    printf("And the data stored in memory is %s\n", arr);

    system("PAUSE");
    return 0;
}

【问题讨论】:

  • 你为什么期待看到有意义的东西?另请记住,您很可能在具有虚拟内存的系统上运行;你不会像那样读取任何其他进程的内存。
  • 您似乎很困惑,您无法读取随机“内存”,而虚拟内存则没有读取“原始”内存之类的东西。

标签: c memory memory-management


【解决方案1】:

当你运行 malloc 时,你只会在那个内存段中得到随机的东西。其中一些将无法被编码为任何用 ASCII 可读的东西。您可以尝试使用“%X”而不是“%c”打印内存中的十六进制值。

虽然我不知道你为什么要做这样的事情。

【讨论】:

  • 好奇心是我唯一能想到的。
  • 欧凯。我想看看这个“随机的东西”到底是什么。如果我不能通过这种方式看到人类可读的字符,为什么当我使用 DumpIt 工具进行内存转储和 HexEditor 打开这个转储文件时,我能够在内存中找到人类可读的字符。谢谢
  • 大多数十六进制编辑器会将所有不可读的字符替换为句点,您可能会看到。例如,您可能会看到类似“71 bf 8f b1 65 77 4c 55 q...ewLU”的内容。 “.”只是十六进制编辑器,用符号替换不可读的字符,因此您更容易阅读。
【解决方案2】:

你没有告诉我们你在什么类型的系统上运行你的代码(conion.h 让我担心最坏的情况),但在任何体面的系统上,你永远不会得到这样的“随机”数据。出于安全原因,您从系统获取的所有页面都将被清除,否则任何进程都可以读取其他进程留下的任何内容、密码、情书……

您最终可能会看到您自己的进程在初始化、调用另一个函数时留在堆上或堆栈上的伪随机内容。但这就是你可以期待的所有“随机性”。

吹毛求疵:

  • 不要返回malloc
  • 你的电话

-

printf("And the data stored in memory is %s\n", arr);

没有多大意义。此打印语句在遇到第一个空字符时停止打印。

【讨论】:

  • 这是有道理的。还有一个后续问题:操作系统何时清除内存?当旧程序退出或新程序尝试访问该页面时?是否有任何关于进程内存擦除的 Windows 链接?我只能找到硬盘驱动器、USB 等。谢谢
猜你喜欢
  • 2013-07-01
  • 2018-07-16
  • 2023-02-22
  • 1970-01-01
  • 2019-05-16
  • 2019-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多