SizeOfImage

Изменение размера образа

Дамп - содержимое рабочей памяти процесса, ядра или всей операционной системы в определённый момент времени. Дамп - это снимок памяти, который записывается на носитель. Дамп - это очень мощное оружие в умелых руках. Дамп помогает против зашифрованных программ, ибо "сфотографировать" память можно в любой момент, в то время, как перед тем как инструкция выполнится она должна быть расшифрована.
Дампер - инструмент-программа, который делает "снимок" памяти.

SizeOfImage - размер образа, показывает (в байтах), какое количество памяти должно быть выделено в адресном пространстве для загрузки образа исполняемого файла. Это сумма длин всех секций бинарного (исполняемого байта).

Определяется по формуле:
SizeOfImage = VirtualOffset последней секции + VirtualSize последней секции.

Очень интересный метод предложил volodya в статье "Об упаковщиках в последний раз" на wasm.ru. Этот метод заключается в изменении размера образа, таким образом, чтобы дампер обращался к несуществующим страницам памяти. В этом случае дампер "рухнет". Информация о размере модуля храниться в PEB структуре (а также поле SizeOfImage можно найти в PE-заголовке файла).
Такой прием препятствует доступу к процессу, мешает отладчику присоединиться к процессу.

Однако легко обойти эту уловку можно даже из пользовательского режима. Просто игнорируем значение SizeOfImage, и вместо этого вызываем функцию VirtualQuery(). Она возвращает число последовательных страниц виртуального адресного пространства с одинаковыми атрибутами. В памяти не может быть промежутка между секциями и страницы памяти могут быть подсчитаны, начиная с первой страницы после конца предыдущего диапазона. Подсчет начинается со страницы ImageBase (базовый адрес образа) и продолжается, пока возвращается тип MEM_IMAGE. Страница, которая не имеет тип MEM_IMAGE, не относится к файлу.

Обратно к содержанию

Пока не указано иное, содержимое этой страницы распространяется по лицензии Creative Commons Attribution-ShareAlike 3.0 License