Если в первой части мы говорили о заголовках, то теперь настало время заглянуть внутрь самого бинарника и разобраться с его составляющими.
📎 Таблица секций «Image Section Table»
Разберёмся, что такое секции и страницы, и как они взаимодействуют. Оказывается, компиляторы определяют размер секции как 512 байт, а размер страницы в виртуальной памяти ОС – 4 КБ. Такая двойственность создаёт сложности для системного загрузчика, но об этом – подробнее в статье.
✉️ Сколько секций может быть в PE-файле?
Ограничение на количество секций? В спецификации PECOFF об этом ничего не сказано, но есть мнение, что на NT4 был лимит в 96 секций. Мы проверим это на практике, создав приложение с максимально возможным количеством секций. Используя макросы ассемблера FASM, мы создадим до 55 000 секций и посмотрим, как на это реагируют различные инструменты и отладчики.
🎮 Проецирование одной секции на две страницы
Мы также рассмотрим интересный приём – проецирование одной секции сразу на несколько виртуальных страниц. Этот трюк когда-то ставил в тупик большинство дизассемблеров, но со временем они научились с этим справляться. Тем не менее, возможность такая есть, и мы её подробно разберём.
Мы создадим нуль-пространственный туннель между двумя страницами, когда изменения в одной странице будут мгновенно отображаться на другой. Это можно использовать для сокрытия критически важных блоков кода, например, процедур проверки контрольных сумм или паролей.
📌 Практика!
Для демонстрации мы напишем простой код проверки пароля и изменим Raw-адрес секции, чтобы проверить, как системный загрузчик справится с проецированием. Мы увидим, что изменения в одной странице отображаются в другой, подтверждая теорию.
К теме импорта мы вернёмся в следующей части. Импорт в PE-файлах – это сложная и запутанная тема, требующая отдельного внимания. Не пропустите!
⬇️ Читать подробнее
