7. Пишем кодВ исполняемый файл добавляем код вируса. Этим действием мы увеличиваем "длину" файла на "длину" вируса. Если такой файл запустить, то, скорее всего, вы увидите сообщение о том, что файл не является приложением под винду. Это происходит из-за того, что длина файла больше, чем та, которая указана в заголовке. Если мы увеличим величину Size of Image на длину вируса (которую выровняем на SectionAlignment), то опять получим сообщение об ошибке. В чём же дело, ведь все поля заголовка исправлены на нужные? Дело в том, что в файле есть ещё несколько структур, которые надо пофиксить.
РЕ файл поделен на секции (секция кода, данных...). Для каждой секции есть структура, которая описывает её (object entry). Все структуры находятся одна за другой за заголовком и имеют такой формат:
Object Entry: = 28h bytes
RVA Size Name Description
00h 8 байт Object Name Имя объекта (секции)
08h DWord Virtual Size Виртуальный размер секции (в памяти)*
0Ch DWord Section RVA RVA секции (в памяти, относительно Image Base)*
10h DWord Рhysical Size Физический размер секции (в файле)*
14h DWord Physical Offset Физическое смещение (в файле, относительно его начала)*
18h 12 байт Reserved В EXE не используется (для OBJ)
24h DWord Object Flags Битовые флаги секции*
Я пометил * те поля, которые нас больше всего интересуют. Виртуальный размер секции - это размер секции (когда она загружена в памяти), выравненный по SectionAlignment. Если мы записали в последнюю секцию код, то должны увеличить это поле для последней секции (не для каждой секции). Кстати, загрузчик контролирует выполнение равенства HeaderSize+Summa(VirtualSize[i],i)=Size Of Image (все значения выровнять по SectionAlignment)
Section RVA - это адрес (RVA относительно ImageBase) начала секции, когда она загружена в память. Используется для нахождения новой точки входа
Physical Size - размер секции, когда она в файле. Выровненное по File Alignment. Должно быть увеличено на длину виря, выровненную по File Alignment
Physical Offset - смещене cекции относительно начала файла. Используем для поиска секции в файле.
Object Flags - флаги. Могут иметь следующие значения или их комбинацию.
Object Flags:
*00000020h Секция содержит программный код
00000040h Секция содержит инициализированные данные
00000080h Секция содержит неинициализированные данные
*20000000h Секция является исполняемой (см. флаг 00000020h)
40000000h Секция только для чтения
*80000000h Секция может использоваться для записи и чтения
Мы же будем устанавливать это поле в 0A0000020h (это комбинация отмеченных полей). Кстати pewrsec.exe, который я прикрепил в начале туториала, изменяет флаги всех секций на 0A0000020h, что позволяет нам работать с переменными, которые находятся в секции кода (и чего на него так ругаться?). Если боитесь использовать эту программу, то можете сделать для этого свою (когда мы закончим писать вирус вы будете в состоянии это сделать самостоятельно, хотя по просьбам трудящихся могу накодить и выложить код).