Заголовок DOS
Сигнатура “MZ”
Смещение
основного
заголовка
Все остальные поля в
Windows игнорируются
IMAGE_FILE_HEADER
Сигнатура “PE00”
Число секций (1)
Смещение заголовка
первой секции
Заголовок PE занимает
неиспользуемые поля
заголовка DOS
IMAGE_OPTIONAL_HEADER
Адрес точки
входа (0x1038)
Неиспользуемое поле BaseOfData
служит полем заголовка DOS
Число записей
в каталоге (3)
DataDirectory[3]
Адрес таблицы
импорта (0x1128)
Используется только элемент
#1 – таблица импорта
Размер таблицы
импорта (0x28)
Когда включён DEP,
LdrpCheckForSecuROMImage
читает ещё и элемент #6
(таблицу отладочной
информации), не проверяя
размер каталога
Таблица импорта
Адрес читаемой
цепочки (0x106c)
Из 0x28 байтов
таблицы в файле
хранятся только
0x12 – остальные
при загрузке
будут заполнены
нулями
Адрес имени
библиотеки (0x02)
Адрес записыва-
емой цепочки
(тот же самый)
Имя библиотеки занимает
неиспользуемые поля
заголовка DOS
Цепочка импорта
Цепочка занимает поля
SizeOfStackReserve и SizeOfStackCommit
заголовка PE; в ней всего один импорт
Адрес записи, состоящей из
двухбайтного hint-а, за которым
следует имя импортируемой функции
Нулевой
адрес
замыкает
цепочку
IMAGE_SECTION_HEADER
Размер данных в файле (0x139) – вместе
со смещением (0x1) должен не превышать
фактический размер файла (0x13a)
Смещение данных в файле
(должно быть ненулевым,
но округляется до кратного
0x200, т.е. до нуля)
Адрес загрузки
секции (0x1000)
Размер секции в
памяти (0x3000)
Исполнимый код
Три куска кода помес-
тились в неиспользуемых
полях заголовка PE
Ещё три куска поместились
в полях заголовка секции
Простейший ГСЧ (RANDU)
mov ebp, 41014h
(впоследствии ebp
используется и для
вызова ГСЧ, и для
доступа к данным)
Функция занимает поля
TimeDateStamp,
PointerToSymbolTable и
NumberOfSymbols в
заголовке PE
В качестве seed ГСЧ
использует поля Magic и
LinkerVersion заголовка PE
Данные в полях заголовка
В полях SizeOfStackCommit
и SizeOfHeapReserve –
аргумент SMALL_RECT для
WriteConsoleOutput
В полях
OperatingSystemVersion
и ImageVersion – массив
используемых цветов
(четыре пары байт)
В поле SizeOfStackReserve
– аргумент dwBufferSize

Digital Rain

  • 1.
  • 2.
    IMAGE_FILE_HEADER Сигнатура “PE00” Число секций(1) Смещение заголовка первой секции Заголовок PE занимает неиспользуемые поля заголовка DOS
  • 3.
    IMAGE_OPTIONAL_HEADER Адрес точки входа (0x1038) Неиспользуемоеполе BaseOfData служит полем заголовка DOS Число записей в каталоге (3)
  • 4.
    DataDirectory[3] Адрес таблицы импорта (0x1128) Используетсятолько элемент #1 – таблица импорта Размер таблицы импорта (0x28) Когда включён DEP, LdrpCheckForSecuROMImage читает ещё и элемент #6 (таблицу отладочной информации), не проверяя размер каталога
  • 5.
    Таблица импорта Адрес читаемой цепочки(0x106c) Из 0x28 байтов таблицы в файле хранятся только 0x12 – остальные при загрузке будут заполнены нулями Адрес имени библиотеки (0x02) Адрес записыва- емой цепочки (тот же самый) Имя библиотеки занимает неиспользуемые поля заголовка DOS
  • 6.
    Цепочка импорта Цепочка занимаетполя SizeOfStackReserve и SizeOfStackCommit заголовка PE; в ней всего один импорт Адрес записи, состоящей из двухбайтного hint-а, за которым следует имя импортируемой функции Нулевой адрес замыкает цепочку
  • 7.
    IMAGE_SECTION_HEADER Размер данных вфайле (0x139) – вместе со смещением (0x1) должен не превышать фактический размер файла (0x13a) Смещение данных в файле (должно быть ненулевым, но округляется до кратного 0x200, т.е. до нуля) Адрес загрузки секции (0x1000) Размер секции в памяти (0x3000)
  • 8.
    Исполнимый код Три кускакода помес- тились в неиспользуемых полях заголовка PE Ещё три куска поместились в полях заголовка секции
  • 9.
    Простейший ГСЧ (RANDU) movebp, 41014h (впоследствии ebp используется и для вызова ГСЧ, и для доступа к данным) Функция занимает поля TimeDateStamp, PointerToSymbolTable и NumberOfSymbols в заголовке PE В качестве seed ГСЧ использует поля Magic и LinkerVersion заголовка PE
  • 10.
    Данные в поляхзаголовка В полях SizeOfStackCommit и SizeOfHeapReserve – аргумент SMALL_RECT для WriteConsoleOutput В полях OperatingSystemVersion и ImageVersion – массив используемых цветов (четыре пары байт) В поле SizeOfStackReserve – аргумент dwBufferSize