请问如何读取系统内存中任意地址的数据,如0x100,用C语言实现。

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了请问如何读取系统内存中任意地址的数据,如0x100,用C语言实现。相关的知识,希望对你有一定的参考价值。

如定义struct node,然后任取一块内存((struct node*)0x100)->data,并显示结果,或进行比较判断,不需要可写,只需可读。C语言如何实现。回答的好会加分的

参考技术A 首先要明确windows 的内存管理方式, (在 windows XP 非 3GB enabled)。 ring3程序也就是用户空间的进程可以用的空间地址是 virtual address 0x00000000 - 0x7FFFFFFF ,注意virual address 呵呵,而 0x80000000 以后为内核使用 都是 virtual address啊。ring3 进程不能读取 0x80000000 以后的地址。0x0000000 - 0x7FFFFFFF 也并不是都可以读取的。这个空间中会根据系统需要由系统分配一定的 region 或一系列的 regions。只有位于这些 regions 的地址是可以被ring3 进程读取的。所以比如任意地址 如 0x100 若这个地址不再任何一个 region 当中。就会出错(指定地址无内存)。实际上即是说,系统没有为 0x100 这个地址建立页表映射,也就不可读。 若你所说想要实现读取内核地址空间,也只能读取已经建立了页表映射的地址。不然同样要出错。 若想要判断一个地址是否是有效的,如你所担心的,用户可能传给你一个非法地址。可以用一些api 判断合法性。如 VirtualQuery 更强大的还有VirtualQueryEx。 http://msdn.microsoft.com/en-us/library/aa366902 (VS.85).aspx。 也可以用异常处理历程。 try except (c++),c也有异常处理 不过不好用。本回答被提问者采纳

如何用C语言 读取内存中的数据 要不要将实模式改为保护模式,实怎么改的呢,希望高手指点

这是我写的读取地址F000:7820处的内容,但是,跟在dos下,用debug看到的结果实不一样的? 请问问题出在哪里?
#include <stdio.h>
#include <stdlib.h>
main()

int i;
unsigned char far*p=(unsigned char far*)0x0007910;
for(i=1;i<=256;i++)

printf(" %02x",*p);
p++;


getch();

是如何在保护模式和实模式之间切换的呢,有没有较为详细的说明啊? 有源码的话,可以给一个吗??

你的程序和Debug中相同的地址实际上是被映射到不同的物理地址空间的,当然你看到的内容不一样了。

Windows是不会让你的程序进入实模式的。

如果你实在感兴趣,这里有让CPU切换模式的代码http://jc.finaleden.com/A/2001-12-10/7366.html,不过它只是表示了CPU进行模式切换的方法,不能在Windows环境之下使用的。

如果对Windows结构感兴趣的话,你需要看更多的Windows系统结构的资料了,关于驱动程序的发展,可以参考:http://funnypig.bokee.com/3235076.html
参考技术A 高手 ,能认识你吗,很想跟你学学C语言

以上是关于请问如何读取系统内存中任意地址的数据,如0x100,用C语言实现。的主要内容,如果未能解决你的问题,请参考以下文章

如何用C语言 读取内存中的数据 要不要将实模式改为保护模式,实怎么改的呢,希望高手指点

如何用汇编语言读取内存值

请问如何用ASP读取ini配置文件

计算机内存读取写入原理

java String 内存地址问题?如何获取 String 内存地址!

请问VB中如何读取txt文件的数据