0

从 RAM 转储中提取屏幕截图

一些经典的安全/黑客挑战包括必须分析系统物理 RAM 的转储。波动性在提取有用信息方面做得很好,包括当时显示的窗口的线视图(使用命令screenshot)。但我想更进一步,找到窗口的实际内容。

因此,我想将问题重新表述为在大文件中查找原始图像(想想像素矩阵)。如果我能做到这一点,我希望至少找到部分窗口的内容。

我的想法是依靠一行像素与下一个像素相似的事实。如果我找到足够多的相同大小的行,那么我让用户摆弄一个交互式工具,看看它是否解码为有趣的东西。

为此,我会计算一种频谱图。更精确的热图,其中阴影显示数据块#x成为宽度为y字节的图像的一部分的可能性有多大,其中 xy频谱图的轴。然后我只需要在其中寻找水平线。(请参见下面的示例。)

我现在的问题是找到一种方法来准确快速地计算那种“频谱图”。作为一个数量级,我希望能够在几分钟内在 4GB 文件中找到宽度为 2048 的 RGBA 图像(每行 8192 字节)。这意味着每秒处理几十 MB。

我尝试使用 FFT 和自相关,但它们没有显示出我所追求的那种准确性。

FFT的问题

由于查找大部分重复模式的长度看起来像查找频率,因此我尝试使用 1 字节 = 1 个样本的傅里叶变换并绘制频谱的绝对值。

但主要问题是周期分辨率。因为我有兴趣找到信号的周期(一行像素的字节长度),所以我想在y轴上绘制周期长度的频谱图,而不是频率。但离散傅里叶变换的工作方式是计算1/n的频率倍数(对于n 个数据点)。这给了我在大周期内非常低的分辨率和在短期内高于需要的分辨率。

这是使用此方法在 144x90 RGB BMP 文件上计算的频谱图。我们预计偏移量为 432 处的峰值。FFT 的窗口大小为 4320 字节。

FFT 频谱图

以及第一个数据块的分段图。

FFT 第一个块的分段图

我计算出,如果我需要区分周期kk+1 ,那么我需要一个大约为的窗口大小。所以对于 8192 字节,这使得 FFT 窗口大约为 16MB。这太慢了。

因此,FFT 计算了太多我不需要的信息而没有足够的信息。但是给定一个合理的窗口大小,它通常会在大约正确的时期显示一个尖峰。

自相关的问题

我尝试的另一种方法是使用一种离散自相关来绘制频谱图。

更准确地说,我计算的是一个数据块与其一半之间的互相关。并且只计算小块完全在大块内的偏移量。大块的大小必须是要绘制的最大周期的两倍。

这是使用此方法在与以前相同的图像上计算的频谱图示例。

使用相关性的频谱图

以及第一个数据块的自相关的分段图。

第一个块的自相关的分段图

尽管它产生了恰到好处的数据量,但自相关的值变化缓慢,因此不会在正确的时间段内产生尖锐的峰值。

问题

有没有办法在正确的周期附近获得一个尖锐的峰值和在大周期周围足够的精度?通过调整上述算法或使用完全不同的算法。

4

1 回答 1

0

我无法对 FFT 部分做出太多评价。从标题(“在 RAM 转储中查找图像”)看来,您正在尝试解决一个更大的问题,而 FFT 只是其中的一部分,所以让我回答那些我有一些知识的部分。

分析系统的 RAM 转储

这听起来很像物理 RAM。如果应用程序截取屏幕截图,则该屏幕截图位于虚拟 RAM 中。这会导致两个问题:

a) 屏幕截图可能不完整,因为它的一部分被分页到磁盘

b)您需要执行物理地址到虚拟地址的映射,以使屏幕截图的字节顺序正确

从内存转储中查找原始图像

对我来说,原始图像的定义尚不清楚。任何存储图像的应用程序都将使用图像文件格式。仅存储数据会使屏幕截图无用。

为了对数据执行 FFT,您可能应该知道它是使用每像素 24 位还是每像素 32 位。

希望能找到截图或者当前windows的内容

这将需要一个截取屏幕截图的应用程序。你当然可以希望。我无法判断这种可能性。

依赖于一行像素与下一个相似的事实

您可能希望找到一些黑底白字。为此,假设可能是可以的。如果用户正在查看他的假期照片,这可能会有所不同。

另请注意,PC 中的许多值是 32 位(整数、浮点),而 0x00000000 是一个非常常见的值。您的算法可能会检测到这一点。

宽度为 2048 的图像

这只是猜测吗?或者你最终会暴力破解所有常见的屏幕尺寸吗?

在 RGBA 中

为什么选择 RGBA?屏幕截图通常没有透明度。


综上所述,我想知道在转储中搜索 JPEG、BMP 或 PNG 标头等图像签名,然后分析这些标头并简单地从元数据中获取图片是否更有效。

请注意,这之前已经完成,例如 WinDbg 在默认加载的ext调试器扩展中有一些命令

!findgifs
!findjpegs
!findjpgs
!findpngs
于 2016-09-07T13:00:46.243 回答