从 RAM 转储中提取屏幕截图
一些经典的安全/黑客挑战包括必须分析系统物理 RAM 的转储。波动性在提取有用信息方面做得很好,包括当时显示的窗口的线视图(使用命令screenshot)。但我想更进一步,找到窗口的实际内容。
因此,我想将问题重新表述为在大文件中查找原始图像(想想像素矩阵)。如果我能做到这一点,我希望至少找到部分窗口的内容。
我的想法是依靠一行像素与下一个像素相似的事实。如果我找到足够多的相同大小的行,那么我让用户摆弄一个交互式工具,看看它是否解码为有趣的东西。
为此,我会计算一种频谱图。更精确的热图,其中阴影显示数据块#x成为宽度为y字节的图像的一部分的可能性有多大,其中 x和y是频谱图的轴。然后我只需要在其中寻找水平线。(请参见下面的示例。)
我现在的问题是找到一种方法来准确快速地计算那种“频谱图”。作为一个数量级,我希望能够在几分钟内在 4GB 文件中找到宽度为 2048 的 RGBA 图像(每行 8192 字节)。这意味着每秒处理几十 MB。
我尝试使用 FFT 和自相关,但它们没有显示出我所追求的那种准确性。
FFT的问题
由于查找大部分重复模式的长度看起来像查找频率,因此我尝试使用 1 字节 = 1 个样本的傅里叶变换并绘制频谱的绝对值。
但主要问题是周期分辨率。因为我有兴趣找到信号的周期(一行像素的字节长度),所以我想在y轴上绘制周期长度的频谱图,而不是频率。但离散傅里叶变换的工作方式是计算1/n的频率倍数(对于n 个数据点)。这给了我在大周期内非常低的分辨率和在短期内高于需要的分辨率。
这是使用此方法在 144x90 RGB BMP 文件上计算的频谱图。我们预计偏移量为 432 处的峰值。FFT 的窗口大小为 4320 字节。
以及第一个数据块的分段图。
我计算出,如果我需要区分周期k和k+1 ,那么我需要一个大约为k²的窗口大小。所以对于 8192 字节,这使得 FFT 窗口大约为 16MB。这太慢了。
因此,FFT 计算了太多我不需要的信息而没有足够的信息。但是给定一个合理的窗口大小,它通常会在大约正确的时期显示一个尖峰。
自相关的问题
我尝试的另一种方法是使用一种离散自相关来绘制频谱图。
更准确地说,我计算的是一个数据块与其一半之间的互相关。并且只计算小块完全在大块内的偏移量。大块的大小必须是要绘制的最大周期的两倍。
这是使用此方法在与以前相同的图像上计算的频谱图示例。
以及第一个数据块的自相关的分段图。
尽管它产生了恰到好处的数据量,但自相关的值变化缓慢,因此不会在正确的时间段内产生尖锐的峰值。
问题
有没有办法在正确的周期附近获得一个尖锐的峰值和在大周期周围足够的精度?通过调整上述算法或使用完全不同的算法。