TURBO PASCAL |
Новости
|
6.3.1. Заголовок исполняемых файловКакую именно информацию о незараженном файле следует сохранять? Для ответа на этот вопрос необходимо знать соглашение ДОС о формате исполняемых файлов. Как известно, существуют два формата: СОМ и ЕХЕ. Любая программа, обрабатываемая системой Турбо Паскаль версии 4.0 и выше, может быть оттранслирована только в ЕХЕ—фа&л, поэтому все дальнейшие рассуждения относятся именно к этому формату. В начале ЕХЕ— файла располагается заголовок, в котором содержится вся информация, необходимая для преобразования дискового файла в готовую к работе программу. Первые 28 байт заголовка соответствуют следующей структуре данных: type HeadExeType = record Sign Word; {Признак ЕХЕ-файла} PartPag Word; {Часть неполного сектора в конце файла} PageCnt Word; {Количество секторов, включая неполный} ReloCnt Word; {Количество элементов в таблице перемещения} HdrSize Word; {Длина заголовка в параграфах} MinMem Word; {Минимальный размер кучи (в параграфах)} MaxMem Word; {Максимальный размер кучи (в параграфах)} ReloSS Word; {Начальное значение сегмента стека SS} ExeSP Word; {Начальное значение указателя стека SP} ChkSum Word; {Контрольная сумма всех слов файла} ExelP Word; {Смещение точки запуска программы} ReloCS Word) {Начальное значение сегмента кода CS}; TablOff Word; {Смещение первого элемента таблицы перемещения} Overlay Word; {Номер оверлея или 0 для основной программы) end; {HeadExe} Остальные элементы заголовка содержат так называемую таблицу перемещения, предназначенную для настройки адресов загруженной программы. Таблица начинается с байта TablOff от начала файла и содержит ReloCnt четырехбитных элементов следующего вида: type ReloTablItem = record ItemSeg: Word; {Сегмент перемещаемого адреса} ItemOfs: Word; {Смещение перемещаемого адреса) end; Признак ЕХЕ— файла хранится в поле Sign в виде символов «MZ» (код $5A4D) — с этого признака должен начинаться любой ЕХЕ—файл. Поле HdrSize содержит длину всего заголовка в параграфах (участках памяти длиной по 16 байт каждый). Поля PartPag и PageCnt определяют общую длину загружаемой в память части ЕХЕ— файла по следующей формуле: L = (PageCnt-1)*512 + PartPag - HdrSize*16 Остальная часть файла (длина ЕХЕ— файла может быть больше L+HdrSize*16) при загрузке программы не учитывается. Обычно в остатке файла, созданного системой Турбо Паскаль, (если, разумеется, есть остаток) содержится информация, используемая встроенным отладчиком, или оверлеи. Подавляющее большинство ЕХЕ— вирусов пристыковывает свою программу в конец файла, а для того чтобы эта программа была загружена в память и ей было передано управление, изменяет поля PartPag, PageCnt, ReloCS, ExelP 1адрес точки, куда передается управление после окончания загрузки) и, возможно, некоторые другие поля. При таком способе внедрения общая длина загружаемой в память части файла должна составлять ExeSize => FileSize + VirusSize, •-де FileSize — полная длина ЕХЕ— файла, a VirusSize — длина программы ви руса. Так как в остатке фала могут храниться оверлеи (или архив для сам>- — разгружающихся архивных программ), длина ExeSize может оказаться чрезмерно большой, так что программа не сможет загрузиться в память или не сможет работать нормальным образом. Некоторые безграмотно написанные вирусы не учитывают это обстоятельство и быстро выдают себя, т.к. зараженные программы перестают работать. Другой способ внедрения вируса — пристыковка кода вируса до начала загружаемой части программы и сразу за заголовком файла (см. рис.6.1).
а) б) в) L - загружаемая в память часть файла Рис.6.1. Варианты внедрения вируса в тело файла: а) незараженный файл; б) вирус в конце файла; вирус в начале файла; в) вирус в середине файла Такой способ внедрения позволяет не загружать в память весь ЕХЕ—фа&л, а длина загруженной программы увеличивается только на мину кода вируса. Несмотря на кажущееся преимущество такого способа, он используется достаточно редко. Его реализация значительно сложнее, так как перед передачей управления основной программе вирус должен перенести 256 байт префикса программного сегмента (Р5Р) в конец собственного кода так, чтобы они непосредственно предшествовали телу программы — в противном случае будет нарушена важная связь программы с PSP или относительная адресация в самой программе. Кроме того, в процессе заражения он должен увеличить на величину VirusSize поле ItemOfs каждого элемента таблицы перемещения и абсолютного адреса, указываемого этим элементом. В отличие от стандартного загрузчика ДОС вирусу приходится корректировать не загруженную программу, а ее файловый образ. Так как в ЕХЕ— программе средней сложности может бытп несколько сотен элементов таблицы перемещения, процесс настройки таблицы вирусом приводит к заметному увеличению времени запуска программы, что может обнаружиться пользователем. На этапе размножения вирусы стремятся по возможности скрыть от пользователя результат своей деятельности, поэтому ЕХЕ— файлы редко поражаются вирусами, пристыко— ванными в начало файла. Разумеется, существует возможность внедрения вируса непосредственно в тело исполняемой программы. Однако на практике это почти всегда означает разрушение логики работы программы, поэтому такой вирус немедленно обнаруживается. Анализ сказанного позволяет сделать важный вывод: практически любой существующий вирус (или вирус, который еще только будет создан!), рассчитанный на поражение ЕХЕ— файла, пристыковывает свой код в конец файла и изменяет его заголовок. Следовательно, для контроля факта заражения программы и ликвидации вируса необходимо где-то сохранить заголовок файла и его эталонную длину и периодически сопоставлять действительный заголовок и длину с эталонными значениями. При этом следует учитывать то обстоятельство, что некоторые вирусы контролируют любое обращение к дисковым секторам, в которых расположена их программа, и «подсовывают» незара— женные копии этих секторов. Такие вирусы (их называют вирусы — невидимки) вряд ли удастся обнаружить с помощью стандартного обращения к функциям ДОС. Для борьбы с ними используют прямое обращение к BIOS— прерыванию $13 подобно тому, как это реализовано в программе ANTIVIR (см. п.6.3.6). |
(с)Все права защищены По всем интересующим вопросам прошу писать на электронный адрес |