QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 2755|回复: 18

C++读物理内存

[复制链接]
发表于 2005-2-28 16:40:41 | 显示全部楼层 |阅读模式
C++提供了int*读取内存地址中的数据,如果要把系统(WINXP)中的物理内存(包括虚拟内存)做个瞬时镜像。
有什么办法可以读取物理内存呢?

比如:
#include<iostream>
int main()
{
  int* m;
  for(m=0,m<100000;m++)
     cout<<m<<"="<<*m;
}
在这中,为什么老是说int*无效呢?
我用的是cbuilder.
如果语法有错误帮我纠正一下。谢谢
发表于 2005-2-28 17:00:11 | 显示全部楼层
兄弟如果这样简单就可以把内存给dump出来的话,还谈什么保护呢!
回复

使用道具 举报

发表于 2005-2-28 17:51:38 | 显示全部楼层
逻辑的错误如楼上所言,至于语法的错误...
int* m;
只是创建了一个指向int的“指针”,但并没有申请内存。
说以当你想用它的时候:
cout<<m<<"="<<*m;
这个指针并没有指向任何有效的内存(因为没申请),说以就会出错。

创建指针应该是:
int* m = (int)malloc(16); //创建一个指针指向16 Byte大的内存(int)。
回复

使用道具 举报

发表于 2005-2-28 18:12:40 | 显示全部楼层
呵呵,想法很好,但是,路还很长。努力努力!
回复

使用道具 举报

发表于 2005-2-28 19:17:57 | 显示全部楼层
我看单从语法上看是没有错误的,他是想从内存地址0开始一直读到内存的地址(100000 * (sizeof(int)))处,然后打印*m的值。

但是也应该这样写for (m=0; m<(int *)100000; m++) printf("%d\n", *m);

但是这个程序仅仅只是停留在理论上的,具有保护模式的系统是不允许这样的操作的。

比如,可以试着读出指向内存中任何一个存在的字节,比如

#define ADDRESS (char *)0xbfffddf7
int main(void)
{
        char *ptr = ADDRESS;
        printf("%d\n", *ptr);;
        return 0;
}

在linux下有时段错误,有时能随机出现一个数值,这是因为上面给出的地址有可能是在用户区的堆栈段。

如何实现这个想法呢,我也不清楚
回复

使用道具 举报

发表于 2005-3-1 08:05:07 | 显示全部楼层
[quote:e1e44ad34c="bzimage"]但是也应该这样写for (m=0; m<(int *)100000;[/quote]

写"m=0"不就相当于写"m=NULL"吗?
NULL的指针不能用吧.
回复

使用道具 举报

发表于 2005-3-1 10:22:28 | 显示全部楼层
事实上是相同的,但NULL和0的意义是不同的,这里的m=0是要读一个“合法?”的地址为0的数据。当然事实上,这是永远也不会成功读出的。
回复

使用道具 举报

发表于 2005-3-1 10:33:40 | 显示全部楼层
你们的C++怎么就能学的这么好呢,真是羡慕呀!
回复

使用道具 举报

发表于 2005-3-1 11:07:43 | 显示全部楼层
无论Win还是Linux在内存最低处(ia32体系)都有一个unused区,可以用来捕获0指针。这段区域是无法读的。在内存高端约3/4处,有一个对用户不可见的区域。这两端中间的内存是可读的。因为保护机制,你不会读到其它程序的内存。
回复

使用道具 举报

发表于 2005-3-2 17:03:36 | 显示全部楼层
[quote:36d620dd21="sagaeon"]无论Win还是Linux在内存最低处(ia32体系)都有一个unused区,可以用来捕获0指针。这段区域是无法读的。在内存高端约3/4处,有一个对用户不可见的区域。这两端中间的内存是可读的。因为保护机制,你不会读到其它程序的内存。[/quote]

是虚拟内存最后一GB吗
回复

使用道具 举报

 楼主| 发表于 2005-3-3 23:30:24 | 显示全部楼层
非常感谢。我还在学习当中。继续努力。:)
回复

使用道具 举报

发表于 2005-3-4 07:14:35 | 显示全部楼层
Linux好像是地址小于1000(还是10000)的指针都是NULL
回复

使用道具 举报

发表于 2005-3-8 12:48:08 | 显示全部楼层
倒google搜索有结果的,曾经我就这样.
在windows下面可以采用调用门等 机制实现用户程序运行级别的提升,普通程序运行在ring 3级别.可以越权到ring 0级,这时候可以直接对计算机硬件进行操作.代码你去网上搜索下载
linux下面暂时我还不知道.
不过两种系统都可以通过驱动程序进行操作,这是最好的办法,驱动程序直接运行在ring 0级别
回复

使用道具 举报

发表于 2005-3-8 18:56:26 | 显示全部楼层
这个问题其实属于操作系统的范畴。在应用程序寻址的过程中,内核会做地址有效性检查,检查的结果是:一:地址在内存为VALID,二:INVALID:其中又分为两种情况:1。地址有效但不在内存,2。地址无效,发软中断给进程。
回复

使用道具 举报

发表于 2005-3-8 19:22:21 | 显示全部楼层
由于你的概念是错的,所以这样的程序根本就不可能,或者你要改造内核。

windows确实曾经有ring3跳到ring0的漏洞(具体怎么搞我不清楚),写成内核模块可以直接运行在最高级。

但是,即便是这样也不可能,在内核的空间管理中,内核或者程序占用的地址空间是有范围的,对范围外的操作内核不会为你做缺页调用。

还有,内核尽管运行在最高级,但它并不能直接访问全部进程的物理页,想想即使内核也要通过页机制访问内存的这个基本原则,所以内核只能一次直接访问当前进程的全部内存。你想访问所有内存页必须遍利所有进程,把他们的物理页一个接一个的加入当前的页表才能访问。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2024-11-6 13:43 , Processed in 0.047739 second(s), 15 queries .

© 2021 Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表