![]() |
1
20
您遇到的一个问题是,您正在返回一个虚拟地址,而不是内存所在的物理地址。下次启动时,映射可能不一样。 这可以在Linux的内核模块中完成,但我认为在用户空间中没有任何类型的API可以使用。 如果您有权限(如果您重新启动计算机,我假设您可以是该计算机上的根目录),那么您可以查看/dev/mem以查看实际的种类布局。也许您应该尝试对值进行采样,重新启动,然后查看这些值中有多少是持久的。 |
![]() |
2
11
有一个 similar project 演示冷启动攻击。这个 source code 有,也许你能从中得到一些灵感。 但是,他们在没有先加载操作系统的情况下读取内存,因此不必破坏OSS内存保护。也许您也应该尝试这样做,以避免在引导后内存被操作系统覆盖或清除。 (还可以在网站上查看视频,这非常令人印象深刻;) |
![]() |
3
5
在这个问题上 Direct Memory Access in Linux 我们解决了实现这一目标所需的大部分基本问题。注意,mmap()并不是这个问题的答案,因为其他人所说的原因正是如此。你需要一个真实的地址,而不是虚拟的,你只能进入内核(或者通过编写一个驱动程序来将其中继到用户空间)。 最简单的方法是编写一个可以读写的字符设备驱动程序,并使用ioctl为您提供一个有效的起始或结束地址。同样,如果您希望在内核中使用内存管理函数的指针,请参阅我链接到的问题。其中大部分是在第一个(并被接受的)答案的评论中得出的。 |
![]() |
4
2
你的测试代码看起来很奇怪
您不能将一个整数强制转换为一个文件指针,并期望得到一些健全的东西。 你也把第一个和最后一个论点转换成了fwrite吗?最后一个参数应该是要写入的文件*。 |
![]() |
5
2
为此,您可能需要尽可能少的操作系统;加载的软件越多,覆盖您要检查的内容的机会就越大。 DOS可能是个不错的选择;它使用640K内存。如果您不加载himem,而是编写自己的(需要汇编的)例程来跳转到pmode,将一块高内存复制到低内存,然后跳转回实模式,您可以编写一个基本上是实模式的程序,该程序可以转储物理RAM(减去bios、dos和应用程序的使用量)。它可以把它丢到一个闪盘或别的什么东西上。 当然,真正的问题可能是在开机自检期间BIOS会清除内存。 |
![]() |
6
1
我不熟悉Linux,但您可能需要编写设备驱动程序。设备驱动程序必须有某种方法将虚拟内存地址转换为物理内存地址,以便进行DMA(DMA控制器只处理物理内存地址)。您应该能够使用这些接口直接处理物理内存。 |
![]() |
Community wiki · 如何调试Python内存故障? 1 年前 |
![]() |
tuskiomi · 如何为参考提供明确的锈蚀寿命? 2 年前 |
![]() |
cobb208 · Malloc正在为释放指针引发错误 2 年前 |
![]() |
mo FEAR · C++ STL映射是否在创建后移动了一个值的位置? 2 年前 |
![]() |
Pooyanoss · 覆盖类的堆栈分配实例 2 年前 |
![]() |
TheKing · 为什么数组的地址可以有负值? 2 年前 |
![]() |
Http2inc · 如何从内存中解析这些二进制数据? 2 年前 |
![]() |
tifrel · 如何检查已编译类型的表示形式? 2 年前 |
![]() |
Gabriele · 释放GSL矩阵的正确方法是什么? 6 年前 |
![]() |
Makogan · 3D纹理大小影响程序输出,不会引发错误 6 年前 |