C++或者C#如何读取指定内存地址的值?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++或者C#如何读取指定内存地址的值?相关的知识,希望对你有一定的参考价值。

C++或者C#如何读取指定内存地址的值?只要读就行了,我想读一片连续地址的值! int *p;
p = ( int *)0x2FA400d8; cout << *p <<endl;这样读,会报错!我应该怎么做呢?我是新手,知道的最好写下简单的代码!只要能读就可以了!

参考技术A 每个程序都有自己的内存地址,不是你随便指定一个就可以读的,要在该程序合法的地址段内才可以读。不能读不属于该程序的地址 参考技术B Marshal.ReadByte(IntPtr address, int offset);

从指定的地址中读取一个字节的数据
address:内存地址
offset:地址偏移量
参考技术C 若楼主能获得连续内存的地址值,可以这样读取其内容:(假设有一个地址是12ff7c)
const
int
*p;
p=0x12ff7c;
printf("%d",*p);
这三句可以读取并打印12ff7c这个地址的内容。
但请注意,12ff7c必须是十六进制地址值,p=0x12ff7c;前面的0x不能少,否则,编译将不能识别12ff7c是地址。用vc
6.0编译以上三行代码,可能会出现警告,楼主不用理会,继续编译、连接、运行,最后,是可以读出结果的。
参考技术D 在WINDOWS下无法进行这个操作了.只能访问自己的程序空间,这种操作只能DOS下这种非保护模式下的操作系统 第5个回答  2020-03-12 可以,,通过api函数就可以,,不过c#不能直接读取内存值,,不过可以调用系统的api

如何在 C++ 中读取硬编码地址的值?

【中文标题】如何在 C++ 中读取硬编码地址的值?【英文标题】:How to read a value of an hard coded address in C++? 【发布时间】:2011-03-01 17:42:11 【问题描述】:

我正在寻找位于地址 302H 中的值。目的是从硬件(104pc 堆栈的一部分)读取输入。当我运行以下代码时出现此错误:Unhandled exception at 0x004134b9 in setOutput.exe: 0xC0000005: Access violation reading location 0x00000302.

#include <stdlib.h> 

#define PORTBASE 0x302
int _tmain(int argc, char *argv[])

    int value;
    int volatile * port = (int *) PORTBASE;
    printf("port = %d\n", port);
    value = *port;
    printf("port value = %d\n", value);

编辑:

我在 widows xp 下运行它。下面是我在板上可以找到的唯一文档

编辑:

从您下面的回答中,我可以看出我需要为该板编写一个驱动程序。有人可以向我指出如何执行此操作的资源吗?

【问题讨论】:

那么它还没有被内存映射到你的地址空间。我希望你不能从 Windows 用户代码中做到这一点——你需要从内核驱动程序中做到这一点。你有什么文档/示例代码? 有一个通用的 Windows 驱动程序,可以让您从用户模式程序读取/写入 IO 端口。我以前用它来读取/写入 0x378 的并行端口。我看看能不能再找到它。 【参考方案1】:

为了在Windows下直接访问物理内存,需要开发驱动。我建议您阅读Virtual Address Space 了解原因。简短的故事:您从用户模式进程中看到的内存地址与物理内存地址无关,而硬件所在的地址受到操作系统的保护,以防止用户模式应用程序搞砸。

【讨论】:

【参考方案2】:

我假设您的程序以普通用户身份运行。为了防止您损坏操作系统和使系统崩溃,现代操作系统和 CPU 会阻止您访问不属于您的程序的内存。

为了访问此类设备内存,您需要在内核 CPU 模式而不是用户模式下运行。使用此类设备的常用方法是编写在内核模式下运行的低级设备驱动程序,并将其用作用户模式程序的接口。

【讨论】:

【参考方案3】:

您不能直接从用户模式程序访问硬件。为此,您需要一个设备驱动程序。

硬件不附带一些您应该安装的软件吗?查看软件文档了解如何调用它。

【讨论】:

没有软件...我想用户(我)可以写:S【参考方案4】:

有几个现成的驱动程序可以让用户模式应用程序读写 IO 端口;其中最著名的一个是inpout32.dll,其他提到了here,要找到它们,一个好的搜索关键字是“写并行端口NT”(因为它们最常用于此任务)。

通常,它们通过加载内核模式驱动程序(需要管理权限的操作)然后在每次调用 dll 函数执行读/写时从用户模式调用它来工作。

但是请注意,这些库中的大多数都没有任何形式的访问控制,因此通过加载它们的驱动程序,您实际上允许任何知道如何使用它的应用程序在 IO 端口上读/写,这是相当安全的风险。

【讨论】:

ltalia:感谢您的回答!我将阅读该页面。我认为这不会带来太大的安全风险,因为 104pc 不太可能与任何网络分开。我也有兴趣尝试编写自己的驱动程序。它似乎是一个编写驱动程序的好板子,因为它的操作相对简单 @Richard:嗯,有几个这样的驱动程序是开源的,所以你应该很容易看到它们里面发生了什么。 :)【参考方案5】:

当然,如果你想全力以赴,你可以下载Windows Device Driver SDK

【讨论】:

以上是关于C++或者C#如何读取指定内存地址的值?的主要内容,如果未能解决你的问题,请参考以下文章

计算机内存读取写入原理

c++如何找到进程中的输出表内存地址(OD的bp)

C++ 仅读取进程范围内的内存地址

将变量存储在某个内存地址 C#

如何获取其他程序内存的地址,然后在我的程序中读取

嵌入式开发——用devmem命令直接读取寄存器的值