Извлечение скриншотов из дампов оперативной памяти
Некоторые классические проблемы безопасности/взлома включают необходимость анализа дампа физической оперативной памяти системы. volatility отлично справляется с извлечением полезной информации, в том числе с проводным просмотром окон, отображаемых в данный момент (используя команду скриншот). Но я хотел бы пойти дальше и найти фактическое содержимое окон.
Поэтому я хотел бы переформулировать проблему как поиск необработанных изображений (думаю, матрица пикселей) в большом файле. Если я смогу это сделать, я надеюсь найти содержимое окон, хотя бы частично.
Моя идея заключалась в том, чтобы полагаться на тот факт, что ряд пикселей похож на следующий. Если я нахожу достаточно большое количество строк одинакового размера, я позволяю пользователю возиться с интерактивным инструментом и смотреть, декодирует ли он что-нибудь интересное.
Для этого я вычислил своего рода спектрограмму. Более точная тепловая карта, где тень показывает, насколько вероятно это для блока данных #x быть частью изображения шириной y байт, с x и y осями спектрограммы. Тогда мне просто нужно было бы искать в нем горизонтальные линии. (См. примеры ниже.)
Проблема, с которой я столкнулся сейчас, состоит в том, чтобы найти метод для точного и быстрого вычисления такого рода спектрограммы. По порядку, я хотел бы иметь возможность находить изображения шириной 2048 в RGBA (8192 байта на строку) в файле размером 4 ГБ за несколько минут. Это означает обработку нескольких десятков МБ в секунду.
Я пытался использовать БПФ и автокорреляцию, но они не показывают той точности, которая мне нужна.
Проблема с БПФ
Поскольку нахождение длины в основном повторяющегося паттерна похоже на нахождение частоты, я попытался использовать преобразование Фурье с 1 байтом = 1 выборке и построить абсолютное значение спектра.
Но главная проблема — разрешение периода. Поскольку мне нужно найти период сигнала (длина строки пикселей в байтах), я хочу построить спектрограмму с длиной периода по оси y, а не по частоте. Но способ работы дискретного преобразования Фурье заключается в том, что оно вычисляет частоты, кратные 1/n (для n точек данных). Это дает мне очень низкое разрешение для больших периодов и более высокое, чем необходимо, разрешение для коротких периодов.
Вот спектрограмма, рассчитанная с помощью этого метода для файла RGB BMP размером 144x90. Мы ожидаем пик по смещению 432. Размер окна для БПФ составил 4320 байт.
И сегментный график первого блока данных.
Я подсчитал, что если мне нужно различать периоды k и k+1, то мне нужен размер окна примерно k². Таким образом, для 8192 байт размер окна БПФ составляет около 16 МБ. Что было бы слишком медленно.
Таким образом, БПФ вычисляет слишком много информации, которая мне не нужна, и недостаточно информации, которая мне понадобится. Но при разумном размере окна он обычно показывает резкий пик примерно в нужный период.
Проблема с автокорреляцией
Другой метод, который я пробовал, — это использование дискретной автокорреляции для построения спектрограммы.
Точнее, я вычисляю взаимную корреляцию между блоком данных и его половиной. И вычисляйте его только для смещений, где маленький блок полностью находится внутри большого блока. Размер большого блока должен быть в два раза больше, чем максимальный период для построения.
Вот пример спектрограммы, рассчитанной этим методом на том же изображении, что и раньше.
И сегментный график автокорреляции первого блока данных.
Несмотря на то, что он выдает нужное количество данных, значение автокорреляции изменяется медленно, поэтому не возникает резкого пика для нужного периода.
Вопрос
Есть ли способ получить как острый пик, так и правильный период и достаточную точность для больших периодов? Либо подправив упомянутые алгоритмы, либо используя совершенно другой.