【问题标题】:C Pointers to scan memoryC 扫描内存的指针
【发布时间】:2015-01-08 07:42:54
【问题描述】:

我正在尝试扫描系统的内存。

我的计划: 创建指向内存的指针, 并在每个循环中将此指针向上移动一个字节。

所以这就是我想出的:

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

const char *MemAdressPointer(int n);

int main(void) {

    int i = 0;
    for(i = 0; i<100; i++)
    {
        const char* pAddr = MemAdressPointer(i+5000);
        printf("%c hexadecimal value of : 0x%p with i at : %i\n", *pAddr, pAddr, i);
    }
    getchar();
    return 0;
}

const char *MemAdressPointer(int n)
{
    void *p1 = (void*) n;

    const char* p2;
    p2 = p1;

    return p2;
}

至少我所知道的一切都有效。

打印好的内存地址。

但是当我打印字符 (%c) 时它会停止响应

很奇怪,指针,是一个字符,

不应该是指向一个字节,然后得到这个字节的二进制值

并从中取出对应的字符。

感谢您能给我的任何帮助。

【问题讨论】:

  • 所以您只需访问内存地址 5000 到 5000+100*sizeof(int) 并期望它可以正常运行吗?好吧,祝你好运。大多数情况下,您将在程序执行期间的某个时刻执行非法内存访问(尽管您只是在读取,而不是在写入,但它看起来仍然很不安全)。无论如何,作为对您问题的正式回答 - 您的代码会产生未定义的行为(非法内存访问是实际的答案)。
  • 顺便说一下,如果您在虚拟内存地址空间上运行,那么您的程序将测试虚拟地址,而不是物理地址。换句话说,您将在从操作系统加载进程的基地址的偏移量处读取(每次运行程序时,甚至每次操作系统将其换入和换出内存时都可能不同)。
  • 那里的5000+100*sizeof(int) 出错了。应该只是 5099(包括)。评论的其余部分维持......

标签: c pointers memory


【解决方案1】:

这不是现代操作系统的工作方式。 您不能简单地读取系统内存,因为应用程序内存是虚拟化的,而且由于安全策略,操作系统也禁止直接访问。

操作系统可能会提供一些 API 来访问其他进程的内存(假设您有权这样做)。在 Win32Api 上,这是 ReadProcessMemory

可能是其他一些操作系统 API 允许直接读取系统地址空间。 你可以深挖How do you read directly from physical memory?

【讨论】:

  • 这很可悲,所以你不能用指针直接访问 RAM,尽管 C 没有操作系统限制 :( 因为它的级别太低了。
  • @Begah 添加了一些链接
【解决方案2】:

你的编译器没有抛出以下警告吗:

warning: cast to pointer from integer of different size

在你正在做的函数MemAdressPointer()中:

void *p1 = (void*) n;/* which is wrong */

【讨论】:

  • 不,编译器没有抛出任何异常,它只是在 print("%c", *pAddr); 处停止响应一段代码。
  • 指向变量的指针?不,这是错误的,它应该是变量的地址。即使进行了此更改,您也有未定义的行为。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-13
  • 1970-01-01
  • 2016-04-19
  • 1970-01-01
  • 2015-04-21
  • 1970-01-01
相关资源
最近更新 更多